3. 코드 단위는 간단하게 짜라

가이드라인

  • 단위당 분기점은 4개로 제한한다

  • 복잡한 단위는 더 잘게 나누고, 서로 뭉쳐 있지 않게 한다

  • 분기점 개수가 줄면 단위 수정 및 테스트가 쉬워지고 유지보수성이 개선된다

모든 문제는 내부에 더 작은 문제들이 있다.

-마틴 파울러

분기점, 복잡도, 실행경로

if, switch, 클래스, 인터페이스 등

분기점이 하나도 없다면 -> 실행흐름은 하나뿐 -> 테스트케이스도 1개면 충분!

1. 필요성

  • 간단한 단위는 이해하기 쉽고, 수정하기도 쉽다

  • 테스트하기 쉽다

간단한 단위는 수정하기 쉽다.

  • 복잡한 단위는 분석 및 수정이 어려움

간단한 단위는 테스트하기 쉽다.

  • 테스트를 쉽게 하기 위해서라도 단위는 간단하게 작성해야 한다.

  • 분기가 6개인 경우 최소한 테스트케이스는 6개가 존재해야 한다. 그래야 유지보수 과정에서 생길지 모를 사소한 버그를 예방 할 수 있음!!

2. 적용가이드

  • 분기점 개수는 4개로 제한!!

  • if, case, ?, && ||, while, for, catch

  • 분기절의 깊이나 길이가 늘어나면 분석이 힘들어진다!!

조건문 체인 다루기

  • 독립적인 코드블록 서너개 뭉침 -> 메서드 추출 패턴 리팩토링

  • 조건을 다형성으로 대체 -> 디자인패턴 : 상태패턴 / 다형성 활용

    • 단점은... 구현 클래스가 많아짐

    • 장점은 복잡도 낮춤, 다형성 활용으로 수정 최소화, 에러가 날 수 없는 형태로 명확화

  • Map 자료구조 활용

private static Map<Nationality, List<Color>> FLAGS = new HashMap<>();
  
  static {
    FLAGS.put(DUTCH, Arrays.asList(Color.RED, Color.WHITE));
    FLAGS.put(GERMAN, Arrays.asList(Color.RED, Color.WHITE, Color.BLACK));
    FLAGS.put(FRENCH, Arrays.asList(Color.RED, Color.BLUE, Color.YELLOW));
    FLAGS.put(KOREA, Arrays.asList(Color.BLUE, Color.WHITE, Color.RED));
  }

  public List<Color> getFlagColors(Nationality nationality) {
    List<Color> colors = FLAGS.get(nationality);
    return colors != null ? colors : Arrays.asList(Color.GRAY);
  }
  • 상태패턴 활용

public interface Flag {
  List<Color> getColors();
}

public class FrenchFlag implements Flag{
  @Override
  public List<Color> getColors() {
    return Arrays.asList(Color.RED, Color.BLUE, Color.YELLOW);
  }
}

public class GermanFlag implements Flag {
  @Override
  public List<Color> getColors() {
    return Arrays.asList(Color.RED, Color.WHITE, Color.BLACK);
  }
}
...

private static Map<Nationality, Flag> FLAGS2 = new HashMap<>();

static {
    FLAGS2.put(DUTCH, new DutchFlag());
    FLAGS2.put(GERMAN, new GermanFlag());
    FLAGS2.put(FRENCH, new FrenchFlag());
    FLAGS2.put(KOREA, new KoreaFlag());
}
  
public List<Color> getFlagColors2(Nationality nationality) {
    Flag flag = FLAGS2.get(nationality);
    flag = flag != null ? flag : new DefaultFlag();
    return flag.getColors();
}
  • 간결함이냐, 확장성이냐... 그건 상황에 따라 적절히 선택 ! 개발자의 몫

중첩 다루기

  • 중첩문을 보호절로 대체 (Replace Nested Conditional with Guard Clauses)

    • 중복되는 조건절 걸러내기

Last updated