[객체지향의 사실과 오해] 07 함께 모으기
07 함께 모으기
7장은 마틴 파울러의 객체지향 설계의 세 가지 관점에 대해 소개하며 도메인 모델에서부터 최종 코드까지의 구현 과정을 커피 전문점이라는 예제를 통해 설명하고, 구현 클래스를 이 세가지 관점에서 바라본다는 것이 무엇인지를 설명한다.
마틴 파울러의 세 가지 관점은 다음과 같다.
개념 관점(Conceptual Perspective)
사용자가 도메인을 바라보는 관점을 반영한다. 설계는 도메인 안에 존재하는 개념과 개념들 사이의 관계를 표현하고, 실제 도메인의 규칙과 제약을 최대한 유사하게 반영하는 것이 핵심이다.
명세 관점(Specification Perspective)
객체의 인터페이스 관점에서, 프로그래머는 객체가 협력을 위해 ‘무엇을’ 할 수 있는가에 초점을 맞춘다.
구현 관점(Implementation Perspective)
객체들이 책임을 수행하는 데 필요한 코드를 작성하는 것으로, 프로그래머는 객체의 책임을 ‘어떻게’ 수행할 것인가에 초점을 맞춘다.
위의 세 가지 관점은 동일한 클래스를 세 가지 다른 방향에서 바라보는 것을 의미하며, 클래스는 세 가지 관점을 모두 수용할 수 있도록 개념, 인터페이스, 구현을 함께 드러내는 동시에 쉽게 식별할 수 있도록 깔끔하게 분리해야 한다. 특히나 저자가 강조했던 인터페이스와 구현의 분리는 명세 관점과 구현 관점을 명확하게 분리하는 것에서 시작된다.
개념 관점에서 소프트웨어 클래스가 도메인 개념의 특성을 최대한 수용하면 변경을 관리하기 쉽고 유지보수성을 향상시킬 수 있다. 소프트웨어 클래스와 도메인 클래스 사이의 간격이 좁으면 좁을수록 기능을 변경하기 위해 살펴보아야 할 코드의 양도 줄어든다. 명세 관점은 클래스의 인터페이스를 바라보는데, 객체의 인터페이스는 수정하기 어려우므로 최대한 변화에 안정적인 인터페이스를 만드려면 인터페이스를 통해 구현과 관련된 세부 사항이 드러나지 않게 해야 한다. 구현 관점은 클래스의 내부 구현을 바라보며, 클래스의 메서드와 속성은 공용 인터페이스의 일부가 아닌 구현에 속하며 따라서 메서드와 속성은 철저히 클래스 내부로 캡슐화되어 외부의 객체에 영향을 미쳐서는 안된다.
훌륭한 객체지향 설계는 하나의 클래스 안에 세 가지 관점을 모두 포함하면서도 각 관점에 대응되는 요소를 명확하고 깔끔하게 드러낼 수 있어야 한다.
커피전문점 에제를 통해 코드로 구현하는 과정은 직접 생각해보며 책을 통해 확인하는 것이 더 좋을 것 같아 생략했다.
드디어 다 읽었다!