Clean Code: 창발성

jiffydev·2021년 6월 14일
0

Clean Code

목록 보기
11/13

켄트 벡이 제시한 다음의 단순한 설계 규칙 네 가지가 설계 품질을 크게 높여줄 것이다.

  • 모든 테스트를 실행한다.
  • 중복을 없앤다.
  • 프로그래머의 의도를 표현한다.
  • 클래스와 메서드 수를 최소로 줄인다.

1. 모든 테스트를 실행

  • 시스템이 의도한 대로 돌아가는지 검증할 방법이 있어야 한다.

  • 테스트가 가능한 시스템을 만들려고 애쓰면 설계 품질이 올라간다.

  • SRP를 준수하는 클래스는 테스트가 훨씬 더 쉽다.

  • 테스트 케이스를 많이 작성할수록 개발자는 DIP 원칙을 적용하고, 의존성 주입, 인터페이스, 추상화 같은 도구를 사용해 결합도를 낮춘다.

2. 리팩토링

테스트 코드를 모두 작성한 후 코드와 클래스를 정리(리팩토링)할 수 있다.
테스트 케이스가 있다면 리팩토링 과정에서 시스템이 깨질까 걱정할 필요가 없게 된다.
이 단계에서는 설계 품질을 높이는 기법이라면 모두 적용할 수 있다.

3. 중복을 없애라

중복은 여러 형태로 표출된다.
구현 중복도 중복의 한 형태다. 집합 클래스에 다음과 같은 두 개의 메서드가 있다고 가정하자.

int size() {}
boolean isEmpty() {}

이처럼 각 메서드를 따로 구현할 수도 있지만, 다음과 같이 isEmpty()에서 size()를 이용하면 코드를 중복해 구현할 필요가 없어진다.

boolean isEmpty() {
  return 0 == size();
}

고차원 중복을 제거하기 위해 TEMPLATE METHOD 패턴을 사용할 수도 있다.

public class VacationPolicy {
  public void accrueUSDivisionVacation() {
    // 지금까지 근무한 시간을 바탕으로 휴가 일수를 계산하는 코드
    // ...
    // 휴가 일수가 미국 최소 법정 일수를 만족하는지 확인하는 코드
    // ...
    // 휴가 일수를 급여 대장에 적용하는 코드
    // ...
  }
  
  public void accrueEUDivisionVacation() {
    // 지금까지 근무한 시간을 바탕으로 휴가 일수를 계산하는 코드
    // ...
    // 휴가 일수가 EU 최소 법정 일수를 만족하는지 확인하는 코드
    // ...
    // 휴가 일수를 급여 대장에 적용하는 코드
    // ...
  }
}

위 코드는 거의 동일한 메소드를 가지고 있어 TEMPLATE METHOD 패턴을 적용하면 중복을 제거할 수 있다.

abstract public class VacationPolicy {
  public void accrueVacation() {
    calculateBaseVacationHours();
    alterForLegalMinimums();
    applyToPayroll();
  }
  
  private void calculateBaseVacationHours() { /*...*/ };
  abstract protected void alterForLegalMinimums();
  private void applyToPayroll() { /*...*/ };
}

public class USVacationPolicy extends VacationPolicy {
  @Override protected void alterForLegalMinimums() {
    // 미국 최소 법정 일수를 사용한다.
  }
}

public class EUVacationPolicy extends VacationPolicy {
  @Override protected void alterForLegalMinimums() {
    // EU 최소 법정 일수를 사용한다.
  }
}

4. 표현하라

나중에 코드를 유지보수할 사람이 코드를 짜는 사람만큼이나 문제를 깊이 이해할 가능성은 희박하다.
따라서 코드는 개발자의 의도를 분명히 표현해야 한다. 코드가 명백할수록 다른 사람이 이해하기 쉬워지고, 결함이 줄어들고, 결과적으로 유지보수 비용이 적게 든다.

  • 좋은 이름을 선택한다

  • 함수와 클래스 크기를 가능한 줄인다

  • 표준 명칭을 사용한다

  • 단위 테스트 케이스를 꼼꼼히 작성한다

나중에 읽을 사람을 고려해 조금이라도 읽기 쉽게 만들려는 노력을 기울이자

5. 클래스와 메서드 수를 최소로

극단적으로 클래스와 메서드 크기를 줄이기 위해 작은 클래스와 메서드가 지나치게 많아지는 경우가 있다.
이를 방지하기 위해 함수와 클래스 수를 가능한 줄이는 것을 제안한다.

다만 클래스와 메서드의 개수보다도, 테스트 케이스를 작성하고 중복을 제거하고 의도를 표현하는 작업을 우선적으로 처리해야 한다.

profile
잘 & 열심히 살고싶은 개발자

0개의 댓글