마틴 파울러는 UML Distilled에서 객체지향 설계 안에 존재하는 세 가지 상호 연관된 관점에 관해 설명한다.
개념 관점, 명세 관점, 구현 관점
개념관점(Conceptual Perspective)에서 설계는 도메인 안에 존재하는 개념과 개념들 사이의 관계를 표현
도메인이란 사용자들이 관심을 가지고 있는 특정 분야나 주제를 말한다.
소프트웨어는 도메인에 존재하는 문제를 해결하기 위해 개발된다.
개념 관점은 사용자가 도메인을 바라보는 관점을 반영한다
명세 관점(Specification Perspective)에 이르면 사용자 영역인 도메인을 벗어나 개발자의 영역인 소프트웨어로 초점이 옮겨진다.
소프트웨어 안에 살아 숨쉬는 객체들의 책임에 초점(객체의 인터페이스)
객체가 협력을 위해 '무엇'을 할 수 있는가에 초점
인터페이스와 구현을 철저히 분리
구현 관점(Implementation Perspective) 실제 작업을 수행하는 코드와 연관
즉, 객체들이 책임을 수행하는 메서드를 작성
여기서는 '어떻게' 수행할지 초점
인터페이스 구현할 속성, 클래스, 메서드를 추가
위 세 가지 관점은 순서대로 진행이 아닌 세 가지 관점에서 바라보는 것이다.
클래스는 세 가지 관점을 모두 수용할 수 있도록 개념, 인터페이스, 구현을 함께 드러내야 한다.
코드 안에서 세 가지 관점을 쉽게 식별할 수 있도록 깔끔하게 분리해야 한다.
협력 안에서 메시지를 선택하고 메시지를 수신할 객체를 선택하는 것은 객체의 인터페이스, 즉 명세 관점에서 객체를 바라보는 것
코드와 세 가지 관점
코드는 세 가지 관점을 모두 제공해야 한다
개념의관점에서 코드
소프트웨어 클래스가 도메인 개념의 특성을 최대한 수용하면 변경을 관리하기 쉽고 유지보수성을 향상시킬 수 있다.
소프트웨어 클래스와 도메인 클래스 사이의 간격이 좁으면 좁을수록 기능을 변경하기 위해 뒤적거려야 하는 코드의 양도 점점 줄어든다.
명세 관점은 클래스의 인터페이스를 바라본다.
공용(public)인터페이스만이 외부 객체가 해당 객체에 접근할 수 있는 유일한 부분
객체의 인터페이스는 수정하기 어렵다. 최대한 변화에 안정적인 인터페이스를 만들기 위해 구현과 관련된 세부사항을 캡슐화한다.
구현 관점은 클래스의 내부 구현을 바라본다.
클래스의 메서드와 속성은 구현에 속하며 공용 인터페이스의 일부가 아니다. 따라서 메서드와 속성의 변경은 원칙적으로 외부에 영향을 미쳐선 안된다. 다만, 100% 막는 것은 현실적으로 힘들다.
이 말은 철저한 캡슐화를 해야한다는 것이다.
훌륭한 객체지향 프로그래머는 하나의 클래스 안에 세 가지 관점을 모두 포함하면서도 각 관점에 대응되는 요소를 명확하고 깔끔하게 드러낼 수 있다.
도메인 개념을 참조하는 이유
도메인 개념 안에서 적절한 객체를 선택하는 것은 도메인에 대한 지식을 기반으로 코드의 구조와 의미를 쉽게 유추할 수 있게 한다.
이것은 시스템의 유지보수성에 커다란 영향을 미친다.
소프트웨어는 항상 변한다. 설계는 변경을 위해 존재한다.
여러 개의 클래스로 기능을 분할하고 클래스 안에서 인터페이스와 구현을 분리하는 이유는 변경에 유연하게 대처하기 위함이다.
인터페이스와 구현을 분리하라
명세 관점과 구현 관점이 뒤섞이면 안된다.
명세 관점은 클래스의 안정적인 측면을
구현 관점은 클래스의 불안정한 측면을 드러낸다.
'IT책, 강의 > 객체지향의 사실과 오해(역할, 책임, 협력 관점에서 본 객체지향)' 카테고리의 다른 글
부록 A 추상화 기법 - 2 (0) | 2023.01.07 |
---|---|
부록 A 추상화 기법 - 1 (0) | 2023.01.04 |
06 객체 지도 - 2 (0) | 2022.12.29 |
06 객체 지도 - 1 (1) | 2022.12.24 |
05 책임과 메시지 -2 (0) | 2022.12.22 |