Book/객체지향의 사실과 오해

[정리] 객체지향의 사실과 오해 - 6장

따라쟁이개발자 2022. 12. 31. 10:00

06 / 객체 지도

길을 찾기 위한 두 가지 방법이 있다.

첫 번째는 다른 사람에게 길을 물어보는 것이고, 두 번째는 지도로 지형을 파악한 후 찾아가는 방법이다.

 

첫 번째 방법은 기능적이고 해결 지향적이다. 반면, 두 번째 방법은 구조적이고 문제 지향적이다. 

두 번째 지도를 활용한 방법은 길을 찾기 위한 구체적인 '기능'이 아니라, 길을 찾을 수 있는 '구조'를 제공한다.

 

6장은 객체 설계를 지도에 빗대어 기능과 구조를 사용한 설계 방법 등에 대해 설명한다.


기능 설계 대 구조 설계

사용자가 원하는 기능을 제공할 수 있다면 설계가 어떠한지는 중요하지 않을 수 있다.

다만, 이 가정은 사용자가 원하는 기능(요구사항)이 바뀌지 않는다는 전제가 필요하다.

 

요구사항은 끊임없이 변경되기 때문에 이에 빠르게 대응하기 위해선

기능에 집중하기 보다 변화에 유연하게 대응할 수 있는, 비교적 불변하는 구조에 초점을 맞춰 설계해야 한다.

 

기능 중심으로 설계를 하게 되면 요구사항이 변경될 때마다 소프트웨어 전체가 요동칠 수 있다.

 

두 가지 재료 :  기능과 구조

객체 지향 세계를 구축하기 위해선

사용자에게 제공할 '기능'과 기능을 담을 안정적인 '재료'가 필요하다

 

기능

  • 사용자의 목표를 만족시키기 위해 책임을 수행하는 시스템의 행위로 표현
  • 유스케이스 모델링 : 기능을 수집하고 표현하기 위한 기법

구조

  • 사용자나 이해관계자들이 도메인에 관해 생각하는 개념과 개념들과 관계로 표현
  • 도메인 모델링 : 구조를 수집하고 표현하기 위한 기법

 

안정적인 재료 :  구조

도메인 모델

  • 사용자가 사용하고자 하는 대상 영역에 관현 지식을 (= 도메인)
    선택적으로 단순화 하고 의식적으로 구조화한 형태 (= 모델)

 

도메인 모델은 단순한 다이어그램이 아닌

이해 관계자들이 바라보는 관점/개념. 즉, 멘탈모델로 모델링 되어야 한다.

사용자들은 도메인의 본질을 잘 이해하고 있는 사람들이며,

도메인은 쉽게 변하지 않기 때문에 기능보다 안정적인 구조를 제공할 수 있다.

 

또한 도메인 모델은

1) 사용자들이 바라보는 관점이자
2) 설계자가 시스템 구조를 바라보는 관점이며

3) 동시에 소프트웨어 내에 구현된 코드 모습이다.

 

이 세 이미지가 모두 유사한 모습을 가져야 하며 객체지향은 이를 가능하게 해준다.

세 이미지가 유사한 모습을 가져야 한다는 것은 '모방'이 필요하다는 의미가 아니다.

 

앞서 얘기 되었듯 객체지향 세계는 현실세계에 대한 '모방'이 아니며,

현실세계에서 불가능한 것들, 실제 존재하지 않는 것들이 있을 수 있다.

이런 객체지향 세계와 현실세계의 차이는 '은유'를 통해 해결될 수 있다.

 

 

불안정한 재료 :  기능

시스템은 사용자의 목표를 해결하기 위해 '기능'을 제공한다.

우리는 '기능'을 사용자-시스템 간 목표해결을 위한 '상호작용' 관점에서 바라봐야 한다.

 

유스케이스

  • 사용자와 시스템 간 상호작용을 보여주는 텍스트이다.
  • 하나의 시나리오가 아닌 여러 시나리오들의 집합이다.
  • 단순한 피처 목록과 다르다. 즉, 단순하게 기능 목록을 나열한 것과 다르다.
  • 사용자 인터페이스와 관련된 세부 정보를 포함하지 말아야 한다.
  • 내부 설계 관련 정보도 포함하지 말아야 한다.

 

유스케이스는 설계나 객체지향 기법이 아니다.

단지 사용자가 시스템을 통해 무엇을 얻을 수 있고 그 과정에서 어떻게 상호작용하는지만 기술된다.

 

재료 합치기 :  기능과 구조의 통합

도메인 모델은 안정적인 구조를 개념화하기 위한 도구이고,

유스케이스는 불안정한 기능을 서술하기 위해 사용되는 도구이다.

 

변경에 유연한 소프트웨어를 만들기 위해서는

유스케이스에 정리된 시스템 기능을 도메인 모델 기반으로 한 객체들의 책임으로 분배해야 한다.

 

책임-주도 설계는

유스케이스로부터 첫 번째 메시지와 사용자가 달성하려는 목표를 추출하고 

도메인 모델로부터 구조를 제공받아 실제 동작하는 객체들의 협력 공동체를 창조한다.

첫 번째 메시지를 통해 목표 달성을 위한 기능 제공 책임을 맡은 시스템은

맡은 책임을 시스템 내 작은 규모로 세분화하고 이 과정을 반복하면서 객체 간 협력을 완성해간다.

 

책임-주도 설계 방법은

시스템의 기능을 역할과 책임을 수행하는 객체들의 협력관계로 바라보게 함으로써

두 가지 기본재료인 유스케이스와 도메인 모델을 통합한다.