[Book - Clean Code] 10. 클래스
클래스는 작아야 한다!
클래스를 설계할 때도, 함수와 마찬가지로, ‘작게’가 기본 규칙이다.
만약 메서드가 5개 정도면 괜찮을까?
메서드 수가 작아도 책임이 너무 많다면 괜찮지 않다.
단일 책임 원칙
객체 지향 설계에서 중요한 개념인 Single Responsibility Principle(SRP)은 클래스나 모듈을 변경할 이유가 단 하나뿐이어야 한다는 원칙이다.
큰 클래스 몇 개가 아니라 작은 클래스 여럿으로 이뤄진 시스템이 더 바람직하다.
작은 클래스는 각자 맡은 책임이 하나며, 변경할 이유가 하나며, 다른 작은 클래스와 협력해 시스템에 필요한 동작을 수행한다.
응집도(Cohesion)
일반적으로 메서드가 변수를 더 많이 사용할수록 메서드와 클래스는 응집도가 더 높다.
모든 인스턴스 변수를 메서드마다 사용하는 클래스는 응집도가 가장 높다.
우리는 응집도가 높은 클래스를 선호한다.
응집도가 높다는 말은 클래스에 속한 메서드와 벼수가 서로 의존하며 논리적인 단위로 묶인다는 의미기 때문이다.
응집도를 유지하면 작은 클래스 여럿이 나오므로, 클래스가 응집력을 잃는다면 쪼개라!
변경하기 쉬운 클래스
개방-폐쇄 원칙
Open-Closed Principle(OCP)는 확장에 개방적이고 수정에 폐쇄적이어야 한다는 원칙이다.
새 기능을 수정하거나 기존 기능을 변경할 때 건드릴 코드가 최소인 시스템 구조가 바람직하다.
이상적인 시스템이라면 새 기능을 추가할 때 시스템을 확장할 뿐 기존 코드를 변경하지는 않는다.
변경으로부터 격리
객체 지향 프로그래밍에서 구체적인 클래스와 추상 클래스가 있다고 했다.
구체적인 클래스는 상세한 구현(코드)를 포함하며 추상클래스는 개념만 포함한다고 배웠다.
상세한 구현에 의존하는 클라이언트 클래스는 구현이 바뀌면 위험에 빠진다.
그래서 우리는 인터페이스와 추상 클래스를 사용해 구현이 미치는 영향을 격리한다.
시스템의 결합도를 낮추면 유연성과 재사용성도 더욱 높아진다.
결합도가 낮다는 소리는 각 시스템 요소가 다른 요소로부터 그리고 변경으로부터 잘 격리되어 있다는 의미이며,
각 요소를 이해하기도 더 쉬워진다.
의존 역전 원칙
또 다른 클래스 설계 원칙인 Dependancy Inversion Principle(DIP)는 클래스가 상세한 구현이 아니라 추상화에 의존해야 한다는 원칙이다.
즉, 추상화로 구체적인 사실을 모두 숨기는 것이다.