창발성

Judy·2024년 4월 17일

Clean Code 책의 12장 창발성(創發性)을 읽고 정리한 내용입니다.


창발성

창발성이란 ‘하위 계층(구성 요소)에는 없는 특성이나 행동이 상위 계층(전체 구조)에서 자발적으로 돌연히 출현하는 현상’을 말한다.


소프트웨어 설계 품질을 높여주는 설계 규칙

  • 모든 테스트 실행
  • 중복 제거
  • 프로그래머 의도 표현
  • 클래스와 메서드 최소화

1. 모든 테스트를 실행하라

  • 문서로만이 아닌 시스템이 의도대로 돌아가는지 검증이 필요
  • 테스트를 한다 ﹦ 검증이 가능한 코드다
  • 테스트 가능하게(쉽게) 하다
    ﹦ 결합도 ⬇️ / 응집력 ⬆️ / 의존성 주입(DI) / DIP / 인터페이스 / 추상화

➡️ 설계 품질 향상


2. 리팩터링

  • 테스트 했으면 이제 코드와 클래스 정리
  • 새로 추가하는 코드가 설계 품질을 낮추는지 고민 후 테스트 케이스 돌려보기
  • 테스트 케이스를 통해 코드 정리로 인해 시스템이 깨질까 걱정 🙅🏻‍♀️

🛠️ 다양한 리팩터링 기법 예시

  • 응집도를 높이기
  • 결합도를 낮추고
  • 관심사 분리하기
  • 관심사를 모듈로 나누기
  • 함수와 클래스 크기 줄이기
  • 더 나은 이름을 선택 하기 등

3. 중복을 없애라

  • 중복 = "추가 작업, 추가 위험, 불필요한 복잡도" ➡️ 중복은 커다란 적

중복을 제거하는 방법

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() { /* ... */ }
}
  • 템플릿 메서드 패턴은 고차원 중복을 제거 하는 목적으로 자주 사용되는 기법

4. 표현하라

  • 자신이 이해하는 코드는 짜기 쉽지만 나중에 유지보수를 사람이 깊게 이해할 가능성은 희박하다
  • 시스템이 복잡해지면서 시스템을 이해하는 시간이 길어지고 코드를 오해할 가능성도 커진다

⇒ 코드는 개발의 의도를 분명히 표현해서 코드를 이해하기 쉽게 하기
⇒ 유지보수 비용 ⬇️


☁️ 표현의 방법

✅ 좋은 이름 선택하기
✅ 함수와 클래스 크기 줄이기 - 이름을 짓기도 쉽고 구현하기도 쉽고 이해하기도 쉽다
✅ 표준 명칭을 사용하기
ex) 디자인 패턴을 사용 했다면 클래스 이름에 패턴 이름을 넣어줘야 설계를 이해하기 쉬움
✅ 단위 테스트를 꼼꼼하게 작성하기 - 잘 만든 테스트 케이스는 클래스 기능을 표현

⇒ 무엇보다 충분한 노력이 필요! 다음 사람을 위해 고민을 하자. 그리고 자기 작품을 더 자랑 하자.


5. Class 와 메세지를 최소로 줄여라

  • 기본적인 개념도 극단적으로 이행하면 득보다 실이 많아진다
  • 클래스와 메서드의 크기를 줄이려고 작은 클래스와 메서드를 수 없이 만드는 사례도 많다 🤦🏻‍♀️

목표) 함수와 클래스 크기를 작게 유지하면서 시스템 크기도 작게 유지하기!

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


결론

  • 단순한 개발 기법 당연히 없다!
  • 하지만 이 책에서 소개 하는 기법은 저자들이 수십 년 동안 쌓은 경험에 정수다
  • 단순한 설계 규칙을 따르면 오랜 경험에 따른 우수한 기법과 원칙을 활용할 수 있다


꿍톤루주브의 Clean Code 스터디

profile
iOS Developer

0개의 댓글