티스토리 뷰
객체지향에 갓 입문한 사람들의 가장 흔한 실수는 협력
이라는 문맥을 고려하지 않은 채 객체가 가져야 할 상태
와 행동
부터 고민하기 시작한다는 것이라고 이 책에서 말하고 있습니다. 저 또한 상태와 행동에 해당하는 필드와 메서드부터 고민을 시작하며 객체를 만들고자 했던 것 같습니다. 이런 실수로 인해 진정한 의미를 담은 객체를 온전히 만들어내지 못했던 점을 반성하게 됩니다.
협력
협력의 본질은 요청
과 응답
으로부터 시작합니다. 하나의 요청은 다른 요청을 발생시키고 그래프처럼 퍼져나가게 됩니다. 결국 네트워크가 구성되고 네트워크 안에서 협력은 필연적으로 존재합니다.
요청 속에는 해당 객체의 의무도 담겨 있습니다. 의무를 다해야 하지만 해당 객체로는 부족하기에 요청이 발생하게 되는 것입니다. 요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의합니다.
책임
객체지향 개발에서 가장 중요한 능력은 책임을 능숙하게 소프트웨어 객체에 할당하는 것이라 책에서 소개하고 있습니다. 책임을 어떻게 구현할 것인가 하는 문제는 객체와 책임이 제자리를 잡은 후에 고려해도 늦지 않다고 말합니다.
책임은 객체가 알아야 하는 정보와 객체가 수행할 수 있는 행위에 대해 개략적으로 서술한 문장입니다. 즉, 책임은 객체의 외부에 제공해줄 수 있는 정보와 외부에 제공해 줄 수 있는 서비스의 목록을 의미합니다.
메시지
객체가 다른 객체에게 주어진 책임을 수행하도록 요청을 보내는 것을 메시지 전송(message-send)
이라고 합니다. 두 객체 간의 협력을 메시지를 통해 이루어집니다. 주의할 점은 책임과 메시지의 수준이 같지 않음을 이해해야 합니다. 객체의 책임이 결정되었으면 정제하면서 메시지로 변환 시 여러 메시지로 분할되는 것이 일반적입니다.
역할
역할은 협력 내에서 다른 객체로 대체할 수 있음을 나타내는 일종의 표식입니다. 이를 통해 다양한 객체들이 협력에 참여할 수 있으므로 협력이 조금 더 유연해지며 재사용성이 높아집니다. 최종적으로는 협력을 추상화할 수 있다는 것이 가장 큰 가치입니다.
객체의 모양을 결정하는 협력
시스템에 필요한 데이터를 저장하기 위해 객체가 존재하는 것이 아닌 행위를 수행하며 협력에 참여하기 위해 객체가 존재함을 이해해야 합니다. 객체지향이 클래스와 클래스 간의 정적인 관계를 표현하는 것이 아닌 협력에 참여하는 객체와 객체 간의 동적인 관계를 표현하는 것도 인지해야 합니다. (아직은 저도 가슴 깊게 와닿지는 않습니다.)
결국 올바른 객체를 설계하기 위해서는 먼저 견고하고 깔끔한 협력을 설계해야 합니다. 협력이라는 문맥 안에서 책임을 적절하게 분배해야 합니다. 이 과정 속 객체가 가져야 하는 상태와 행위가 결정됩니다. 결국 협력에서부터 상태와 행위가 결정되게 되는 것입니다.
객체지향 설계 기법
역할
, 책임
, 협력
의 관점에서 애플리케이션을 설계하는 유용한 세 가지 기법을 소개하고 있습니다.
책임-주도 설계
책임-주도 설계는 말 그대로 객체의 책임을 중심으로 시스템을 구축하는 설계 방법을 말합니다. 시스템의 책임을 객체의 책임으로 변환하고, 각 객체가 책임을 수행하는 중에 필요한 정보나 서비스를 제공해줄 협력자를 찾아 해당 협력자에게 책임을 할당하는 순차적인 방식으로 객체들의 협력 공동체를 구축합니다.
절차는 다음과 같이 요약할 수 있습니다.
- 시스템이 사용자에게 제공해야 하는 기능인 시스템 책임을 파악한다.
- 시스템 책임을 더 작은 책임으로 분할한다.
- 분할된 책임을 수행할 수 있는 적절한 객체 또는 역할을 찾아 책임을 할당한다.
- 객체가 책임을 수행하는 중에 다른 객체의 도움이 필요한 경우 이를 책임질 적절한 객체 또는 역할을 찾는다.
- 해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력하게 된다.
디자인 패턴
일반적으로 디자인 패턴은 반복적으로 발생하는 문제와 그 문제에 대한 해법의 쌍으로 정의됩니다. 디자인 패턴은 공통으로 사용할 수 있는 역할, 책임, 협력의 템플릿입니다. 책임-주도 설계의 결과물인 동시에 지름길입니다.
테스트-주도 개발
테스트-주도 개발의 기본 흐름은 실패하는 테스트를 작성하고, 테스트를 통과하는 가장 간단한 코드를 작성한 후, 리팩토링을 통해 중복을 제거하는 것입니다. 이를 통해 작동하는 깔끔한 코드를 얻을 수 있습니다.
이를 처음 접하는 사람들은 어려움이 존재할 수 있습니다. 객체지향에 대한 깊이 있는 지식을 요구하기 때문입니다.
'도서 > 객체지향의 사실과 오해' 카테고리의 다른 글
객체 지도 (0) | 2022.08.04 |
---|---|
책임과 메시지 (0) | 2022.07.29 |
타입과 추상화 (0) | 2022.06.18 |
이상한 나라의 객체 (0) | 2022.06.16 |
협력하는 객체들의 공동체 (0) | 2022.06.16 |