2012-07-27 5 views
3

클래스가 Container, ItemProperty 인 컨테이너는 항목의 속성이 변경 될 때마다 통보됩니다.다른 클래스의 클래스 변경 알림

컨테이너는 아이템의 소유자이며 속성에 따라 컨테이너를 적절하게 관리하기위한 정보가 필요합니다.

나는 아직이 옵션을 생각했습니다

  1. 옵저버 패턴.
  2. 프록시 개체입니다.

내 의견으로는 관찰자 패턴이 너무 무거워 보입니다. 프록시 개체는 제대로 작동 할 수 있지만 프록시에서 실제 개체로 호출을 전달해야하므로 DRY 원칙을 위반합니다.

세부 정보가 사용자에게 표시되지 않아야합니다. update_item() 등의 기능 또는 이와 유사한 기능을 호출 할 필요가 없습니다. 즉, 컨테이너에 사용자에게 알리는 책임을 부여하여 사용상의 문제를 일으킬 수 있습니다.

답변

3

그런 간단한 경우에는 Observer을 사용하는 이유가 표시되지 않습니다. Item는 하나 개의 컨테이너에있을 수 있기 때문에 한 번에 난 그냥 Item가 배치되어있는 컨테이너에 대한 참조 또는 포인터를주는 갈 것입니다.

Item의 일부 Property 그것으로 할 수 그것을 통해 Container을의 통지 변경하는 경우 해당 포인터

Observer 많은 개체를 알릴 필요가있는 경우 패턴이 유용합니다.

편집

또한 문제를 야기 할 수 있습니다 인터페이스와 매우 깔끔한 디자인을 사용하여 모든 간단한 일을 만들기. 나는 zen of Python에서 인용이 무슨 뜻인지 잘 설명 생각 :

Special cases aren't special enough to break the rules. //make Interfaces 
Although practicality beats purity. //but not everywhere 

그래서 당신은 순결과 실용성의 균형을 가져야한다

+1

이 접근법에서 볼 수있는 문제점은 "항목"이 "컨테이너"에 종속되고 "컨테이너"는 "항목"에 종속된다는 것입니다. 이것은 C++에서 문제가되지 않지만 imho는 설계 결함을 알립니다. 일반적으로 저는 물건을 고립 상태로 유지하는 경향이 있습니다. – stschindler

+2

@Tank : 원하는 경우 'ContainerInterface' 및'ItemInterface' 또는 이와 유사한 것을 통해 통신 할 수 있습니다. Observer 패턴을위한 인터페이스를 만드는 것과 다르지 않습니다. 하지만 단순한 일을 복잡하게 만들지 마십시오.) – Andrew

+0

_Clean Code_와 같은 책을 읽은 결과입니다. ;)''Item''이''Container'에 의존하게되면, 나는 단위 테스트에서 그것을 즉시 인식하고 거기서''Container''를 다뤄야한다는 것이 이상하다는 것을 알게 될 것입니다. 의존성을 없애기 때문에 인터페이스 아이디어는 나에게 좋게 들린다. – stschindler

2

당신은 이해하고 유지하는 것이 가장 쉬운 방법이며, 가장 필요로하는 패턴을 사용한다 전문 부품의 발명. 내가 작업하는 환경 (objective-C)에서 관찰자 패턴은 거의 복잡하지 않습니다. 또한 통지 요청이 변경 될 때 유연성을 제공합니다.

앤드류 (Andrew)의 대답은 이벤트가 더 간단하다는 것입니다. 객체 간의 직접 통신은 프록시의 발명이나 통지 처리의 오버 헤드를 요구하지 않습니다. 그러나 미래에 필요할 경우 융통성이 떨어집니다.

"너무 무겁다"는 것이 확실하지 않습니다. 아마 당신은 그것을 설명 할 수 있습니다.

+0

"너무 무겁다"는 말은 실제로 묘사 한 것을 의미합니다. 관찰자 패턴의 오버 헤드. 내부적으로 만 발생하는 것 (즉, 사용자는 결코 개체에 가입하지 않습니다)에 대한 것입니다. 내가 생각할 수있는 가장 간단한 해결책은 프록시이지만 코드를 복제하기 때문에 상당히 성가시다. – stschindler

0

앞서 언급했듯이 Observer는 지나치게 과장되어 있지만 해결책은 매우 간단합니다. 이벤트를 "버블 업 (bubble up)"하면됩니다.

  • 속성이 변경되면 해당 항목이 상위 항목임을 알립니다.
  • 항목이 변경되면 (속성이 변경되거나 항목에 더 중요한 영향을주는 부작용) 컨테이너/부모에게 알립니다.
  • 컨테이너에 알림이 전송되면 완료됩니다. 컨테이너를 중첩 할 수 있으면 필요한 경우 부모 컨테이너에 이벤트를 발생시킬 수 있다고 생각합니다.
+1

Andrew의 제안과 비슷한 _problem_ : 계층 적 종속성을 위쪽으로 추가합니다. 차를 알아야하는 휠과 같습니다. ;) – stschindler

+0

@ 탱크. 그러나 * 감각 * 바퀴는 차를 알 필요가 없다. 그냥 돌아 서. 그것은 그 자체로 사건입니다. 자동차가 바퀴 선회를 청취하는지 여부는 관계가 없습니다. 우리는 전파 할 정보에 대한 메커니즘을 제공합니다. :) –

+0

사실이긴하지만 차는 차가 없이도 살 수있다.''아이템''은 컨테이너가 없다면 살 수 없다. 부모가 없도록 허락하는 경우를 제외하고는 그렇다. 좋아, 차 바보 같아. ;) – stschindler

관련 문제