07.함께 모으기
설계를 간단히 끝내고 최대한 빨리 구현에 돌입하라. 머릿속에 객체의 협력 구조가 번뜩인다면 그대로 코드를 쿠현하기 시작하라. 설계가 제대로 그려지지 않는다면 고민하지 말고 실제로 코드를 작성해가면서 협력의 전체적인 밑그림을 그려라. 테스트-주도 설계를 코드를 구현하는 사람들이 하는 작업이 바로 이것이다. 그들은 테스트 코드를 작성해 가면서 협력을 설계한다.
Keywords
개념 관점
명세 관점
구현 관점
개념 관점(Conceptual Perspective)
설계는 도메인 안에 존재하는 개념과 개념들 사이의 관계를 표현한다.
사용자가 도메인을 바라보는 관점을 반영한다. 따라서 실제 도메인의 규칙과 제약을 최대한 유사하게 반영하는 것이 핵심이다.
명세 관점(Specification Perspective)
실제로 소프트웨어 안에서 살아 숨쉬는 객체들의 책임에 초점을 맞추게 된다. 객체의 인터페이스를 바라보게 된다.
명세 관점에서 프로그래머는 객체가 협력을 위해 '무엇'을 할 수 있는가에 초점을 맞춘다. 인터페이스와 구현을 분리하는 것은 훌륭한 객체지향 설계를 낳는 가장 기본적인 원칙이라는 점을 기억하라
구현 관점(Implementation Perspective)
객체의 챔임을 '어떻게' 수행할 것인가에 초점을 맞추며 인터페이스를 구현하는 데 필요한 속성과 메서드를 클래스에 추가한다.
클래스가 은유하는 개념은 도메인 관점을 반영한다. 클래스의 공용 인터페이스는 명세 관점을 반영한다. 클래스의 공용인터페이스는 명세 관점을 반영한다. 클래스의 속성과 메서드는 구현 관점을 반영한다.
클래스는 세 가지 관점을 모두 수용할 수 있도록 개념, 인터페이스, 구현을 함께 드러내야 한다.
동시에 코드 안에서 세 가지 관점을 쉽게 식별할 수 있도록 깔끔하게 분리해야 한다.
커피 전문점 도메인
커피 주문
우리가 할 수 있는 일은 동적인 객체를 정적인 타입으로 추상화해서 복잡성을 낮추는 것이다.
타입은 분류를 위해 사용된다는 것을 기억하라.
상태와 무관하게 동일하게 행동할 수 있는 객체들은 동일한 타입으로 분류할 수 있다.
설계하고 구현하기
커피를 주문하기 위한 협력 찾기
첫번째 목표는 훌륭한 협력을 설계하는 것이라는 점을 잊지 말자.
매사자거 객체를 선택하게 해야 한다. 이 말은 메시지를 먼저 선택하고 그 후에 메시지를 수신하기에 적절한 객체를 선택해야 한다는 것을 의미한다.
도메인 모델 안에 책임을 수행하기에 적절한 타입이 존재하는지 살펴보라. 적절한 타입을 발견했다면 책임을 수행할 객체를 그 타입의 인스턴스를 만들어라.
객체지향 세계에서는 모든 객체가 능동적이고 자율적인 존재다.
메뉴얼은 마치 생명을 가진 존재처럼 자기 스스로 메뉴 항목을 찾는다. 따라서 설계자는 무생물을 생물처럼 '의인화'해야 한다.
소프트웨어 객체는 현실 속 객체를 모방하거나 추상화한 것이다. 단지 의미를 쉽게 유추할 수 있도록 '은유'할 뿐이다.
인터페이스 정리하기
객체가 수신한 메시지가 객체의 인터페이스를 결정한다는 사실을 기억하라. 메시지가 객체를 선택했고, 선택된 객체는 메시지를 자신의 인터페이스로 받아들인다.
실제로 소프트웨어의 구현은 동적인 객체가 아닌 정적인 타입을 이용해 이뤄진디ㅏ.
따라서 객체들을 포괄하는 타입을 정의한 후 식별된 오퍼레이션을 타입의 인터페이스에 추가해야 한다.
코드와 세 가지 관점
코드는 세 가지 관점을 모두 제공해야 한다.
개념 관점
소프트웨어 클래스가 도메인 개념의 특성을 최대한 수용하면 변경을 관리하기 쉽고 유지보수성을 향상시킬 수 있다.
소프트웨어 클래스와 도메인 클래스 사이의 간격이 좁으면 좁을수록 기능을 변경하기 위해 뒤적거려야 하는 코드의 양도 점점 줄어든다.
명세 관점
객체의 인터페이스는 수정하기 어렵다는 사실을 명심하라.
최대한 변화에 안정적인 인터페이스를 만들기 위해서는 인터페이스를 통해 구현과 관련된 세부 사항이 드러나지 않게 해야 한다.
구현 관점
클래스의 메서드와 속성은 구현에 속하며 공용 인터페이스의 일부가 아니다.
메서드의 구현과 속성의 변경은 원칙적으로 외부의 객체에게 영향을 미쳐서는 안 된다. (원칙적이라는 말 속에는 현실적으로 100% 파급효과가 미치는 것을 막는 것이 불가능한 경우도 있다는 것을 암시한다.)
이것은 메서드와 속성이 철저하게 클래스 내부로 캘슐화돼야 한다는 것을 의미한다.
도메인 개념을 참조하는 이유
도메인 개념 안에서 적절한 객체를 선택하는 것은 도메인에 대한 지식을 기반으로 코드의 구조와 의미를 쉽게 유추할 수 있게 한다.
이것은 시스템의 유지보수성에 커다란 영향을 미친다.
인터페이스와 구현을 분리하라.
다시 한 번 강조한다. 인터페이스와 구현을 분리하라.
명세 관점과 구현 관점을 분리하는 것은 매우 중요하다는 주장한다.
실제로 훌륭한 설계를 결정하는 측면은 명세 관점인 객체의 인터페이스다.
명세 관점이 설계를 주도하게 하면 설계의 품질이 향상될 수 있다는 사실을 기억하라.
Last updated
Was this helpful?