본문 바로가기

공부기록/객체지향

객체지향의 사실과 오해 - Chapter 7 함께 모으기

코드와 모델을 밀접하게 연관시키자

마틴 파울러의 객체지향 설계 안에 존재하는 세 가지 상호 연관된 관점

  • 개념 관점
    • 도메인 안에 존재하는 개념과 개념들 사이의 관계
    • 도메인에 존재하는 문제를 해결하기 위해 개발됨
    • 도메인의 규칙과 제약을 최대한 유사하게 반영
  • 명세 관점
    • 소프트웨어로 초점이 옮겨짐
    • 객체들의 책임에 초점을 맞추게 됨(객체의 인터페이스를 바라봄)
  • 구현 관점
    • 객체들이 책임을 수행하는 데 필요한 동작하는 코드를 작성(how)

개념 관점, 명세 관점, 구현 관점은 동일한 클래스를 세 가지 다른 방향에서 바라보는 것.

클래스는 세 가지 관점을 모두 수용할 수 있도록 개념, 인터페이스, 구현을 함께 드러내야 한다.

목표

  • 도메인 모델에서 시작해서 최종 코드까지의 구현 과정을 간략하게 설명
  • 구현 클래스를 개념 관점, 명세 관점, 구현 관점에서 바라본다는 것의 의미를 설명

도메인 모델에서 최종 코드까지

  1. 문제에서 객체를 파악하고, 객체를 정의함
  2. 객체들 사이의 관계를 파악
  3. 도메인 모델을 작성
  4. 협력을 설계
  5. 메시지 찾기
  6. 메시지를 처리하기에 적합한 객체를 선택
  7. 객체가 받게 될 메시지를 정리
  8. 인터페이스로 변경
  9. 빠르게 구현하기
  10. 머릿속으로만 구상한 설계는 코드로 구현하는 단계에서 대부분 변경되기 때문에 설계에서 너무 많은 시간을 쏟지 말고, 최대한 빨리 구현해서 설계에 이상이 없는지, 설계가 구현 가능한지를 판단해야 함
  11. 일반적으로 구현하면서 설계를 수정하게 됨

코드의 세 가지 관점

개념 관점

현실세계의 Barista = 소프트웨어의 Barista 클래스

하는 일이 일치하면 이해하기가 쉬움. 일치할수록, 변경사항이 생겼을 때 뒤적거려야 하는 코드의 양이 줄어듦

명세 관점

인터페이스를 바라봄. 인터페이스와 구현을 분리해야 함. 변화에 탄력적인 인터페이스를 만들 수 있는 능력은 객체지향 설계자의 수준을 가늠하는 중요한 척도

구현 관점

클래스의 내부 구현을 바라봄. 메서드의 구현과 속성의 변경은 원칙적으로 외부의 객체에 영향을 미쳐서는 안 됨.

훌륭한 객체지향 프로그래머는 하나의 클래스 안에 세 가지 관점을 모두 포함하면서도 각 관점에 대응되는 요소를 명확하고 깔끔하게 드러낼 수 있다.

  • 도메인 개념을 참조하는 이유

그 메시지를 수신할 객체를 어떻게 선택하는가? 도메인 개념 중에서 가장 적절한 것을 선택하는 것.

  • 인터페이스와 구현을 분리하라

명세 관점과 구현 관점이 뒤섞여 머릿속을 함부로 어지럽히지 못하게 해야 한다. 명세 관점 → 클래스의 안정적인 측면을 드러내야 한다. 구현 관점→ 클래스의 불안정한 측면을 드러내야 한다.

세 가지 관점 모두에서 클래스를 바라볼 수 있으려면 훌륭한 설계가 뒷받침돼야 하는 것이다.

이 책 —> 어떻게 하면 객체지향적으로 설계할 수 있는지 알려주는 책.

나중에 한 번 더 읽고 전체적으로 요약해야 할 것이다.