오늘은 4장의 내용을 정리하였다.
우리 모두를 합친 것보다 더 현명한 사람은 없다. - 켄 블래차드
객체지향의 설계의 전체적인 품질을 결정하는 것은 개별 객체의 품질이 아니라 여러 객체들이 모여 이뤄내는 협력의 품질이다.
협력
- 협력은 한 사람이 다른 사람에게 도움을 요청할 때 시작
- 협력은 다수의 요청과 응답으로 구성되며 전체적으로 협력은 다수의 연쇄적인 요청과 응답의 흐름으로 구성
- 요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의한다.
책임
객체가 책임을 가진다.
- 객체가 어떤 요청에 대해 대답해 줄 수 있거나
- 적절한 행동을 할 의무가 있는 경우
대상에 대한 요청 -> 그 대상이 요청을 처리할 책임이 있다.
책임의 분류
책임은 객체의 의해 정의되는 응집도 있는 행위의 집합
-> 객체의 책임 : 외부에서 접근 가능한 공용 서비스 관점에서 이야기
책임은 객체의 공용 인터페이스 구성
- 하는 것
- 객체를 생성하거나 계산을 하는 등의 스스로 하는 것
- 다른 객체의 행동을 시작시키는 것
- 다른 객체의 행동을 제어하고 조절하는 것
- 아는 것
- 개인적인 정보에 관해 아는 것
- 관련된 객체에 대해 아는 것
- 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것
책임과 메시지
- 메시지 전송 - 객체가 다른 객체에서 주어진 책임을 수행하도록 요청을 보내는 것
- 송신자 -> 메시지를 전송함으로써 협력을 요청하는 객체
- 수신자 -> 메시지를 받아 요청을 처리하는 객체
- 두 객체 간의 협력은 메시지를 통해 이뤄지고 메시지는 협력을 위한 객체 접근 유일한 방법이다.
책임과 메시지의 수준이 같지 않다.
책임 -> 객체가 협력에 참여하기 위해 수행해야 하는 행위를 상위 수준에서 개략적으로 서술한 것이다.
역할
역할을 사용해 협력을 모두 포괄할 수 있는 하나의 협력으로 추상화가능
협력 내에서 다른 객체로 대체할 수 있음을 나타내는 일종의 표식
역할을 대체할 수 있는 객체는 동일한 메시지를 이해할 수 있는 객체로 한정된다.
동일한 역할을 수행 -> 해당 객체들이 협력 내에서 동일한 책임의 집합 수행 가능
역할 개념 사용 시 장점
- 유사한 협력을 추상화해서 인지 과부하를 줄임 - 단순성
- 다양한 객체들이 협력에 참여할 수 있기 때문에 협력이 좀 더 유연해진다. - 유연성
- 다양한 객체들이 동일한 협력에 참여할 수 있기 때문에 재사용성이 높아짐 - 재사용성
협력의 추상화
- 하나의 협력 안에 여러 종류의 객체가 참여할 수 있게 함으로써 협력을 추상화 가능
- 구체적인 객체 -> 추상적인 역할로 대체 -> 동일한 구조의 협력을 다양한 문맥에서 재사용
대체 가능성
- 역할을 대체하기 위해서 행동이 호환되어야 한다.
- 객체가 역할을 대체 가능하기 위해서는 협력 안에서 역할이 수행하는 모든 책임을 동일하게 수행 가능해야 함
- 객체는 역할이 암시하는 책임보다 더 많은 책임을 가질 수 있다.
- 역할의 대체 가능성은 행위 호환성을 의미, 행위 호환성은 동일한 책임의 수행 의미
객체의 모양을 결정하는 협력
객체가 존재하는 이유는 행위를 수행하며 협력에 참여하기 위함이다.
협력구성
- 협력을 구성하는데 필요한 일련의 책임 고안
- 책임 수행하는데 필요한 객체 선택 및 할당
- 할당된 책임은 객체들이 외부에 제공하게 될 행동 정의
- 행동 결정 후 각 객체가 필요로 하는 데이터 정의
- 클래스 개발
객체지향 설계 기법
역할, 책임, 협력의 관점에서 애플리케이션을 설계하는 유용한 세 가지 기법
객체 지향 설계 - 애플리케이션의 기능을 구현하기 위한 협력 관계 고안하고 협력에 필요한 역할과 책임을 식별한 후
이를 수행할 수 있는 적절한 객체를 식별해 나가는 과정
책임-주도 설계(Responsibility-Driven Design)
협력에 필요한 책임들을 식별하고 적합한 객체에게 책임을 할당하는 방식
- 시스템이 사용자에게 제공해야 하는 기능인 시스템 책임을 파악한다
- 시스템 책임을 더 작은 책임으로 분할한다
- 분할된 책임을 수행할 수 있는 적절한 객체 또는 역할의 책임을 할당한다
- 객체가 책임을 수행하는 중에 다른 객체의 도움이 필요한 경우 이를 책임질 적 잘한 객체 또는 역할을 찾는다
- 해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력하게 한다
디자인 패턴(Design Pattern)
반복적으로 사용하는 해결 방법을 정의해 놓은 설계 템플릿의 모음
- 디자인 패턴은 책임-주도 설계의 결과를 표현한다
- 패턴은 특정한 상황에서 설계를 돕기 위해 모방하고 수정할 수 있는 과거의 설계 경험
- 반복적으로 발생하는 문제와 그 문제에 대한 해법을 정의
- 패턴은 반복해서 일어나는 특정한 상황에서 어떤 설계가 왜 더 효과적인지에 대한 이유 설명
디자인 패턴은 공통으로 사용할 수 있는 역할, 책임, 협력의 템플릿으로 책임-주도 설계의 결과물인 동시에 지름길이다.
테스트-주도 개발(Test-Driven Development)
테스트를 먼저 작성한 후 테스트를 통과하는 구체적인 코드를 추가하면서 애플리케이션을 완성해 가는 방식
- 기본 흐름은 실패하는 테스트를 작성하고, 테스트를 통과하는 가장 간단한 코드를 작성
- 이후 리펙토링을 통해 작동하는 깔끔한 코드를 얻는 것
- 객체가 이미 존재한다고 가정하고 객체에게 어떤 메시지를 전송할 것인지에 관해 먼저 생각하라고 충고
- 테스트를 작성하는 것이 아닌 책임을 수행할 객체 또는 클라이언트가 기대하는 객체의 역할이 메시지를 수신할 때 어떤 결과를 반호 나하고 그 과정에서 어떤 객체와 협력할 것인지에 대한 기대를 코드의 형태로 작성
- 책임- 주도 설계의 기본 개념을 따른다.
- 객체지향에 대한 깊이 있는 지식 요구 -> 객체가 수행하는 책임에 관해 생각하며 테스트를 작성
역할, 책임, 협력에 집중하고 객체지향의 원칙을 적용하려는 깊이 있는 고민과 노력을 통해서만 테스트-주도 개발의 혜택을 누릴 수 있다.
이를 적용한 관련 코드는 깃허브 링크를 걸겠습니다.
https://github.com/kimtaesoo99/Object_oriented
'좋은 개발자가 되기' 카테고리의 다른 글
단위테스트? 통합테스트? 런던파 vs 고전파 (1) | 2023.05.08 |
---|---|
객체지향의 사실과 오해(5장) (0) | 2023.05.01 |
객체지향의 사실과 오해(3장) (2) | 2023.04.17 |
객체지향 생활 체조 원칙 (0) | 2023.04.16 |
객체지향의 사실과 오해(2장) (0) | 2023.04.11 |