클래스는 개념, 명세, 구현 관점에서 검토한다

MinHwi·2022년 11월 24일
0
  • 공부 내용 : 객체지향의 사실과 오해 7장
  • 공부 기간 : 2022년 11월 23일 수요일

기억하고 싶은 것

변경에 유연하게 대응할 수 있는 객체를 작성하는 가장 빠른 방법은 클래스가 개념, 명세, 구현 관점을 명확하게 드러내도록 하는 것이다. 개념은 도메인 모델로부터, 명세는 메시지(안정적인 영역)로부터, 구현은 클래스의 가변적 영역을 드러낸다.

객체지향 시스템을 설계할 때, 도메인 모델을 우선 표현해야 한다. 그리고 객체의 협력 관계를 만들어 인터페이스를 얻는다. 첫 메시지는 기능으로부터 얻고, 객체의 선택은 도메인 모델을 바탕으로 한다. 객체가 수행할 수 없는 책임이 등장하면 그때 다른 객체를 선택한다. 객체 협력 관계가 완성되면 정적 타입으로 분리해 클래스를 작성한다. 인터페이스와 내부 구현을 명확하게 분리한다.

질문

  1. 클래스를 설계할 때 고려해야 하는 세 가지 관점은 무엇인가?
  2. 도메인 모델은 어떻게 얻을 수 있는가?
  3. 객체의 협력 관계를 어떻게 구성할 것인가?
  4. 왜 인터페이스와 구현을 명확하게 분리해야 하는가?

1. 클래스를 설계할 때 고려해야 하는 세 가지 관점은 무엇인가?

개념, 명세, 구현이다. 개념은 사용자가 도메인을 바라보는 관점을 반영한다. 명세는 객체의 책임(무엇을)를 바라본다. 구현은 객체가 책임을 수행하는데 필요한 동작 코드(어떻게)를 작성한다. 인터페이스와 구현은 명확하게 분리해야 한다.

2. 도메인 모델은 어떻게 얻을 수 있는가?

구현해야 하는 상황을 객체들로 구성해본다. 커피 전문점이라는 도메인은 손님 객체, 메뉴 항목 객체, 메뉴판 객체, 바리스타 객체, 커피 객체로 구성된다. 그리고 객체들 간의 관계를 설정한다. 포함 관계나 연관 관계를 사용할 수 있다. 도메인 모델을 만들면 협력에 필요한 객체의 종류와 책임, 주고받아야 하는 메시지에 대한 대략적인 윤곽을 얻을 수 있다.

3. 객체의 협력 관계를 어떻게 구성할 것인가?

유스케이스에 정리된 시스템의 기능을 도메인 모델을 기반으로 한 객체의 책임으로 분배한다. 협력의 첫 메시지는 시스템의 기능을 책임으로 바꿔 얻을 수 있다. 이 책임을 수행할 객체를 도메인 모델을 바탕으로 선택한다. 커피를 주문하는 최초의 메시지는 손님에게 책임을 분배한다. 손님은 메뉴를 알지 못하므로 메뉴 정보를 얻기 위해 메뉴판 객체에게 메시지를 보낸다. 손님은 커피를 제조하지 못하므로 바리스타 객체에게 메시지를 보낸다.

4. 왜 인터페이스와 구현을 명확하게 분리해야 하는가?

인터페이스는 클래스의 안정적인 면을 드러내야 한다. 구현은 클래스의 불안정한 면을 드러내야 한다. 인터페이스가 구현 세부 사항을 노출하기 시작하면 아주 작은 변동에도 전체 협력이 요동치는 취약한 설계를 얻을 수 있다.

profile
딩가딩가 백엔드 개발자

0개의 댓글