프로그래밍 초식 : 왕 파라미터

Donghun Seol·2023년 4월 25일
0

프로그래밍 초식

목록 보기
4/13

레퍼런스

가끔 만나는 코드

function update(data: BigDataObj): void {
	s : Some = getSome(data)
    data.setKey(s.getKey())
    otherBigData.update(data)
    anyDao.insert(data)
}

만약 anyDao.insert()에 추가 값이 필요하면?
-> BigDataObj 클래스에 추가적인 필드 추가
만약 otherDato.update()에 추가 값이 필요하면?
-> BigDataObj 클래스에 또 추가적인 필드 추가 하면된다.

모든게 들어있는 객체를 활용하면 당장은 편하다...

코드양도 줄고, 객체 전체를 파라미터로 던지니깐 실수로 데이터를 빠트리지도 않는다. 게다가 참조형 자료이므로 포인터만 전달하니까 성능도 크게 나빠지지 않을것 같은데?

( ... 그러나 문제는 항상 시간이 흐른 뒤 발생)

몇 주 뒤 다시 위와 같은 코드를 본다면

  1. 내가 작성했지만 메서드와 필드간 매핑을 망각한 상태이므로
  2. 각 메서드에서 어떤 값을 사용하는지 알 수 없고
  3. 데이터 흐름을 파악하려면 일일이 메서드 내부를 들여다봐야 한다.

메서드에 맞는 간결한 파라미터를 사용해야 함.

메서드가 어떤 파라미터를 사용하는지 명확해진다.
데이터 흐름을 직관적으로 추적할 수 있다.

아래와 같이 파라미터를 쪼개서 필요한 파라미터만 전달한다.
모든 데이터가 들어있는 큰 객체를 한번에 던지는건 피하자.
전달해야할 파라미터가 많으면 타입을 추가로 선언하고 해당 타입에 맞게 객체를 재구성해서 전달.

며칠 뒤에 코드를 다시 볼 때 쉽게 이해가능하여, 개발비용(==시간)을 낮춰준다.

nest.js의 컨트롤러를 구현할 때 나는 dto를 통째로 서비스 메서드에 전달하고 싶었지만, 공식문서의 예시는 구조분해할당을 통해 꼭 필요한 파라미터만 추출 후 전달하는 방식이었다.

type DaoParams = {
  id: string;
  date: Date;
  status: boolean;
}

function update(data: BigDataObj): void {
	s: Some = getSome(data.someProperty)
    data.setKey(s.getKey())
    otherBigData.update(data.id, data.someOtherProperty)
    
    const anyDaoParam:DaoParams = { id: data.id, date: data.createdAt, status:data.status }
    anyDao.insert(danyDaoParam)
}
profile
I'm going from failure to failure without losing enthusiasm

1개의 댓글

comment-user-thumbnail
2023년 5월 13일

sample mocking comment for api test

답글 달기