티스토리 뷰

요약

3. 함수

함수 당 추상화 수준은 하나로

함수가 한 가지 작업만 하려면 함수 내 모든 문장의 추상화 수준이 동일해야 한다.

 

내려가기 규칙

위에서 아래로 코드를 읽으면 함수 추상화 수준이 한 번에 한 단계씩 낮아진다. 즉, 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 온다.

조건문 (Switch문 또는 if/else 문)

작게 만들기 어려운 조건문 같은 경우 저차원 클래스에 숨기고 다형성(polymophism)을 이용해 절대 반복하지 않는 방법이 있다.

좀더 자세하게 말하면, switch나 if/else 같은 구문을 추상 팩토리 안에 넣어, 파생 클래스를 만들어 인스턴스의 함수로 실행하는 형태로 만들 수 있다.

 

서술적인 이름 사용하기

길고 서술적인 이름 > 짧고 어려운 이름

여러 단어가 쉽게 읽히고 함수 기능을 잘 표현하는 명명법을 채택한다.

이름에는 일관성이 있어야 한다.

 

함수 인수

인수 개수

함수의 인수는 적가나 없는 것이 좋다.(예. 무항 > 단항 > 이항 > 삼항 > 다항)

인수가 필요한 경우: 각각의 인수가 자연적인 순서가 있거나 하나의 값을 표현하는 경우

예. const p: Point = new Point(0, 0);

삼항 함수를 만들 땐 인수를 이해하기 어렵기 때문에 신중하게 고려하면서 작성해야 한다.

여러 인수를 묶어 하나의 클래스 변수로 선언하여 표현하는 방법으로 줄일 수 있다.

 

인수의 종류

입력 인수가 없는 경우가 가장 좋고, 차선은 입력 인수가 1개뿐인 경우다.

가변 인수를 취하는 함수도 단항, 이항, 삼항 함수로 취급하되 그 이상은 지양한다.

단항 함수는 함수와 인수가 동사/명사 짱을 이뤄야 한다.

write(name) (○)
writeField(name) (◎)

 

부수효과 막기

예상치 못한 행동을 하는 함수는 부수효과 문제가 된다.

시간적 결합이나 순서 종속성을 초래할 수 있다.

만약 시간적 결합이 필요하다면 함수 이름에 분명히 명시한다.

출력 인수는 피해야 하며, 함수에서 상태를 변경해야 한다면 함수가 속한 객체 상태를 바꾸는 방식을 택한다.

 

 

 

발췌

코드를 읽으면서 짐작했던 기능을 각 루틴이 그대로 수행한다면 꺠끗한 코드라 불러도 되겠다”

함수가 작고 단순할수록 그만큼 서술적인 이름을 고르기 쉽니다. 이름을 짓기 어렵다면 해당 함수가 한 가지만 하는 지 확인해 볼 필요가 있다.

이름을 정하느라 시간을 들여도 괜찮다 (중략) IDE를 사용해 이런 저런 이름을 시도한 후 최대한 서술적인 이름을 골라도 좋겠다.

함수의 이름을 짓는 건 코드를 잘 짜는 것만큼 정말 매우 중요하면서도 쉬운 일은 아니다.

 

 

 

메모

최근에 findOrCreateSecretCode로 함수이름을 지었는데, 처음엔 한 함수에 여러 기능을 하기 때문에 깨끗한 코드가 아니라고 판단했다. 그러나 하나의 작업을 한다는 게 솔직히 바로 와닿지는 않아 보다 많은 코드를 접하면서 추상적인 수준에서 한 가지만 할 수 있도록 짜야겠다.

단항 함수를 가끔적 피하라는 문단에서 이벤트 함수나 특정 함수의 사례를 이야기하는데, Java가 주 언어가 아닌지라 솔직히 100% 흡수는 안 된다. 그럼에도 저자의 맥락을 파악하는 방향으로 읽어나가고 있다.

무항 함수가 좋다는 말은 개인적으로 충격적인데 현실적으로 0개 인수만 사용하긴 어렵다고 생각한다.

 

댓글