산 넘어 산 개발일지

Clean Code - 창발성 본문

Study/CleanCode

Clean Code - 창발성

Mountain96 2021. 3. 18. 00:25

창발성 : 창발또는 떠오름 현상은 하위 계층에는 없는 특성이나 행동이 상위 계층에서 자발적으로 돌연히 출현하는 현상이다.

왜 이번 챕터의 제목이 창발성인지는 잘 모르겠다.

전체적으로 내용은 코드를 단순하게 하기 위한 내용을 요약한 것이었다.

주로 지금까지 한 내용을 다시 간결하게 되짚어 보는 단계인 것 같다.

굳이 창발성과 관련이 있는 것이라면 TEMPLATE METHOD 정도가 아닌가 싶다.


단순한 코드 법칙

  1.   모든 테스트를 실행한다.
    • "테스트가 가능한 시스템"
      • 테스트가 가능한 시스템을 만드는 과정 속에서 자연스럽게 소프트웨어의 품질도 높아진다.
      • 테스트가 가능해야 검증이 가능하다.
    • 낮은 결합도 + 높은 응집도
      • 결합도는 낮춤으로써 테스트와 유지보수에 용이하도록 설계하고, 응집도는 높인다.
      • SRP 지키기, DI, 인터페이스, 추상 클래스와 같은 기법들 사용
  2. 중복을 없앤다.
    • 중복은 불필요하게 코드 양이 많아져 읽기가 부담스러워지고 복잡해보인다.
    • 작은 부분의 중복을 해결하는 "소규모 재사용"들이 결국 "대규모 재사용"을 불러온다.
    • TEMPLATE METHOD 패턴
      • 상위 클래스(추상 클래스)에서 공통되는 메서드를 작성하고, 이 메서드 내부의 세부구현은 하위 클래스의 역할에 따라 다르게 구현하는 기법
      • primitive 메서드, 혹은 hook 메서드를 사용하여 하위 클래스에서 오버라이드된 메서드를 상위 클래스에서의 공통 메서드에서 사용한다.
  3. 프로그래머의 의도를 표현하라
    • 모든 제품에서 유지보수는 중요하다.
    • 유지보수를 위해서는 유지보수 개발자가 코드를 파악할 필요가 있는데, 파악하는 것에 얼만큼의 비용이 소모되는지가 관건이다.
    • 따라서 개발자는 코드를 작성할 때 자신의 의도를 명확히 표출하여 유지보수 개발자가 빠르고 쉽게 코드를 파악할 수 있도록 해줘야 한다.
    • 의도를 분명히 하는 좋은 방법
      1. 좋은 이름
      2. 함수와 클래스 크기를 "가능한" 줄이기
      3. 표준 명칭 사용
      4. 단위 테스트 케이스 작성
  4. 클래스와 메서드 수를 최소로 줄여라
    • 최소로 줄이되 실용적인 경계 안에서만 줄여야 한다.
    • 지나치게 이론에 집착하는 구조로 쓸데없이 복잡성을 증가시켜서는 안된다.

내 코드 돌아보기

상위 클래스
하위 클래스

중복없애기

FoodsRecyclerViewAdapter 는 OriginFoodsRecyclerviewAdapter를 상속받은 하위 클래스임에도 불구하고 대부분의 함수를 오버라이드 해서 사용했다.

즉 그만큼 중복이 심해지고, 재사용성이 낮아진 것이다.


수정된 코드

여러 수정을 했지만, 생성자 부분인 constructor에 주목해보자.

 

TEMPLATE METHOD

  • 하위 클래스마다 생성자 부분에 추가적으로 생성할 부분이 상이해서 이 부분을 loadFoodList() 추상 메서드로 정의하고 하위 클래스에서 구현하게 했다.
  • 이후 아래와 같이, 각 하위 클래스는 자신들의 상황에 맞게 loadFoodList()를 구현했다.
  • 결과적으로, 생성자를 다시 정의할 필요가 없어졌다.

하위클래스 1
하위클래스 2

 


포인트

1.테스트가 가능한 시스템

2. 낮은 결합도 + 높은 응집도

3. 중복 없애기(TEMPLATE METHOD)

4. 프로그래머의 의도 표현하기

5. 클래스, 함수 크기 줄이기


느낀점

리팩터링 하는 것이 특히나 어려운 부분이였다.

특히 처음 코드를 짤 때, 상속을 사용했음에도 상속의 이점을 제대로 살리지 못했다는 것을 뼈저리게 느꼈다.

앞으로 코드를 짤 때, 단순히 기능에만 충실하지 않고 미래의 유지보수를 고려해서 짜게 될 것 같다.

지금처럼 고통을 겪지 않으려면...

또한 추상 클래스나 인터페이스를 더 활용해 보고 싶은 욕심이 생겼다.

'Study > CleanCode' 카테고리의 다른 글

Clean Code - 시스템  (0) 2021.03.10
Clean Code - 클래스  (0) 2021.03.04
Clean Code - 단위 테스트  (0) 2021.03.03
Clean Code - 경계  (0) 2021.03.01
Clean Code - 객체와 자료구조  (0) 2021.02.21
Comments