본문 바로가기
better code

Clean Code (4/n)

by marble25 2022. 2. 16.

계속해서 Clean Code 책을 읽어 내려갔다.

 

10. 클래스

자주 쓰이는 대부분의 프로그램이 객체지향적인 프로그램인 것을 감안해 보았을 때, 클래스를 적절하게 구성하고 객체지향적으로 작성하는 것은 상당히 중요하다고 할 수 있다.

하지만 이런 중요성에도 불구하고 소스코드를 보다보면 난잡한 메소드들로 구성된 매우 큰 클래스들을 흔하게 볼 수 있다.

좋은 클래스를 작성하려면 어떤 방법을 사용해야 할까?

클래스를 작게 유지해라

물론 메소드 수를 줄이는 것도 방법일 수 있지만, 단순히 메소드 수를 줄이라는 뜻만은 아니다. 

최종적으로 추구하는 것은 클래스가 책임져야 하는 범위를 줄이라는 뜻이다.

그러기 위해서는 메소드를 작게 유지하는 것부터 시작하자.

메소드를 쪼개다 보면 다른 클래스로 분리될 수 있을 만한 지점이 보인다.

그렇게 클래스까지 분할해 가면서 큰 클래스 하나를 작은 클래스 여러개로 나누어 관리한다.

결과적으로 메소드 추가 / 변경시 전체 코드를 볼 필요 없이 부분적인 수정만으로도 목표한 바를 이루어낼 수 있을 것이다.

 

11. 시스템

이 챕터의 초중반 부분은 자바에 대한 조예가 깊지 않아서 사실 이해하기가 힘들었다.

그래도 읽어보면서 몇 가지 교훈을 얻을 수 있었다.

 

처음부터 올바르게 시스템을 만들 수 있다는 것은 미신이다

모든 프로그래머들은 처음 개발에 착수할 때 이번에는 반드시 '완벽한' 구조의 프로그램을 만들 것이라고 다짐할 것이다.

하지만 개발하다 보면 시간에 쫓겨서, 자원에 쫓겨서, 귀찮음 때문에 초기에 세웠던 이러한 목표와 점점 멀어지게 된다. 

사실 나도 다양한 프로젝트를 진행해 가면서 이 것을 많이 느꼈기 때문에 저자의 말에 공감하게 된다.

현재 구조에서 테스트를 통해 결함 없는 코드를 완성한 후에 확장시키는 것이 좋은 방법이다. 

시스템 아키텍쳐 역시 애자일 방식으로 먼저 작은 단위로 만들어놓은 후에 구조를 추가해 나가면서 확장해 나가는 것이 바람직하다. 

물론 결과에 대한 아무런 예측 없이 뛰어들라는 말은 아니고, 추상적으로나마 구조를 잡아 놓고 실제 구조 구현을 해 나가야 한다는 뜻이다. 

 

12. 창발성

창발성이라는 말을 이 책에서 처음 들었기 때문에 검색을 해 보았는데, 하위 구조에서는 없었지만, 상위 구조에서 생긴 특성을 말한다고 한다.

이 챕터는 양이 적은 대신 앞에서 다뤘던 내용을 복습하는 느낌을 강하게 줬다.

저자가 다시금 강조한 내용은 다음과 같다.

  • 모든 테스트를 실행해라

프로그래머의 코드의 무결성을 보증하는 것은 테스트 코드밖에 없다.

테스트 코드가 항상 '하나의 개념'을 테스트한다는 것을 기억한다면, 해당 조건을 맞추기 위해 코드를 간결하게 만드는 경우도 많을 것이다.

이 원칙만 따르더라도 시스템은 결합도가 낮아지면서 자연히 설계 품질이 높아지게 된다.

  • 중복을 없애라

프로그래머에게 있어서 중복은 없애야 하는 존재와 같다.

중복은 추가 작업과 불필요한 결합을 의미하기 때문이다.

  • 의도를 표현하라
    • 좋은 이름을 선택해라
    • 함수와 클래스 크기를 줄여라
    • 다른 프로그래머들이 널리 쓰는 명칭이나 패턴을 사용하라: 디자인 패턴을 공부하는 이유이기도 하다.
    • 단위 테스트를 꼼꼼히 작성해라: 테스트를 통해 클래스가 어떻게 작동하는지 알 수 있다.
    • 코드에 좀 더 시간을 투자해라: 단순히 돌아가는데서 끝내서는 안 된다.
  • 클래스와 메서드 수를 줄여라

위에서 제시했던 규칙을 지키기 위해서 조그만 클래스나 메소드를 수없이 만드는 경우도 적지 않다.

가능하면 클래스와 메소드 크기도 줄이고, 숫자도 줄일 수 있도록 노력하자. 

하지만 이 규칙은 4가지 규칙 중에서 가장 우선순위가 낮으므로, 마지막에 고려해 보도록 하자.

'better code' 카테고리의 다른 글

[TIL] copy-on-write 방법론 - js에서 퍼포먼스 테스트  (0) 2023.04.22
Clean Code (5/n)  (0) 2022.02.21
Clean Code (3/n)  (0) 2022.02.11
Clean Code (2/n)  (0) 2022.02.07
Clean Code (1/n)  (0) 2022.02.05