너에겐 ŁĦㄱr 없는거㉡l? 그런 거니?

[Clean Code] 10.클래스

2021年02月28日

클래스 체계

클래스를 정의하는 표준 자바 관례에서는 아래 순서에 맞춰 작성한다.

  1. 정적(static) 공개(public) 상수
  2. 변수 목록
  3. 정적 비공개 변수
  4. 비공개 인스턴스 변수
  5. 공개 함수
  6. 비공개 함수 (자신을 호출하는 공개 함수 바로 뒤에)

캡슐화

변수와 유틸리티 함수는 가능한 공개하지 않는 편이 낫다. 함수를 protected 로 서언하여 테스트 코드에서 접근 할 수 있도록 해야한다. (swift 에서는 static 으로 해서 테스트코드에서 접근할 수 있도록 하는 것이랑 같은걸까?)

클래스는 작아야 한다!

함수와 마찬가지로 클래스도 작아야한다.

클래스 이름은 해당 클래스 책임을 기술해야 한다. 예를 들어 Processor, Manager, Super 등과 같은 모호한 단어가 있다면 클래스가 여러 책임을 떠안았다는 증거이다.

단일 책임 원칙

클래스나 모듈을 변경할 이유가 하나, 단 하나뿐이어야 한다는 원칙

큰 클래스 몇 개가 아니라 작은 클래스 여럿으로 이뤄진 시스템이 더 바람직하다. 작은 클래스는 각자 맡은 책임이 하나며, 변경할 이유가 하나며, 다른 작은 클래스와 협력해 시스템에 필요한 동작을 수행한다.

응집도

클래스는 인스턴스 변수 수가 작아야 한다.

응집도가 높다는 말은 클래스에 속한 메서드와 변수가 서로 의존하며 논리적인 단위로 묶인다는 의미이다.

‘함수를 작게, 매개변수 목록을 짧게’라는 전략을 따르다 보면 몇몇 메서드만이 사용하는 인스턴스 변수가 아주 많아진다. 이는 새로운 클래스로 쪼개야 한다는 신호이다.

응집도가 높아지도록 변수와 메서드를 적절히 분리해 새로운 클래스 두세 개로 쪼개준다.

응집도를 유지하면 작은 클래스 여럿이 나온다

변수가 아주 많은 큰 함수 하나가 있다.

큰 함수 일부를 작은 함수 하나로 빼내고 싶은데, 빼내려는 코드가 큰 함수에 정의된 변수 넷을 사용한다.

그렇다면 변수 네 개를 새 함수에 인수로 넘겨야 옳은가?

아니다. 네 변수를 클래스의 인스턴스 변수로 승격한다면 새 함수는 인수가 필요 없다. 그만큼 함수를 쪼개기 쉬워진다.

하지만 이렇게 하면 클래스가 응집력을 잃고 몇몇 함수만 사용하는 인스턴스 변수가 많아진다.

그래서 독자적인 클래스로 분리한다.

변경하기 쉬운 클래스

변경으로부터 격리

구체적인 클래스와 추상 클래스가 있다.

구체적인 클래스는 상세한 구현을 포함하고

추상 클래스는 개념만 포함한다.

상세한 구현에 의존하는 클라이언트 클래스는 구현이 바뀌면 위험에 빠진다.

그래서 우리는 인터페이스와 추상 클래스를 사용해 구현이 미치는 영향을 격리한다.

테스트가 가능할 정도로 시스템의 결합도를 낮추면 유연성과 재사용성도 더욱 높아진다.

결합도가 낮다는 것은 시스템 요소가 다른 요소, 변경으로부터 격리되어 있다는 의미이다.

시스템 요소가 서로 격리되어 있으면 각 요소를 이해하기 쉬워진다.

이렇게 결합도를 최소로 줄이면 자연스럽게 또 다른 클래스 설계 원칙인 DIP(의존성 역전 원칙)를 따르는 클래스가 나온다.