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 클래스에 또 추가적인 필드 추가 하면된다.
코드양도 줄고, 객체 전체를 파라미터로 던지니깐 실수로 데이터를 빠트리지도 않는다. 게다가 참조형 자료이므로 포인터만 전달하니까 성능도 크게 나빠지지 않을것 같은데?
( ... 그러나 문제는 항상 시간이 흐른 뒤 발생)
몇 주 뒤 다시 위와 같은 코드를 본다면
메서드가 어떤 파라미터를 사용하는지 명확해진다.
데이터 흐름을 직관적으로 추적할 수 있다.
아래와 같이 파라미터를 쪼개서 필요한 파라미터만 전달한다.
모든 데이터가 들어있는 큰 객체를 한번에 던지는건 피하자.
전달해야할 파라미터가 많으면 타입을 추가로 선언하고 해당 타입에 맞게 객체를 재구성해서 전달.
며칠 뒤에 코드를 다시 볼 때 쉽게 이해가능하여, 개발비용(==시간)
을 낮춰준다.
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)
}
sample mocking comment for api test