12. 창발성
켄트백의 단순한 설계 네 가지로 우수한 설계의 창발성을 촉진하는 것
- 창발성: 하위의 구성요소로 상위 수준에 효과가 나타나는 능력 '창발' 위키 설명 참조
 
켄트백의 단순할 설계 네 가지#
중요한 것부터 나열
- 모든 테스트를 실행한다
 - 중복을 없앤다
 - 프로그래머의 의도를 표현한다
 - 클래스와 메서드 수를 최소로 줄인다
 
1. 모든 테스트를 실행한다#
- 의도한 설계대로 돌아가는 시스템을 내놓기 위해 테스트는 필수적
 - 테스트 가능한 시스템으로 만들기 위해 노력하기
 - 결합도가 높으면 TC 작성이 어려워 자연스레 TC 작성하며 결합도를 느슨하게 할 수 있음
- DI, interface, 추상화 등
 
 
리팩터링#
- 새로 추가한 코드가 품질을 낮추지 않는가를 맘속에 새기며 리팩터링
 - 코드를 정리하면서 시스템이 깨질 걱정은 테스트로 덜어낼 수 있음
 - 아래는 리팩터링 하는 3가지 방법에 해당함
 
2. 중복을 없애라#
- 똑같은 코드, 비슷한 코드, 구현 중복 등 다 중복의 한 형태
 - 으으이이ㅣ이이이지 (의지) 가 필요
 
size() 재활용으로 isEmpty() 에 비슷한 구현 없애기
Template Method 패턴을 적용해 중복 제거
3. 의도를 표현하라#
- 나중에 코드를 유지 보수할 사람이 직접 만든 사람보다 깊이 이해할 확률은 희박
 - 의도를 분명히하여 그래도 유지보수할 분이 이해될 수 있도록 배려해야함
 
실천 가이드#
가장 중요한건 노력과 배려
- 좋은 이름
 - 함수와 클래스 크기 가능한 줄이기
 - 표준 명칭 사용
 - 단위 테스트 꼼꼼히 작성
 
4. 클래스와 메서드 수를 최소로 줄여라#
- 독단적인 견해는 멀리하고 실용적인 방식을 택하자
 
실천 예#
반드시 따라야 한다는 건 아님
- 클래스 마다 인터페이스 생성
 - 자료 클래스와 동작 클래스 분리