함수(1)

함수를 위한 규칙들

책너두 5기 6일차

로버트 C. 마틴의 클린코드 p.46 ~ p.56

내용정리

3. 함수

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

추상화 수준이 섞이면 안된다.

위에서 아래로 코드 읽기: 내려가기 규칙

다음 함수로 나아갈 수록, 추상화 수준이 낮아져야 한다.

SWITCH 문

짧게 만들기 힘들지만 최대한 적게 쓰고, 반복을 줄인다.

before

1
2
3
4
5
6
7
8
9
10
11
12
13
public Money calculatePay(Employee e)
throws InvalidEmployeeType {
    switch (e.type) {
        case COMMISSIONED:
            return calculateCommissionedPay(e);
        case HOURLY:
            return calculateHourlyPay(e);
        case SALARIED:
            return calculateSalariedPay(e);
        default:
            throw new InvalidEmployeeType(e.type);
    }
}

after

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public abstract class Employee {
    public abstract boolean isPayday();
    public abstract Money calculatePay();
    public abstract void deliverPay(Money pay);
}
---
public interface EmployeeFactory {
    public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType;
}
---
public class EmployeeFactoryImpl implements EmployeeFactory {
    public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType {
        switch (r.type) {
            case COMMISSIONED:
                return new CommissionedEmployee(r);
            case HOURLY:
                return new HourlyEmployee(r);
            case SALARIED:
                return new SalariedEmployee(r);
            default:
                throw new InvalidEmployeeType(r,type);
        }
    }
}

차이점

  • 길이의 차이
  • 수행하는 작업의 갯수
  • SRP(Single Responsibility Principle)
  • OCP(Open Closed Principle)

서술적인 이름을 사용하라!

길더라도 짧고 어려운 이름보단 서술적이고 길어서 한번에 이해할 수 있는 함수 이름이 좋다. 또한 여러 함수들에 일관성있게 명사, 동사를 사용하라.

함수 인수

인수가 많을 수록 테스트 케이스를 넣기도, 이해하기도 힘들어진다. 최선은 없는 것이고 적을 수록 좋다.

많이 쓰는 단항형식

  1. 인수에 질문을 던지는 경우 : 존재 여부를 boolean으로 나타내기
  2. 인수를 뭔가로 변환해 결과를 반환하는 경우

플래그 인수

쓰지말자. 참 일때와 거짓일 때 다른일을 한다고 하니 여러 가지를 처리하는 것이기 때문이다.

이항 함수, 삼항함수

무조건은 아니지만 최대한 단항 함수를 사용하는 것이 좋다.

인수 객체

가능하다면 묶어서 처리할 것은 묶어서 하라.

인수 목록

String.format("%s worked %.2f hours.", name, hours);

와 같은 방식으로 묶어서 처리할 수 있다.

동사와 키워드

  • 동사와 명사가 쌍을 이루는 것

  • 함수 이름에 키워드 추가

하는 방식으로 함수를 표햔하

부수효과를 일으키지 마라

한 가지만 한다는 함수에 대한 거짓말이다. 사용하지 말자.

출력 인수

가급적 사용하지 말것.

나의 생각

오늘도 명명법과 비슷하게, 최대한 작게 함수를 만들고 이름에는 분명히 정보를 표시해야 한다고 한다. 개인적으로 플래그 함수를 좋아했는데, 쓰지 말라는 것을 보니 당황스럽다. 저자의 설명을 읽어보니 납득이 간다. 작은 코드들이 모여 큰 프로젝트를 이루니 매 번 작성할 때마다 이 부분들을 고려해야겠다.