6장 - 객체지도
유일하게 변하지 않는 것은 모든 것이 변한다는 사실 뿐이다.
1. 길을 직접 알려주는 방법 vs 지도를 이용하는 방법
- 길을 직접 알려주는 방법(기능적인방법)
- 기능적이고 해결 방법 지향적인 접근법
- 길을 찾는데 필요한 구체적인 기능을 제공한다.
- 현재의 요구만을 만족시킬 수 있다.
- 지도를 이용하는 방법(구조적인방법)
- 구조적이고 문제 지향적인 접근법
- 길을 찾는데 필요한 구조를 제공한다.
- 다양한 목적을 위해 재사용될 수 있다.(범용적이다)
- 지도를 제작한 사람들이 지도를 만들 때는 지도를 사용할 사람이 구체적으로 어떤 목적으로 사용할지 알지 못한다.
2. 기능설계 구조설계
- 모든 소프트웨어 제품의 설계에는 두가지 측면이 존재한다.
- 기능적인 측면 : 설계는 제품이 사용자를 위해 무엇을 할 수 있는지에 초점을 맞춘다.
- 구조적인 측면 : 제품의 형태가 어떠해야 하는지에 초점을 맞춘다. > 설계의 가장 큰 도전은 기능과 구조라는 두가지 측면을 함께 녹여 조화를 이루도록 만드는 것이다.
- 설계가 어려운 이유는?
- 내일 당장 요구사항이 변경될 수 있으며 어떤일이 발생할지 아무도 모른다.
- 즉 미래를 예측할 수는 없지만 대비는 가능하다.
- 미래에 대비하는 가장 좋은 방법?
- 설계를 하는 목적은 나중에 설계 하는 것을 허용하는 것이며 일차적인 목표는 변경에 소요되는 비용을 낮추는 것이다.
- 변경에 대비하고 여지를 남겨놓기 위해 구조를 중심으로 설계를 해야한다.
- 전통적인 기능 분해 방법이 좋지 않은 이유
- 기능은 더 작은 기능으로 분해되고 각 기능은 서로 밀접하게 관련된 하나의 덩어리를 이룬다.
- 기능이 변경된다면 기능의 축을 따라 설계된 시스템 전체가 흔들리게 된다.
- 객체지향 접근방법
- 자주 변경되지 않는 안정적인 객체 구조를 바탕으로 시스템 기능을 객체간의 책임으로 분배한다.
- 구조에 집중하고 기능이 객체의 구조를 따르게 만들어야 한다.
- 기능은 더 작은 책임으로 분할되고 적절한 객체에게 분배되기 때문에 기능이 변경 되더라도 객체 간의 구조는 그대로 유지된다.
객체를 이용해서 지도를 만들어라 !
3. 두가지 재료: 기능과 구조
- 객체지향 세계를 구축하기 위해 사용자에게 제공할 “기능”과 기능을 담을 안정적인 구조라는 재료가 준비 되어있어야 한다.
- 기능과 구조를 표현하기 위해 일관되게 적용할 수 있는 방법 2가지
- 구조는 사용자나 이해관계자들이 도메인에 관해 생각하는 개념과 개념들 간의 관계로 표현한다.
- 기능은 사용자의 목표를 만족시키기 위해 책임을 수행하는 시스템의 행위로 표현한다.
- 기능을 수집하고 표현하기 위한 기법을 유스케이스 모델링이라고 하고 구조를 수집하고 표현하기 위한 기법을 도메인 모델링 이라 한다.
4. 안정적인 재료 : 구조
- 도메인이란
- 사용자가 프로그램을 사용하는 대상 분야를 의미한다.
- 모델이란
- 대상을 단순화해서 표현한 것
- 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태
- 복잡성의 바다에서 길을 잃지 않고 주요한 문제에 집중할 수 있도록 필요한 지식만 재구성 한 것
- 즉 추상화하고 단순화 한 것
- 도메인 모델이란
- 사용자가 프로그램을 사용하는 대상 영역에 관한 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태를 뜻한다.
- 소프트웨어가 목적하는 영역 내의 개념과 개념 간의 관계, 다양한 규칙이나 제약 등을 주의 깊게 추상화 한 것이다.
- 소프트웨어 개발과 관련된 이해관계자들이 도메인에 대해 생각하는 관점이다.
- 도메인 모델은 이해관계자들이 바라보는 멘탈 모델이다.
- 멘탈모델 - 사람들이 자기 자신, 다른 사람, 환경, 상호작용하는 사물에 대해 갖는 모형을 뜻함
- 소프트웨어 사용자들은 도메인에 존재하는 현상을 이해하고 현상에 반응하기 위해 도메인과 관련된 멘탈 모델을 형성한다.
- 설계자는 도메인에 대한 디자인모델을 기반으로 만든 시스템 이미지가 사용자 모델을 정확하게 반영하도록 노력해야 한다.
- 설계자가 만든 시스템이 사용자가 생각하는 시스템을 정확히 반영하도록 해야하며 도메인 모델은 이를 모두 포괄하도록 하는 멘탈 모델이다.
최종 제품은 사용자의 관점을 반영해야 한다. 이는 곧 애플리케이션이 도메인 모델을 기반으로 설계되어야 한다는 것을 의미한다.
- 표현적 차이
- 객체는 현실을 모방한 것이 아닌 은유를 기반으로 재창조 한 것이다.
- 소프트웨어 객체와 현실 객체 사이의 의미적 거리를 표현적 차이 또는 의미적 차이라고 한다.
- 대부분의 소프트웨어 도메인은 가상의 세계를 대상으로 하기 때문에 객체를 창조하기 위해 우리가 은유해야 하는 대상은 도메인 모델이다.
- 코드의 구조가 도메인 구조를 잘 반영한 경우 도메인을 이해하면 코드를 이해하기 훨씬 수월해지며 표현적 차이가 중요한 이유다.
- 불안정한 기능을 담는 안정적인 도메인 모델
- 도메인에 대한 사용자의 관점을 반영하는 이유는 도메인의 본질을 잘 이해하고 있기 때문이다.
- 본질적이란 뜻은 변경이 적고 비교적 그 특성이 오랜 시간 유지된다는 것을 의미한다.
- 도메인을 구성하는 중요한 개념과 관계를 가장 잘 알고있는 사람들이기 때문이다.
결론 : 안정적인 구조를 제공하는 도메인 모델을 기반으로 소프트웨어의 구조를 설계하면 변경에 유연하게 대처할 수 있는 탄력적인 소프트웨어를 만들 수 있다.
5. 불안정한 재료 : 기능
훌륭한 기능적 요구사항을 얻기 위해서는 목표를 가진 사용자와 사용자의 목표를 만족시키기 위해 일련의 절차를 수행하는 상호작용 관점에서 시스템을 바라봐야 한다.
- 유스케이스
- 사용자의 목표를 달성하기 위해 사용자와 시스템 간에 이뤄지는 상호작용의 흐름을 텍스트로 정리한 것
- ex) 이자 계산 유즈케이스(책 참조 : 193p)
- 유스케이스의 가치는 사용자들의 목표를 중심으로 시스템의 기능적인 요구사항들을 이야기 형식으로 묶을 수 있다.
- 흩어져 있는 기능에 사용자 목표라는 문맥을 제공함으로써 각 기능이 유기적인 관계를 지닌 체계를 이룰 수 있게 한다.
- 유스케이스 특성
- 유스케이스는 사용자와 시스템 간의 상호작용을 보여주는 텍스트다.
- 유스케이스의 핵심은 사용자와 시스템 간의 상호작용을 일련의 이야기 흐름으로 표현하는 것이다.
- 유스케이스 하나의 시나리오가 아니라 여러 시나리오의 집합이다.
- 유스케이스는 단순한 피처 목록과 다르다.
- 피처 : 시스템이 수행해야 하는 기능의 목록을 단순하게 나열한 것
- 유스케이스 : 이야기를 통해 연관된 기능들을 함께 묶을 수 있다.
- 유스케이스는 사용자 인터페이스와 관련된 세부 정보를 포함하지 말아야한다.
- 유스케이스는 내부 설계와 관련된 정보를 포함하지 않는다.
유스케이스는 시스템의 내부 구조나 실행 메커니즘에 관한 어떤 정보도 제공하지 않는다. 단지 사용자가 바라보는 시스템의 외부 관점만을 표현한다는 것에 주목하라
6. 재료 합치기 : 기능과 구조의 통합
- 도메인 모델은 안정적인 구조를 개념화하기 위해 유스케이스는 불안정한 기능을 서술하기 위해 가장 일반적으로 사용되는 도구다.
- 변경에 유연한 소프트웨어를 만들기 위해서는 유스케이스에 정리된 시스템의 기능을 도메인 모델을 기반으로 한 객체들의 책임으로 분배해야 한다.
7. 기능 변경을 흡수하는 안정적인 구조
- 연결완전성
- 객체지향의 가장 큰 장점은 도메인을 모델링하기 위한 기법과 도메인을 프로그래밍하기 위해 사용하는 기법이 동일하다. 이는 도메인 모델링에서 사용한 객체와 개념을 프로그래밍 설계에서 객체와 클래스로 매끄럽게 변환할 수 있는 특성이다.
- 가역성
- 코드의 변경으로부터 도메인 모델의 변경 사항을 유추할 수 있다. 코드에서 모델로의 매끄러운 흐름을 의미하는 것을 의미한다.