2장. 단일 책임 원칙을 따르는 클래스 디자인하기
단일 책임 원칙이란 무엇인가요?
먼저 단일 책임 원칙을 설명하기 전에 객체지향 설계 원칙인 SOLID에 대해서 간단하게 알아보겠습니다.
마틴의 책 클린 아키텍처
에서는 SOLID를 다음과 같이 설명하고 있습니다.
SOLID 원칙은 함수와 데이터 구조를 클래스로 배치하는 방법, 그리고 이들 클래스를 서로 결합하는 방법을 설명해준다. SOLID 원칙의 목적은 중간 수준의 소프트웨어 구조가 아래와 같도록 만드는 데 있다.
- 변경에 유연하다.
- 이해하기 쉽다.
- 많은 소프트웨어 시스템에 사용될 수 있는 컴포넌트의 기반이 된다.
클린 아키텍처 참고
SOLID는 다음 5가지 원칙의 앞글자를 따라 붙여진 이름입니다.
- SRP : 단일 책임 원칙
- OCP : 개방 폐쇄 원칙
- LSP : 리스코프 치환 원칙
- ISP : 인터페이스 분리 원칙
- DIP : 의존성 역전 원칙
단일 책임 원칙을 5가지 원칙 중에 첫번째에 해당하는 원칙입니다. (순서는 중요하지 않습니다.)
클린 아키텍처
에서는 단일 책임의 원칙을 하나의 모듈은 하나의, 오직 하나의 액터에 대해서만 책임져야 한다. 라고 정리했습니다.
이는 모듈의 변경의 이유가 하나의 이해관계자 또는 사용자에 의해서만 변경되어야 한다는 것을 의미하는데 변경의 이유가 하나인 모듈은 모듈내의 모든 기능이 하나의 목적을 위해서 동작하기 때문에 응집성이 높은 모듈이 만들어지게 됩니다.
이렇듯 단일 책임 원칙
은 응집성이 높은 모듈을 만들도록 하는 원칙입니다.
- 응집성이 높은 모듈은 구조에 어떤 영향을 미칠까요?
- 응집성이 높은 모듈을 만드는 것이 왜 좋을까요?
- 어떻게 응집성이 높은 모듈을 만들 수 있을까요?
응집성이 높은 모듈 : 단일 책임을 갖는 클래스 만들기
위에 단일 책임 원칙을 정리하면서 생긴 궁금증을 정리하려고 합니다.
응집성이 높은 모듈은 구조에 어떤 영향을 미칠까요? 응집성이 높은 모듈을 만드는 것이 왜 좋을까요?
이전에 루비로 배우는 객체지향 1장을 정리하면서 변경하기 쉬운 프로그램
을 만들어야 한다고 했습니다. 응집성이 높은 모듈은 바로 변경하기 쉬운 프로그램
을 가능하게 하는 요소입니다. 때문에 응집성이 높은 모듈을 만들어야 합니다.
응집성이 높은 모듈은 하나의 책임을 위해 존재하기 때문에 내부가 단순해집니다. 모든 것을 알고 있을 필요가 없습니다. 모듈이 모르는 것은 다른 모듈이 알고 있고, 이 모듈은 다른 모듈에 도움만 요청하면 됩니다.
응집성이 높은 모듈은 쉽게 수정할 수 있고 재사용 가능한 모듈을 만들어낼 수 있습니다.
수정하기 쉽다.
의 구체적인 기준은 다음과 같습니다.
- 수정이 예상치 못한 부작용을 낫지 않는다.
- 요구사항이 조금 변했을 떄 연관된 코드들을 조금만 수정하면 된다.
- 현재 코드를 다시 사용하기 쉽다.
- 코드를 수정하는 가장 쉬운 방법은 이미 수정하기 쉬운 코드에 새로운 코드를 추가하는 것이다.
어떻게 응집성이 높은 모듈을 만들 수 있을까요?
하나의 클래스는 최대한 작으면서도 유용한 것만 해야한다. 다시 말해서, 하나의 책임만 있어야 한다.
클래스가 하나의 책임만 갖고 있는지 알기 위해서 어떤 방법을 사용할 수 있을까요?
- 클래스를 인격이 있는 존재처럼 가정하고 질문을 던져보는 방법입니다. 클래스가 수행하고 있는 메서드를 하나씩 질문 형태로 바꾸는 방법입니다.
- 클래스가 하는 일을 한 문장으로 만들어봅니다.
변화를 받아들일 수 있는 코드 작성하기
응집성이 높은 모듈은 만드는 것 이외에 우리는 수정이 용이한 코드를 작성해야합니다.
수정이 용이한 코드를 작성하는 방법 2가지가 있습니다.
- 데이터가 아니라 행동에 기반한 코드를 작성하라.
- 모든 곳애 단일 책임 원칙을 강제하라.