재 현
객체지향의 사실과 오해 본문
책을 다 읽고서 혼자서 만들어본 객체 지향적 프로그래밍
<스토리>
고객은 음식점에 들어간다. 메뉴판을 보고 음식을 정한 후, 셰프에게 주문을 한다. 셰프는 한식, 중식, 양식 셰프들이 있다. 고객이 주문한 요리에 맞는 셰프가 요리를 시작한다. 요리가 끝나면 고객에게 제공한다.
1. 유스케이스
- 음식을 주문하라 -> 시스템의 책임으로 바꿔준다.
2. 시스템은 이 거대한 책임을 나눌 객체를 선별한다
- 고객은 메뉴판을 보고 주문을 할 책임이 있다.
- 메뉴판은 고객에게 메뉴항목을 알려줄 책임이 있다
- 셰프는 주문을 받아 요리를 줄 책임이 있다
3. 객체들을 선별했으면 관계를 정의해야 한다
- 요리는 메뉴판에 포함되어 있으니 포함관계로 정의한다.
- 손님은 메뉴판을 알지만 포함은 아니므로 연관관계이다.
- 셰프는 손님을 알지만 포함은 아니므로 연관관계이다
- 셰프들은 셰프의 포함관계이다.
- 요리는 셰프를 알지만 포함관계는 아니므로 연관관계이다.
4. 메시지가 객체를 선택한다.
- '주문을 하라'라는 메세지의 대상은 손님이 된다.
- 메뉴항목을 찾아라의 대상은 메뉴판이 된다.
- 손님은 메뉴항목을 넘겨 음식을 제조해라라는 메시지를 보내고 그 대상은 셰프이다
- 셰프가 생성하라는 메시지를 보내고 수신자는 요리가 될 것이다.
- Main과 Customer 코드
- appConfig를 사용하여 구성 영역과 사용 영역을 구분했다. OCP 원칙을 지키기 위해서다.
- order 메소드에 메뉴 이름을 매개변수로 받는다.
- 메뉴 클래스의 choose 메소드를 통해 해당 메뉴 객체를 반환한다.
- 셰프 클래스는 메뉴 객체에 맞는 구현 객체를 주입받고 makeDish 메소드를 실행하여 요리 객체를 반환한다.
- AppConfig 코드
- Chef와 ChineseChef 코드
- Chef는 인터페이스로 구현했다.
- ChineseChef는 Chef 클래스를 구현한다.
- 오버라이딩을 통해 딤섬 객체를 반환한다. ( KoreanChef는 갈비, WesternChef는 파스타를 반환한다)
* 전체 소스코드
https://github.com/songjayhyun/orderDish
GitHub - songjayhyun/orderDish
Contribute to songjayhyun/orderDish development by creating an account on GitHub.
github.com
책을 읽고 나서 이러쿵 저러쿵 만들어 봤는데, 이것이 바른 설계와 코드인지는 아직 잘 모르겠다. 최대한 책에서 배운 것을 활용하려고 애썼다. 문제점이나 더 나은 코드가 있다면 알려주세요 !
객체지향 수업은 학교에서 듣기도 했고, vending machine 같은 걸 만들기도 했었는데 개인적으로 이 책을 읽고 나서 확실하게 알게 된 것 같다. 애매했던 개념을 정리했다. 앞으로 설계부분에서 계속해서 들여다 볼 책.
가장 핵심 두 가지
- 객체는 협력을 위해 존재한다. 책임이 중요하다.
- 메시지가 객체를 선택한다
*수정*
<며칠 뒤 다시 본 후, 수정한 부분>
1. chef, dish, config라는 패키지를 만들어 각 클래스들을 분류했다
2. 각 chef 구현체들 보면, return 값이 구현체에 의존하고 파라미터를 제대로 활용하지 못하기에 menuItem으로 리턴하도록 했다
'Book' 카테고리의 다른 글
6. 객체 지도 (0) | 2021.11.03 |
---|---|
5. 책임과 메시지 (0) | 2021.10.29 |
4. 역할, 책임, 협력 (0) | 2021.10.26 |
3. 타입과 추상화 (0) | 2021.10.20 |
2. 이상한 나라의 객체 (0) | 2021.10.20 |