긴 매개변수 목록
- 어떤 함수에 매개변수가 많을수록 함수의 역할을 이해하기 어려워진다.
- 과연 그 함수는 한가지 일을 하고 있는게 맞는가?
- 불필요한 매개변수는 없는가?
- 하나의 레코드로 뭉칠 수 있는 매개변수 목록은 없는가?
- 어떤 매개변수를 다른 매개변수를 통해 알아낼 수 있다면, "매개변수를 질의함수로 바꾸기"를 사용할 수 있다.
- 기존 자료구조에서 세부적인 데이터를 가져와서 여러 매개변수로 넘기는 대신 "객채 통째로 넘기기"를 사용할 수 있다.
- 일부 매개변수들이 대부분 같이 넘겨진다면, "매개변수 객체 만들기"를 사용할 수있다.
- 매개변수가 플래그로 사용돤다면, "플래그 인수 제거하기"를 사용할 수 있다.
- 여러 함수가 일부 매개변수를 공통적으로 사용한다면 "여러 함수를 클래스로 묶기"를 통해 매겨변수를 해당 클래스의 필드로 만들고 메서드에 전달해야 할 매개변수 목록을 줄일 수 있다.
1. 매개변수를 질의함수로 바꾸기 - Replace Parameter with Query
- 함수의 매개변수 목록은 함수의 다양성을 대변하며, 짧을수록 이해하기 좋다.
- 어떤 한 매개변수를 다른 매개변수를 통해 알아낼 수 있다면 "중복 매개변수"라 생각할 수 있다.
- 매개변수에 값을 전달하는 것은 "함수를 호출하는 쪽"의 책임이다. 가능하면 함수를 호출하는 쪽의 책임을 줄이고 함수 내부에서 책임지도록 노력한다.
- "임시 변수를 질의 함수로 바꾸기" 와 "함수 선언 변경하기"를 통해 이 리팩토링을 적용한다.
함수 매개 변수를 줄이면서 새로운 의존성이 생긴다면, 이게 맞는 의존성인 지 다시 생각해본다.
2. 플래그 인수 제거하기
- 플래그는 보통 함수에 매개변수로 전달해서, 함수 내부의 로직을 분기하는데 사용한다.
- 플래그를 사용한 함수는 차이를 파악하기 어렵다.
- bookConcert(customer,false), bookConcer(customer,true)
- bookConcert(customer), premiumBookConcert(customer)
- 조건문 분해하기를 활용할 수 있다.
플래그가 너무 많이 들어있다면, 메서드의 책임 너무 많은 것
플래그가 하나가 들어있다면, 메서드의 일이 많아지는 시작점이 될 수 있다.
3. 여러 함수를 클래스로 묶기
- 비슷한 매개변수 목록을 여러 함수에서 사용하고 있다면 해당 메소드를 모아서 클래스를 만들 수 있다.
- 클래스 내부로 메소드를 옮기고, 데이터를 필드로 만들면 메소드에 전달하는 매개변수 목록도 줄일 수 있다.