[클린코드] 매개변수의 개수
가장 이상적인
함수의 매개변수 개수는 몇 개일까?
답은 '0'개이다.
만약 매개변수를 1개, 2개, 3개로 늘리려면
'어쩔 수 없는 특별한 이유'가 필요하다.
함수는 X(매개변수)를 받아
처리(f)하고 Y(결과)를 반환(return)한다.
매개변수가 많아질수록
다양한 경우의 수가 발생한다.
매개변수의 증가는
함수를 검증하고 테스트하는데
복잡도를 증가시킨다.
그러므로 매개변수는 최대한 줄이는 것이 옳다.
그럼 로버트 C. 마틴이 말하는
어쩔 수 없는 특별한 이유가 무엇인지 알아보자.
매개변수가 하나인 경우
매개변수가 하나인 경우는 3가지가 있다. 3가지를 제외하고는 가급적 피하는 것이 좋다.
1. 정보를 '조회'하는 경우 ( 조회 )
2. 데이터를 '변환'하는 경우 ( 명령 )
3. 이벤트 함수인 경우
조회는 X(입력인수) → f → Y (boolean; 참 혹은 거짓) 이다.
변환은 X(입력인수) → f → Y (다른 객체) 이다.
1. 정보를 '조회'하는 경우 ( Yes or No )
어떤 배열이 비워져있는가? ( isFull )
어떤 배열이 꽉찼는가? ( isEmpty )
어떤 파일이 존재하는가? ( isExisted )
어떤 객체의 정보 체크를 위해 해당 객체를 매개변수로 갖는다. 이때 질문의 반환값으로 boolean형이 자주 쓰인다. ( YES = TRUE , NO = FALSE )
Ex)
- boolean isFileExisted( File file )
- boolean isFull ( Stack stack )
- boolean isEmpty ( Stack stack )
2. 데이터를 '변환'하는 경우
public InputStream fileOpen( "Myfile" ) {
//.....
}
fileOpen은 매개변수로 받은 String형 파일이름(Myfile)을 InputStream 객체로 변환한 후 반환하는 함수이다.
3. 이벤트 함수인 경우
public void onClick(View v) {
//....
}
이벤트 함수는 이벤트가 일어나는 대상을 인수로 받고 이벤트 발생을 처리하는 함수이다. 인수로는 입력인수가 오고 출력인수는 오지 않는다. ( 출력인수에 대해서는 아래 포스팅 참고 )
매개변수가 두 개인 경우
두 개의 매개변수를 가지려면 두 매개변수는 서로 관련있어야 한다.
Point p = new Point( 100, 405 );
100과 405는 좌표점을 나타내는 값이다. 두 매개변수가 사실상 하나의 값을 나타내는 것이다.
- writeField(outputStream, name);
outputStream 객체와 name 객체가 서로 연관이 없다. field를 write한다는데 name을 write한다는 건지 outputStream의 용도는 무엇인지 코드를 보고 확실히 알 수 없다. 이런 경우 outputStream 객체의 구성원으로 writeField 메소드를 넣어주면 된다.
- outputStream.writeField(name);
outputStream 객체의 name 필드를 매개변수로 받아 write하겠다는 의도가 코드를 통해 한번에 읽혀진다.
매개변수가 세 개인 경우
삼항 함수 또한 마찬가지이다. 코드를 읽을 때 한 눈에 용도 파악이 가능하도록 연관성 있는 세 개의 매개변수를 사용해야한다.
- makeCircle ( double x, double y, double radius );
정리
매개변수를 한 개인 경우 분명한 목적이 있어야 한다. 조회나 변환의 목적없이 매개변수를 늘리면 혼란이 가중된다. 매개변수를 2-3개 쓸 때는 서로 연관성이 있어야 한다. 서로 관련 없는 매개변수는 가독성을 떨어트리고 혼란을 만든다. 가장 클린한 코드는 한눈에 용도를 파악할 수 있는 코드임을 기억해야 한다. 매개 변수는 혼란을 만드는 원인 중 하나로 최대한 줄이는 것이 좋다.