2023.08.07 MON
77p ~ 91p
6일차 내용 ⬇️
2023.08.07 - [개발 서적 기록/오브젝트_조영호] - 6일차 - 합성을 통한 코드 재사용과 협력
6일차 - 합성을 통한 코드 재사용과 협력
2023.08.06 SUN 65p ~ 77p 5일차 내용 ⬇️ 2023.08.04 - [개발 서적 기록/오브젝트_조영호] - 5일차 - 상속과 다형성의 목적 5일차 - 상속과 다형성의 목적 2023.08.04 FRI 50p ~ 64p 4일차 내용 ⬇️ 2023.08.04 - [개발
magenta-ming.tistory.com
객체의 행동의 책임
객체지향의 넓은 관점에서 객체는 협력, 책임, 역할으로 구성되어 있다.
그 중, 협력에 참여하기 위해 객체가 수행하는 행동이 책임이다.
이런 책임을 정의하기 위해서는 이 객체가 하는 행위와, 이 객체가 어떤 정보/객체를 알아야 하는지 파악해야한다.
객체는 자신이 맡은 책임을 수행하는데 필요한 정보를 알고 있을 책임이 있기 때문이다.
어떤 책임을 수행하기 위해서는 그 책임을 수행하는 데 필요한 정보도 함꼐 알아야할 책임이 있다.
그래서 얼마나 적절한 책임을 할당하느냐가 설계의 전체적인 품질을 결정한다.
책임을 정의하기 위해선 문맥이 필요하다
시스템이 사용자에게 제공하는 기능을, 시스템이 담당할 하나의 책임으로 바라봐야한다.
이 객체는 어떤 객체로 메시지를 처리하게 해야할것인지의 흐름, 문맥이 책임을 정의하는데 중요한 요소가 된다.
객체 지향 설계는 협력에 필요한 메시지를 찾고, 메시지에 적절한 객체를 선택하는 반복적인 과정을 통해 이루어진다.
이런 메시지는, 메시지를 수신할 객체의 책임을 결정한다.
그리고, 메시지가 객체의 public interface를 구성하게된다.
책임 할당 고려 요소 : 메시지가 객체를 결정한다.
왜냐하면 인터페이스를 결정하기 때문이다.
메시지를 통해서, 객체가 최소한의 인터페이스를, 추상적인 인터페이스를 가질 수 있게 된다.
필요한 메시지가 식별될 때까지, 객체의 퍼블릭 인터페이스에 어떤 것도 추가하지 않기에 최소한의 인터페이스를 가질 수 있다.
객체의 인터페이스는 무엇을 하는지는 표현하지만, 세부적인 행동 즉 어떻게 수행하는지는 노출되어서는 안되므로, 추상화된 인터페이스를 가질 수 있다.
책임 할당 고려 요소 : 행동이 상태를 결정한다.
객체에 필요한 상태가 무엇인지를 결정한 다음, 행동을 결정하게되면 캡슐화를 저해한다.
객체의 내부 구현이 객체의 퍼블릭 인터페이스에 노출되도록 만들기 때문이다.
그래서 객체의 내부 구현을 변경하면 인터페이스도 함께 변경되게되고, 이 객체에 의존하고 있는 클라이언트에게도 영향이 간다.
객체의 역할
역할은 객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합이다.
역할을 통해서 유연하고 재사용 가능한 협력을 구성할 수 있다.
협력 안에서, 여러 종류의 구현 객체를 교대로 유연하게 사용할 수 있는 슬롯처럼 적용할 수 있기 때문이다.
각 영화에서 가격할인정책을 적용하는 협력과, 비율할인정책을 적용하는 협력을 별개로 생각한다면, 즉 하나의 역할로 생각하지 않는다면 코드는 중복되고 변경에도 유연하지 않다.
여기에 할인 요금을 계산한다는 역할을 영화 객체에 부여하면 개선할 수 있다.
실제 프로젝트에서도 책임을 적절히 분배하도록 개선한 경험이 있다.
'오늘 하루를 그려줘' 프로젝트에서, 일기 생성 요청을 처리할때, 일기 객체의 생성자 메서드로 일기의 local datetime을 넘겨줘야했다.
기존에는 서비스메서드에서 처리해서 생성자 파라미터로 넘겨줬었다.
하지만 일기의 날짜를 처리하는 책임은 일기 도메인 객체에 있다.
따라서, 일기 생성자 메서드에서, 일기의 날짜를 처리하는 내부 메서드를 호출하게 만들었다.
이러한 개선은 적절한 책임을 분배해서 객체 지향적인 코드를 작성했다는 이점이 있다.
그리고 더 나아가, 추후에 일기의 날짜를 처리하는 로직이 바뀌게되었을때에 변경에 유연했다.
일기 도메인 객체 내부의 코드를 바꾸면 될 뿐, 일기 생성 서비스 메서드를 수정하지 않았고 그럼으로써 일기 생성에 관한 테스트 코드도 수정할 폭이 매우 적었다.
'개발 서적 기록 > 오브젝트_조영호' 카테고리의 다른 글
9일차 - 캡슐화, 응집도 그리고 결합도 (0) | 2023.08.09 |
---|---|
8일차 - 추상화를 통한 역할 부여 그리고 책임 중심 설계 (0) | 2023.08.09 |
6일차 - 합성을 통한 코드 재사용과 협력 (2) | 2023.08.07 |
5일차 - 상속과 다형성의 목적 (0) | 2023.08.04 |
4일차 - 객체 지향 설계를 위한 자세 (0) | 2023.08.04 |