창발
: 하위 계층(구성 요소)에는 없는 특성이나 행동이 상위 계층(전체 구조)에서 자발적으로 돌연히 출현하는 현상
→ 어떤 규칙과 원칙에 따라 설계를 하게 되면, 그것들이 모여 아주 좋은 거시적 설계가 된다는 말
켄트 벡이 제시한 단순한 설계 규칙 4가지는 소프트웨어 설계 품질을 크게 높여준다
<aside> 💡 단순한 설계 규칙 4가지(중요도순)
⇒ 위 4가지를 따르는 설계는 "단순하다"
</aside>
효과 → 코드 구조와 설계 파악 쉬워짐, SRP나 DIP 과 같은 원칙 적용이 쉬워짐, 우수한 설계의 창발성 촉진
문서로 의도한 대로 돌아가는 시스템을 설계했어도 검증 방법이 없으면 문서 작업의 노력 인정 받기 힘듦.
테스트가 가능한 시스템
= 테스트를 철저히 거쳐 모든 테스트 케이스를 항상 통과하는 시스템
(↔ 테스트가 불가능한 시스템 → 검증 불가. 출시 X)
→ 테스트가 가능한 시스템을 만들 때의 장점
⇒ 더 나은 설계
테스트 케이스를 만들고 계속 돌리게 되면 객체 지향 방법론의 목표(낮은 결합도와 높은 응집력) 달성 가능
결합도 ↑ ⇒ 테스트 케이스 작성 어렵
테스트 케이스 많이 작성할 수록 DIP와 같은 원칙 적용하고 의존성 주입, 인터페이스, 추상화 등의 도구 사용해 결합도를 낮춤
⇒ 테스트 케이스를 작성하면 설계 품질이 높아진다.
테스트 케이스 작성 완료 시 → 점진적으로 코드, 클래스 정리(코드 리펙터링)
리펙터링 단계
→ 소프트웨어 품질 높이는 기법 적용
ex) 응집도 ↑, 결합도 ↓, 관심사 분리, 시스템 관심사 모듈로 나눔, 함수와 클래스 크기 ↓, 더 나은 이름 선택 등
→ 중복 제거, 프로그래머의 의도 표현, 클래스와 메서드를 최소로 줄이는 단계
중복은 추가 작업, 추가 위혐, 불필요한 복잡도를 의미