냄새 4. 긴 매개변수 목록

  • 어떤 함수에 매개변수가 많을수록 함수의 역할을 이해하기 어려워진다.
    • 과연 그 함수는 한가지 일을 하고 있는게 맞는가?
    • 불필요한 매개변수는 없는가?
    • 하나의 레코드로 뭉칠 수 있는 매개변수 목록은 없는가?
  • 어떤 매개변수를 다른 매개변수를 통해 알아낼 수 있다면, "매개변수를 질의 함수로 바꾸기"를 사용할 수 있다.
  • 기존 자료구조에서 세부적인 데이터를 가져와서 여러 매개변수로 넘기는 대신, "객체 통째로 넘기기"를 사용할 수 있다.
  • 일부 매개변수들이 대부분 같이 넘겨진다면, "매개변수 객체 만들기"를 적용할 수 있다.
  • 매개변수가 플래그로 사용된다면, "플래그 인수 제거하기"를 사용할 수 있다.
  • 여러 함수가 일부 매개변수를 공통적으로 사용한다면 "여러 함수를 클래스로 묶기"를 통해 매개변수를 해당 클래스의 필드로 만들고 메서드에 전달해야 할 매개변수 목록을 줄일 수 있다.

리팩토링 14. 매개변수를 질의 함수로 바꾸기

  • 함수의 매개변수 목록은 함수의 다양성을 대변하며, 짧을수록 이해하기 좋다.
  • 어떤 한 매개변수를 다른 매개변수를 통해 알아낼 수 있다면 "중복 매개변수"라 생각할 수 있다.
  • 매개변수에 값을 전달하는 것은 "함수를 호출하는 쪽"의 책임이다. 가능하면 함수를 호출하는 쪽의 책임을 줄이고 함수 내부에서 책임지도록 한다.
  • "임시변수를 질의 함수로 바꾸기"와 "함수 선언 변경하기"를 통해 이 리팩토링을 적용한다.
Warning

매개변수를 줄이는 것이 반드시 옳은 방법은 아니다! 매개변수를 줄이는 과정에서 의존성이 지나치게 증가한다면 오히려 안좋은 결과를 낳기도 한다. 심지어 리팩토링 기법에는 서로 상반되는 기법도 존재한다. 이는 상황에 따라 어느것이 좋은지는 알 수 없다는 것이다. 따라서 상황에 맞게 적절한 리팩토링 기법을 중요하는 것이 중요하다.

리팩토링 15. 플래그 인수 제거하기

보통 플래그가 너무 많다는것은 하나의 메소드가 너무 많은 역할을 한다는 것을 의미한다.

플래그를 사용해서 파라미터를 전달하는 메소드는 그 플래그 값으로 무엇은 하는지 메소드를 찾아가서 봐야한다.

리팩토링 16. 여러 함수를 클래스로 묶기

  • 비슷한 매개변수 목록을 여러 함수에서 사용하고 있다면 해당 메소드를 모아서 클래스를 만들 수 있다.
  • 클래스 내부로 메소드를 옮기고, 데이터를 필드로 만들면 메소드에 전달해야하는 매개변수 목록도 줄일 수 있다.