티스토리 뷰
요약
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개 인수만 사용하긴 어렵다고 생각한다.
'Book' 카테고리의 다른 글
Clean Code (클린코드) | 3. 함수 057-066 (0) | 2023.08.08 |
---|---|
Clean Code (클린코드) | 2. 의미 있는 이름 035-045 (0) | 2023.08.05 |
Clean Code (클린코드) | 2. 의미 있는 이름 024-034 (0) | 2023.08.04 |