부록 C. 동적인 협력, 정적인 코드
- 프로그래머가 객체지향 프로그램을 작성하기 위해서는 두 가지 모델을 동시에 마음 속에 그려야합니다.
- 동적 모델(dynamic model) : 프로그램 실행 구조를 표현하는 움직이는 모델
- 정적 모델(static model) : 코드의 구조를 담는 고정된 모델
- 객체지향 세계에서 동적 모델은 객체와 협력으로 구성됩니다.
- 객체지향 세계에서 정적 모델은 타입과 관계로 구성됩니다.
- 정적 모델은 동적 모델에 의해 주도돼야 하고 동적 모델이라는 토대 위에 세워져야 합니다.
- 동적 모델을기반으로 정적 모델을 구상할 때 고려해야 하는 중요한 요소는 변경입니다.
- 수정이 용이한 코드란 응집도가 높고, 결합도가 낮으며, 단순해서 쉽게 이해할 수있는 코드입니다.
- 유연한 코드란 동일한 코드를 이용해 다양한 컨텍스트에서 동작 가능한 협력을 만들 수 있는 코드입니다.
- 수정이 용이한 코드와 유연한 코드에 대한 욕구는 중복 코드를 제거하게 만드는 가장 큰 압력입니다.
#
동적 모델과 정적 모델#
행동이 코드를 결정한다- 협력에 참여하는 객체의 행동이 객체의 정적 모델을 결정합니다.
- 동적 모델이 정적 모델을 결정해야 합니다.
#
변경을 고려하라- 객체가 제공하는 행동의 측면에서 적절하게 정적 모델을 고려하더라도 변경을 고려하지 않는다면 유지보수하기 어려운 코드가 만들어집니다.
#
도메인 모델과 구현#
도메인 모델에 관하여- 도메인(domain) 이란 사용자가 프로그램을 사용하는 대상 영역을 가리킵니다.
- 모델(model) 이란 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태입니다.
- 도메인 모델(domain model) 이란 사용자가 프로그램을 사용하는 대상 영역에 대한 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태입니다.
모델은 옭거나 틀린 것이 아니라, 모델은 유용하거나 유용하지 않은 정도의 차이만 있을 뿐입니다.
- 중요한 것은 객체들의 협력을 지원하는 코드 구조를 만드는 것입니다.
#
몬스터 설계하기- 몬스터가 많아질 수록 기존 추상화 클래스로는 힘듭니다.
- 이를 해결하기 위해서 합성을 사용할 수 있습니다. (새로운 클래스를 만들지 않기 위해서)
- 어떤 인스턴스가 다른 인스턴스의 타입을 표현하는 방법을 TYPE OBJECT 패턴이라고 부릅니다.
#
행동과 변경을 고려한 도메인 모델- 우리는 도메인 모델을 먼저 만들고 만들어진 도메인 모델에 표현된 개념과 관계를 기반으로 협력에 필요한 객체의 후보를 도출하고 구현 클래스의 이름과 관계를 설계합니다.
- 그러나, 더 많은 지식이 쌓이고 요구사항이 분명해지면 초기의 아이디어에 대한 미련을 버리고 현명한 판안을 내려야 합니다.
- 도메인 모델이 단순히 정적 모델의 형태를 띨 필요가 없으며 도메인 모델의 구조가 코드와 다를 필요가 없습니다.
#
분석 모델, 설계 모델, 그리고 구현 모델- 도메인 모델이 코드와 동일한 형태를 가진다는 것은 분석, 설계, 구현에 걸쳐 동일한 모델을 사용한다는 것을 의미합니다.
- 분석과 설계와 구현 간의 구분이 방법론과 프로젝트 관리를 위해 필요한 중요 요소라 하더라도 모델과 코드 간의 관계에 이를 강요해서는 안됩니다.
- 코드와 모델의 차이를 줄이기 위해서는 도메인과 코드 간의 차이가 적어야 합니다.
- 객체지향 패러다임이 강력한 이유는 전체 개발 주기에 걸쳐 동일한 기법과 표현력을 유지할 수 있다는 점입니다. 즉, 모든 단계에 걸쳐 행동과 변경에 초점을 맞춰야합니다.