나는 주로 자바스크립트를 사용해 코드를 작성하기 때문에 함수를 굉장히 많이 사용하게 된다. 이번 장을 통해서 좋은 함수의 원칙에 대해 알아보자.
작게 만들어라
함수를 만드는 첫째 규칙은 '작게!'다. 함수를 만드는 둘째 규칙은 '더 작게!'다.
20줄의 함수도 길다. 2~4줄을 가진 함수로 프로그램을 구현해보자. 각 함수가 하나의 이야기를 하게 된다.
블록과 들여쓰기
if 문, else 문, while 문에 들어가는 블록은 한 줄이어야 한다.
function purchase(wallet) {
if (wallet.getMoney() >= 3000) {
wallet.pay(3000);
}
}
위의 코드처럼 if 문 안에서 동작하는 것을 하나의 함수로 요약하자.
한 가지만 해라!
함수는 한 가지를 해야 한다. 그 한 가지를 잘해야 한다. 그 한 가지만을 해야 한다.
함수는 이름 아래에 추상화 수준이 하나여야 한다. 정말 어려운 말이라고 생각했다. 그동안 함수를 만들면서 추상화 수준에 대해 생각해보지 않았는데, 예제를 보니 확실히 하나의 추상화 수준을 가진 코드가 읽기 쉬웠다. 추상적인 함수에서 아래로 갈 수록 구체적인 함수로 변화되도록 함수를 작성하면 가독성이 크게 향상될 것 같다.
- 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업만 한다고 말할 수 있다.
- 함수를 다른 의미 있는 이름으로 함수를 추출할 수 있다면 그 함수는 여러가지 일을 하는 함수다.
- 함수를 여러 섹션으로 나눌 수 있다면 그 함수는 여러가지 일을 하는 함수다.
Switch 문
switch 문은 작게 만들기 어렵다. 또한 한 가지 작업만 하는 switch 문을 만들기도 어렵다. 본질적으로 switch 문은 여러가지 일을 처리하기 때문에 지양하는 것이 좋다. 하지만 완전히 피할 방법은 없기 때문에 다형성을 이용해 숨기고, 반복하지 않는 방법을 사용하자. 되도록 다형적 객체를 생성하는 코드 안에서만 switch 문을 사용하는 것이 좋지만, 이 규칙을 완벽히 지키기는 어렵다.
함수 인수
함수에서 이상적인 인수 개수는 0개이고, 다음은 1개, 다음은 2개, 3개는 마지막 수단, 4개 이상은 특별한 이유가 없다면 사용하지 않는 것이 좋다. 그리고 플래그 인수는 이 책의 저자가 추하다고 표현하고 있다. 플래그 함수가 있다는 것 자체가 여러가지 일을 처리한다는 뜻이 된다.
부수 효과를 일으키지 마라!
이 부분에서 굉장히 뜨끔했다. 유저의 유효성 검증할 때, 데이터베이스에 저장되어 있는 유저 데이터와, 사용자 입력으로 받은 데이터가 일치하는지 확인 후 세션을 초기화하는 함수가 있다면, 세션을 초기화 하는 것은 부수 효과(Side effect)다. 함수 이름만 보고 세션을 초기화할 것이라고 전혀 예측할 수 없고, 한 가지 일을 하는 것도 아니므로 별도의 함수로 분리해야 한다.
명령과 조회를 분리하라!
함수는 수행하거나(명령), 답하거나(조회) 둘 중 하나만 해야 한다. 객체의 상태를 변경하거나, 객체 정보를 반환하거나 둘 중 하나만 해야 한다.
오류 코드보다 예외를 사용하라!
명령 함수에서 오류 코드를 반환하는 방식은 명령/조회 분리 규칙을 미묘하게 위반한다. 자칫하면 if 문에서 명령을 표현식으로 사용하기 쉬운 탓이다.
반복하지 마라
모든 함수의 기본인 것 같다. 중복을 최대한 없애자. 그럼 수정해야할 사항이 생기면 한 곳만 수정하면 되므로 유지보수가 쉬워진다.
함수를 짜는 법
- 동작하는 함수와 테스트 케이스를 만든다
- 코드를 다듬고, 이름을 바꾸고, 중복을 제거한다
- 이전에 만든 테스트 케이스로 테스트를 한다