객체지향 디자인 원칙

바뀌는 부분은 캡슐화한다.

상속보다는 구성을 활용한다.

구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다.

서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다.

클래스는 확장에 대해서는 열려있지만 변경에 대해서는 닫혀 있어야 한다.

추상화된 것에 의존하라. 구상 클래스에 의존하지 않도록 한다.

친한 친구들하고만 이야기한다.

먼저 연락하지 마세요. 저희가 연락드리겠습니다.

어떤 클래스가 바뀌게 되는 이유는 한 가지 뿐이어야 한다.

원칙은 원칙일뿐 목적이나 법칙은 아닙니다.

참조 : Head First Design Patterns

ps : 시험 끝~~~~~~~

State Pattern 예제

문제 : 2) [30점]  State pattern에서 공짜 알맹이 당첨 기능을 추가 하고 반응이 좋아 다른 한 가지 변경을 다하고자 한다. 현제의 기계에서는 한 번에 하나의 동전만 넣을 수 있다. 다른 뽑기 기계에서와 같이 한꺼번에 2개, 3개, 혹은 원하면 더 많은 동전을 넣을 수 있도록 하는 기능을 추가 해 달라는 요청이다.
   a. [10점] 확장된 state diagram을 그려라.
   b. [10점] State Pattern을 적용하지 않은 경우를 구현하라.
   c. [10점] State Pattern을 적용한 시스템을 구현하고, 패턴을 적용하지 않은경우와 비교해서 확장이 얼마나 쉬워 졌는지 설명하라.

A.
bk12.bmp
B. 각각의 상태를 flag로 두고 각 메소드 안에서 if-else문을 엄청나게 사용하여 구현을 해보라는 것인 것 같군요.

C. 새로운 상태(동전이 여러개인 상태)를 동전 있슴 State의 하위 클래스로 상속을 사용한 뒤 필요한 메소드를 오버라이딩 하면 될 것 같습니다.

자~ 이제 코딩하자 기선아.

H.F. Design Pattern 트집잡기

2장 p80쪽에 나오는 getter들과 p105쪽에 구현되어 있는 getter들이 일치 하지 않음.
[#M_ more.. | less.. |
=> 80쪽에 나오는 getter들은 외부 기계로 부터 값을 읽어오는 getter들인데 105쪽에 있는 getter들은 자신의 data를 호출하는 쪽으로 넘겨주는 일반적인 게터, 세터의 모양을 하고 있습니다.
_M#]
3장 p129쪽에 나오는 다이어그램이 보여주고 있는 UML의 선이 나타내는 의미와 클래스안에 있는 표기된 멤버가 일치하지 않음.
[#M_ more.. | less.. |
=> Decorator 클래스에서 Component를 가지고 있어야 하는데 Decorator의 하위 클래스들이 각각 Component를 가지고 있는 것으로 표기하고 있슴.
_M#]
5장 Lazy instantiation을 ‘게으른 초기화’로 번역하고 있슴.
[#M_ more.. | less.. |
=> ‘초기화 지연 기법’이 보다 의미를 잘 전달한다고 생각함. 영회형에게 감사합니다. http://whiteship.tistory.com/105#comment1028311 참고
_M#]
7장 p286쪽 맨 아래에 보면 Enumerator 인터페이스를 사용하다가 전부 Iterator만 사용하도록 바꿀 것이라고 합니다. 그리고 다음 장 부터 Iterator 인터페이스를 어댑터 패턴을 이용해서 내부적으로는 Enumerator를 사용하도록 해주는 클래스를 만들기 시작합니다,.
[#M_ more.. | less.. |
=> 이부분에서 색칠된 부분이 Iterator 인터페스만 사용하도록 으로 바뀌어야 좀더 명확한 표현이 될 것 같습니다.
_M#]
8장 p338쪽 하단에 mergeSort() 메소드가 있는데 안에 보면 전혀 머지 소트가 아닙니다.
[#M_ more.. | less.. |
=> 메소드 내부 구현을 머지 소트로 바꾸든지 아니면 메소드 이름을 바꿔야 합니다.
_M#]

이 글을 참고 or 배낄지도 모를 저와 같은 학부 학생들에게…

[#M_ more.. | less.. | 이 글은 대부분이 정확하다고 할 수 없으며 이미 수없 시간에 교수님과 한번쯤 다 언급이 되었던 내용이므로 저작권을 내세우거나 그럴 생각을
눈꼽만큼도 해본적이 없습니다. 다만~ 본인이 직접 책을 뒤져가며 수업 내용을 복습해보지 않고 제가 쓴 글을 그대로 퍼다 나르는
일은 하지 말아주셨으면 좋겠습니다.
왠만한 학우들은 모두 아시다시피 저는 컨닝(cheating)을 매우 싫어하시는 교수님 방에
살고 있으며 저 또한 컨닝을 매우 싫어하지요. 제가 쓴 이 글과 똑같은 내용의 프린트 물이 발견되는 즉시 저는 분노, 격노,
증오, 미움 등의 심난한 감정에 휩싸이게 될 것 같습니다. 부디 저를 그럼 시험에 들게 하지 말아주세요. 🙂
_M#]

엔터프라이즈 컴퓨팅 1)-2

 2. 2차 확장/변경(1년이 지난 후)

       다.[10점] 김치피자가 인기가 좋아서 뉴욕과 시카고에서도 치피자를 메뉴에 추가 하고자 한다. Dough는 밥 대신 시카고에서 사용하는 ThickCrustDough를 사용한다. 뉴욕에서는 된장이 쉽게 구할 수 있지만 시카고에서는 한국된장이 쉽게 구할 수 있는 재료가 아니라서 일본된장을 사용하기로했다.


[#M_답 보기|닫기|

1. NYPizzaStore와 ChicagoPizzaStore 클래스의 orderPizza() 메소드에 kimchi를 주문할 수 있도록 수정합니다.

2. KimchiPizza의 재료를 구하는 부분을 수정하여 각 지역에 맞는 재료들로 구성되도록 수정합니다.


test 코드를 작성합니다.


먼저 뉴욕과 시카고 피자 가게에서 김치피자를 주문할 수 있도록 코드를 수정합니다.

1번은 위 처럼 간단하게 해결 됐습니다. 이제 2번에 써놓은 것을 처리해야 하는데 이부분이 이번 문제의 핵심영역입니다.


먼저 이전에 만들어 두었던 KimchiPizza 클래스의 일부 소스코드를 보겠습니다.

색칠 된 부분의 코드에서 인터페이스가 아닌 특정 구현을 사용하고 있기 때문에 이 상태에서는 각 지점마다 고유의 김치피자를 생성할 수 없습니다.


우리가 해야 할 것은 서울지점의 김치피자에서는 그대로 밥 dough와 치즈 대신 된장을 사용하는 것입니다. 그리고 시카고의김치피자는 ThickCructDough와 치즈 대신 일본 된장을 사용하는 것입니다. 마지막으로 뉴욕에서도ThickCrustDought와 한국 처럼 그냥 된장을 사용하는 것입니다.


이를 위해서는 다른 재료들처럼 ingredientFactory.createDough()를 사용하면 될 것처럼 보이지만 그렇게 하면 안 됩니다. 왜냐면 다른 피자 클래스들에서도 createDough() 메소드를 사용하고 있기 때문에 만약 김치 피자 때문에 createDough() 메소드가 밥 Dough를 생성하게 되면 다른 피자들까지 전부다 밥Dough를 사용하게 될 것이기 때문입니다.


따라서 createKimchiDough() 와 createDoenjang() 과 같은 새로운 메소드를 인터페이스에 추가하고 각 공장마다 이 메소드들을 구현하여 사용하는 방법을 사용할 것입니다.


위처럼 코드를 수정하고 인터페이스에 각각의 메소드를 선언해 두고 각 재료 공장 마다 해당하는 재료를 생성하도록 수정합니다.

피자 재료 공장에 새로운 메소드를 추가하였습니다. 그리고 각 공장마다 이 메소드들을 구현합니다.



JapanDoenjang 클래스를 구현하면 에러는 사라집니다.


그럼 이제 모든 구현은 끝났습니다. JUnit test를 실행합니다.

_M#]


[#M_ more.. | less.. |

_M#]

엔터프라이즈 컴퓨팅 중간고사 1)-1-나

나.[10점] 서울분점에서는 메뉴에 김치피자를 추가 하고자 한다. 김치피자에서는 Dough를 밥으로 만들어야 하고, 치즈대신 된장을 사용한다.


[#M_ more.. | less.. |

1. SeoulStore 클래스에 KimchiPizza 주문을 할 수 있도록 수정합니다.

2. Pizza를 상속받는 KimchiPizza 클래스를 구현합니다.

3. RiceDough 클래스와 Doenjang 클래스를 구현합니다.


먼저 test 코드를 작성합니다.


1-(1) 번 문제를 풀 때 사용한 test 코드에 추가 했습니다.

이제 SeoulStore 클래스를 수정 합니다.


createPizza() 메소드에 위와 같은 코드를 추가합니다. setName안에 오타가 났군요. Pepperoni가 아니라 Kimchi로 바꿔야겠죠? 🙂


이제 KimChiPizza 클래스를 구현합니다.


김치 피자는 치즈 대신에 된장과 도우는 밥을 사용하기 때문에 위와 같이 코딩을 합니다.


이제 된장과 밥을 구현합니다.


이제 test 코드를 실행 시켜봅니다.


이것으로 1번 문제는 마치겠습니다.


_M#]