Clean Code 책의 12장 창발성(創發性)을 읽고 정리한 내용입니다.
창발성이란 ‘하위 계층(구성 요소)에는 없는 특성이나 행동이 상위 계층(전체 구조)에서 자발적으로 돌연히 출현하는 현상’을 말한다.

➡️ 설계 품질 향상
🛠️ 다양한 리팩터링 기법 예시
- 응집도를 높이기
- 결합도를 낮추고
- 관심사 분리하기
- 관심사를 모듈로 나누기
- 함수와 클래스 크기 줄이기
- 더 나은 이름을 선택 하기 등
1) 비슷한 코드는 더 비슷하게 하면 리팩터링이 쉬워짐
2) 구현의 중복도 중복의 한 형태
func size() -> Int {
// 함수 구현
}
var isEmpty: Bool {
// 프로퍼티 구현
}
⬇️
func isEmpty() -> Bool {
return 0 == size()
}
class VacationPolicy {
func accrueUSDDivisionVacation() {
// 지금까지 근무한 시간을 바탕으로 휴가 일수를 계산하는 코드
// ...
// 휴가 일수가 미국 최소 법정 일수를 만족하는지 확인하는 코드
// ...
// 휴가 일수를 급여 대장에 적용하는 코드
// ...
}
func accrueEUDivisionVacation() {
// 지금까지 근무한 시간을 바탕으로 휴가 일수를 계산하는 코드
// ...
// 휴가 일수가 유럽연합 최소 법정 일수를 만족하는지 확인하는 코드
// ...
// 휴가 일수를 급여 대장에 적용하는 코드
// ...
}
}
class VacationPolicy {
func accrueVacation() {
calculateBaseVacationHours()
alterForLegalMinimums()
applyToPayroll()
}
private func calculateBaseVacationHours() { /* ... */ }
func alterForLegalMinimums() { /* ... */ }
private func applyToPayroll() { /* ... */ }
}
⇒ 코드는 개발의 의도를 분명히 표현해서 코드를 이해하기 쉽게 하기
⇒ 유지보수 비용 ⬇️
✅ 좋은 이름 선택하기
✅ 함수와 클래스 크기 줄이기 - 이름을 짓기도 쉽고 구현하기도 쉽고 이해하기도 쉽다
✅ 표준 명칭을 사용하기
ex) 디자인 패턴을 사용 했다면 클래스 이름에 패턴 이름을 넣어줘야 설계를 이해하기 쉬움
✅ 단위 테스트를 꼼꼼하게 작성하기 - 잘 만든 테스트 케이스는 클래스 기능을 표현
⇒ 무엇보다 충분한 노력이 필요! 다음 사람을 위해 고민을 하자. 그리고 자기 작품을 더 자랑 하자.

목표) 함수와 클래스 크기를 작게 유지하면서 시스템 크기도 작게 유지하기!
⚠️ 설계 규칙에서 우선순위가 가장 낫음
클래스와 함수 수를 줄이는 작업 < 테스트 케이스를 만들기, 중복 제거, 의도 표현하기