본문 바로가기
개발 관련/클린코드

12. 창발성

by lazysnack 2022. 7. 13.

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

  • 켄트 벡이 제시한 단순한 설계 규칙 4가지
  1. 모든 테스트를 실행하라
    무엇보다도 먼저 설계는 의도한 대로 돌아가는 시스템을 내놓아야 한다.

    테스트가 불가능한 시스템은 검증도 불가능하며, 검증이 불가능한 시스템은 출시하면 안된다고 생각한다.

    테스트 케이스를 만들고 계속 돌려라 라는 단순한 규칙을 따르면 시스템은 낮은 결함도와 높은 응집력이라는,

    객체 지향 방법론이 지향하는 목표를 저절로 달성한다.

  2. 중복을 없애라
    우수한 설계에서 중복은 커다란 적이다.

    똑같은 코드는 당연히 중복이고, 비슷한 코드는 더 비슷하게 고쳐주면 리펙토링이 쉬워진다.

    구현 중복도 중복의 한 형태이다. 소규모 재사용은 시스템 복잡도를 극적으로 줄여주고, 추후 대규모 재사용을 가능토록 한다.

  3. 프로그래머 의도를 표현한다
    자신이 이해하는 코드를 짜기는 쉽다. 코드를 짜는 동안에는 문제에 푹 빠져 코드를 구석구석 이해하니까.

    하지만, 나중에 코드를 유지보수할 사람이 코드를 짜는 사람만큼이나 문제를 깊이 이해할 가능성은 희박하다.

    우선, 좋은 이름을 선택한다. 이름과 기능이 딴판인 클래스나 함수는 안되겠다.

    둘째, 함수와 클래스 크기를 가능한 줄인다.

    셋째, 표준 명칭을 사용한다. 예를 들어 디자인 패턴은 의사소통과 표현력 강화가 주요 목적이다.

    패턴을 사용할 경우 패턴명을 넣어주면 더 편하다. 하지만, 표현력을 높이는 가장 중요한 방법은 노력이다.

    흔히 코드만 돌린 후 다음 문제로 직행하는 사례가 비일비재한데, 나중을 위해 조금이라도 쉽게 표현하려는 고민이 필요하다.

    나중 읽는 사람이 나 자신이 될 수도 있다.

  4. 클래스와 매서드 수를 최소로 줄인다.
    SRP 를 극도로 준수하면 득보다 실이 더 많아진다.

    이 규칙은 '가능한' 줄이라고 제안한다. 목표는 함수와 클래스 크기를 작게 유지하면서 동시에 시스템 크기도 작게 유지하는 데에 있다.

    하지만, 이 규칙은 4가지 규칙 중 우선순위가 가장 낮다, 즉 클래스와 함수 수를 줄이는 작업은 중요하지만,

    테스트 케이스를 만들고 중복을 제거하고 의도를 표현하는 작업이 더 중요하다는 의미이다.

결론을 덧붙이면...?

우선... 어려운 창발이 무슨 뜻인지부터 보자.

창발(創發, Emergence)또는 떠오름 현상은 하위 계층(구성 요소)에는 없는 특성이나 행동이 상위 계층(전체 구조)에서 자발적으로 돌연히 출현하는 현상이다.
-- 위키백과

뜻을 봐도 잘 모르겠다. 예전에 영어로는 나타난다. 이런 뜻으로 외웠던 거 같은데..

나타난다 로 생각하면 클린 코드는 위의 4가지 규칙을 통해 나타난다 (emergence) 정도가 되려나??

뭐하튼.. 이번 내용은 짧다. 하지만, 내용은 핵심적이다.

테스트 케이스를 작성 -> 리펙토링

현재 회사에 와서 처음에는 CMS 를 포팅(spring -> spring boot, angularJS -> Angular) 할 때는 테스트 케이스도 만들고 재밌었다.

하지만, 요즘은 기능 추가 혹은 수정 건도 없고, 두서 없는 작업 지시에, 외주가 정말.. 개판으로 짜놓은 화면 소스를 유지보수 하고 있다.

어리광 부리는 거 아니냐? 라고 할 수도 있겠지만 너무 재미가 없다.

그래서 재미좀 찾아보려고 책도 보고 정리도 하면서 하고있긴 하지만..

아니다. 어느덧 책도 5장 정도 밖에 안 남았다. (부록에 나와 있는 부분은 따로 정리를 안하려고 한다. 그냥 편하게 읽고 넘어갈까 하지만, 변심이 생겨 주말에 정리할지도...?)

일단, 이 책을 다 정리하면 다음에는 어떤 책을 정리할까 고민이긴 하다.

'개발 관련 > 클린코드' 카테고리의 다른 글

13. 동시성  (0) 2022.07.13
11. 시스템  (0) 2022.07.13
10. 클래스  (0) 2022.07.13
9. 단위 테스트  (0) 2022.07.13
8. 경계  (0) 2022.07.13