이 두 종류를 구분하는 것이 매우 중요 그래야 잘 정의된 퍼블릭 인터페이스를 가진, 재사용이 가능한 클래스를 만들기 위한 핵심
trips, bicycles, mechanics를 다루는 새로운 예시를 보자.
여행이 시작되려면 모든 자전거가 잘 정비되어 있는지 확인해야함
위 그림은
위 설계의 문제점은
Trip은 Mechanic이 하는 세세한 작업을 다 알고 있음
개선해보자(1)
위 그림은
전 설계보다 개선된 점은
Trip은 여러 책임을 Mechanic에게 넘김
Mechanic에 포함된 퍼블릭 인터페이스 양이 줄음
하지만 문제는
Trip은 여전히 Mechanic에 대해 너무 많이 알고 있음
개선해보자(2)
Trip이 다른 객체에 대해 알고 있다는 사실이 맥락(context)을 구성
즉, Trip을 사용하려면 특정 맥락을 필요로 함
가능한 최고의 상황은
다른 객체가 누구인지, 그들이 뭘 하는지 전혀 모른 채로 협업할 수 있는 객체는 참신하게 재사용 가능
일단 상황을 다시보자
이 문제에 대한 해결책은
어떤 것 과 어떻게 사이의 구분
Trip이 원하는 것을 정확히 보자.
prepare_trip(self): Trip은 Mechanic에서 자신이 원하는 것(여행을 준비해야함)만 말하고
이어서 Mechanic은 Trip을 호출하여 Trip이 원하는 bicycles 목록을 얻어옴
위 그림에서
어떻게 여행을 준비하는지에 대한 지식은 Mechanics에 고립, Trip이 속한 맥락은 줄어듬
조금 더 나아가서,
Trip은 Mechanic같은 객체들을 배열에 담아 놓고 각각에게 prepare_trip 메세지를 전송 가능
이런 패턴에 따르면 preparer를 추가해도 전혀 코드 수정할 필요 없음
나는 내가 원하는 것을 알고 있고, 네가 어떻게 해야하는지도 알고 있음
나는 내가 원하는 것을 알고 있고, 네가 원하는 것도 알고 있음
나는 내가 원하는 것을 알고 있고, 네가 주어진 역할을 잘 할거라고 알고 있음
시퀀스 다이어그램을 이용하여 디자인을 고민한 결과
즉, 우리의 관심을 객체 => 메시지 로 옮기면서 퍼블릭 이넡페이스를 기반으로 애플리케이션을 디자인할 수 있음
메시지의 핵심은 어떻게 해야하는지 말하지말고 어떤 것을 달라고 요구하기
like. 손님: XX메뉴(라면) 주문할께요 (correct) / XX메뉴(라면)에 물을 먼저 냄비에 넣고, 끓을 때 스프를 넣고.. (wrong)
위 예제의 개선 과정. 일단 만들려는 거는 trips, bicycles, mechanics 객체를 통해 여행을 시작하기 위해 모든 자전거가 잘 정비되어 있는지 확인하는것
1번의 문제점
Trip이 Mechanic의 세세한 작업 다 알고 있음
2번의 개선점 및 문제점 개선
Trip은 여러 책임을 Mechanic에게 넘김 (격리시킴)
Mechanic의 퍼블릭 인터페이스 양이 줄음
문제점
Trip은 여전히 Mechanic에 대해 너무 많이 알고 있음
3번의 개선점 1,2번의 핵심 문제는 Trip이 다른 객체에 알고 있다는 사실이 맥락(context)을 구성
개선할 수 있는 방법
다른 객체가 누구인지, 그들이 뭘 하는지 전혀 모른 채로 협업하도록 변경