본문 바로가기

객체지향설계

오브젝트 책임과 SOLID 단일 책임 원칙은 무엇이 다른가요?

SOLID 단일 책임 원칙책 오브젝트와 책임이 어떻게 다른지 그 의미를 살펴보기 위하여 이 포스트를 작성하였습니다. 

 

책 오브젝트 객체지향 설계의 핵심 3가지 중 역할, 책임, 협력에서 책임은 SOLID 단일 책임 원칙과 다르다고 합니다.

단일 책임 원칙은 변경과 관련된 더 큰 개념이라고 설명하고 있습니다.

 

객체지향 설계의 핵심에서의 책임

객체지향 설계의 핵심 역할 책임 협력 3가지

 

협력 애플리케이션의 기능을 구현하기 위해 메시지를 주고받는 객체들 사이의 상호작용

책임 객체가 다른 객체와 협력하기 위해 수행하는 행동

역할 대체 가능한 책임의 집합

 

아래 그림은 코드스피츠 83 오브젝트 - 3회차 에서 역할과 책임에 대한 설명을 캡쳐한 그림입니다.

 

객체가 다른 객체와 협력하기 위해 수행하는 행동이라는 의미는

 

인터페이스A, 인터페이스B, 인터페이스C 가 각각의 추상화된 메소드를 구체적으로 구현하는 것을 책임이라고 이해할 수 있습니다.

 

풀어서 설명하면 (인터페이스 A,B,C 가 인터페이스a, b, c와 협력 관계) 로서 다른 객체와 협력하기 위해 수행하는 행동 (구체적으로 구현하는 것) 라고 이해할 수 있습니다.

 

단일 책임 원칙에서의 책임

하나의 클래스는 하나의 책임을 가져야 한다.

 

"책임"이라는 말이 "변경의 이유" 의미로 사용됩니다.

 

코드스피츠에서는 "변화율에 따른 격리" 라고 설명하고 있습니다. 

 

 

아래 보이는 그림에서 초록색 박스는 TicketOffice 와 Audience 사이의 TicketSeller 는 변화율에 따른 격리가 적용된 모델입니다.

 

TicketOffice 가 Ticket를 판매하는 책임을 TicketSeller 에서 위임했다고도 말할 수 있습니다.

 

 

 

 

 

백명석님 클린 코더스 강의 13. SRP 에서는"소프트웨어 변경을 요청하는 특정 사용자들에 대한 클래스나 함수를 갖는 것이 책임이다" 라고 정의하고 있습니다.

 

여기서 다루고자 하는 내용은 결합도와 응집도입니다.

 

결합도와 응집도는 변경의 이유와 관련이 있기 때문입니다.

 

결합도

객체의 의존성의 정도를 나타내며 다른 모듈에 대해 얼마나 많은 지식을 갖고 있는지를 나타냅니다.

 

결합도가 높다는 것은 A클래스가 변경이 된다고 한다면 B클래스도 당연히 변경이 되는 것을 의미합니다.

응집도

모듈에 포함된 내부 요소들이 연관돼 있는 정도를 나타냅니다. 

변경의 이유를 파악하는 2가지

1. 인스턴스 변수의 초기화 시점

 

응집도가 높은 클래스는 인스턴스를 생성할 때 모든 속성을 생성자를 통해 초기화합니다.

 

부분적으로 초기화되지 않는 속성이 있다면 (setter) 초기화되는 속성을 기준으로 코드를 분리해야 합니다.

 

2. 메서드들이 인스턴스 변수를 사용하는 방식

 

모든 메서드가 모든 속성을 사용한다면 응집도가 높다고 말할 수 있습니다. 

 

하지만 메서드들이 사용하는 속성에 따라 그룹이 나뉜다면 응집도가 낮다고 볼 수 있으며 

 

메서드가 사용하는 속성 그룹을 기준으로 코드를 분리해야 합니다.

 

참조: 

https://www.youtube.com/watch?v=Qa3dRrSbeQI&t=783s

http://www.yes24.com/Product/Goods/74219491

https://ko.wikipedia.org/wiki/%EB%8B%A8%EC%9D%BC_%EC%B1%85%EC%9E%84_%EC%9B%90%EC%B9%99