[Clean Code] 창발성

해당 포스트는 Clean Code의 내용을 참고하여 작성되었습니다.

창발적 설계로 깔끔한 코드를 구현하자

켄트 벡이 제시한 단순한 설계 규칙 네 가지가 소프트웨어 설계 품질을 크게 높여준다고 믿는다. 켄트벡은 다음 규칙을 따르면 설계는 단순하다고 말한다. 중요도 순으로 나열하면 다음과 같다.

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

모든 테스트를 실행하라

무엇보다 먼저 설계는 의도한 대로 돌아가는 시스템을 내놓아야 한다. 문서로는 시스템을 완벽히 설계했더라도 이를 검증할 간단한 방법이 없다면 문서 작성을 위해 투자한 노력에 대한 가치를 인정받기는 힘들다. 테스트가 가능한 시스템을 만들려고 애쓰면 설계 품질이 높아진다. 크기가 작고 목적 하나만 수행하는 클래스가 나온다. SRP를 준수하는 클래스는 테스트가 훨씬 더 쉽다. 테스트 케이스가 많을수록 개발자는 테스트가 쉽게 코드를 작성한다. 따라서 철저한 테스트가 가능한 시스템을 만들면 더 나은 설계가 얻어진다.

결합도가 높으면 테스트 케이스를 작성하기 어렵다. 그러므로 테스트 케이스를 많이 작성할 수록 DIP와같은 원칙을 적용하고 DI, 인터페이스, 추상화와 같은 도구를 통해 결합도를 낮춘다. 따라서 설계 품질은 높아진다.

테스트 케이스를 만들고 계속 돌려라 라는 간단한 규칙을 따르면 시스템은 낮은 결합도와 높은 응집도라는 OOP가 지향하는 목표를 자연스럽게 달성한다.

중복을 없애라

우수한 설계에서 중복은 커다란 적이다. 중복은 추가 작업, 추가 위험, 불필요한 복잡도를 뜻하기 때문이다. 똑같은 코드는 중복이다. 비슷한 코드는 더 비슷하게 고쳐주면 리펙터링이 쉬워진다. 다음을 보자.

1
2
int size() { ... }
boolean isEmpty() { ... }

각 메소드를 따로 구현하는 방법도 있지만 다음과 같이 isEmpty를 구성하면 쉽게 중복을 제거할 수 있다.

1
2
3
boolean isEmpty() {
return 0 == size();
}

깔끔한 시스템을 만들려면 단 몇줄이라도 중복을 제거하겠다는 의지가 필요하다.

표현하라

자신이 이해하는 코드를 짜기는 쉽다. 하지만 다른 사람이 이해하기 쉬운 코드를 짜기는 어렵다. 그러므로 코드는 개발자의 의도를 분명히 표현해야 한다. 첫째로 좋은 이름을 선택한다. 둘째로 함수와 클래스 크기를 가능한 줄인다. 셋째로 표준 명칭을 사용한다. 넷째로 유닛 테스트 케이스를 꼼꼼히 작성한다.

표현력을 가장 높이는 방법은 노력이다.

클래스와 메소드 수를 최소로 줄여라

중복을 제거하고 의도를 표현하고 SRP를 준수한다는 기본적인 개념도 극단으로 치달으면 득보다 실이 많다. 클래스와 메소드를 줄이려고 조그만 클래스와 메소드를 수없이 많이 만드는 사례도 없지 않다. 이런 활동의 목표는 함수와 클래스 크기를작게 유지하면서 동시에 시스템 크기도 작게 유지하는데 있다.

하지만 이 규칙은 간단한 설계 규칙 중 우선순위가 가장 낮다. 즉, 함수 수를 줄이는 작업도 중요하지만, 테스트 케이스를 만들고 중복을 제거하고 의도를 표현하는 작업이 더 중요하다는 뜻이다.

Author: Song Hayoung
Link: https://songhayoung.github.io/2020/08/08/Clean%20Code/clean-code12/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.