2011-09-21 9 views
0

몇 가지 속성이있는 클래스가 있습니다. 일부 특성은 다른 클래스에 의해 변경 될 수 있지만 일부 특성은 다른 특성에 종속적입니다. 예를 들어, 내 클래스에는 A, B, C 세 가지 속성이 있다고 가정합니다. A와 B는 시스템의 다른 클래스에서 변경할 수 있으며 C는 A + B와 같습니다. 클래스는 속성 변경 알림을 생성합니다. 따라서 A 또는 B가 변경된 경우를 원합니다. 변경된 등록 정보 (A 또는 B)에 대한 통지가 생성되고 통지도 C에 대해 생성됩니다. 제가이 문제에 가장 적합한 디자인 패턴은 무엇입니까?

2- 정상적인 C 속성을 생성

1- (배면 필드) 정상적인 C 속성 생성 (? 기타) 세 가지 옵션 및 C.을 변경할의 세터와 B의 코드를 추가 클래스 내에서 클래스 변경 알림을 듣고 A 또는 B가 변경되면 C를 변경합니다. 내가 모두에 대한 속성의 변화를 발생 (또는 B)과 C.

어느

-3- C에 대한 어떠한 세터 연산기 속성 만들기 없지만 게터 A (및 B)의 세터에, A + B이며 더 나은 디자인 패턴 (C#에서)? 저는 개인적으로 디자인 번호 2를 좋아합니다.

답변

1

Observer 패턴과 같은 사운드가 유용 할 수 있습니다. 예를 들어 http://www.oodesign.com/observer-pattern.html을 참조하십시오. Observer 패턴을 검색하면 많은 결과와 다른 예제가 생성되지만, 훨씬 간단하고 특정 언어에만 적용됩니다.

+0

관찰자 패턴이 좋다.이 경우 관찰자와 관찰자는 같은 클래스이다. 이 패턴을 사용하는 것은 클래스가 자신의 속성 변경 알림을 듣고 그에 따라 자체 변경 사항을 관찰 할 때 디자인 2와 같습니다. – mans

0

나는 아마도 C = A + B 계산은 한 장소에되도록 당신은 C에 대한 (만 터링) 계산 된 속성을 가질 수 2와 3

에 변화와 함께 갈 것입니다.

그런 다음 옵션 2에 따라 동일한 클래스 내에서 변경된 이벤트를 수신 할 수 있지만 A 및 B에 대한 PropertyChanged 이벤트를 감지하면 C를 업데이트하는 대신 PropertyChanged 이벤트 만 발생시켜야합니다 그 당시 C.

+0

C 계산을 한 곳에서 원한다는 사실을 알리는 것이 아주 좋은 지적입니다.나는 C = A + B가 분리 된 방법으로 코드를 작성하고 A 또는 B가 변경된 것으로 감지 될 때 호출함으로써 2에서 혼자서이 문제를 해결할 수 있다고 생각합니다. – mans

+0

네, 그게 사실이고, 나는 그 옵션들 사이에 많은 것이 없습니다. 아주 약간의 위험은 속성 설정자를 거치지 않고 A 또는 B에 대한 백업 필드를 변경하면 C가 동기화되지 않을 수 있지만 계산 된 속성은 동기화되지 않을 수 있습니다. 아주 간단한 위험으로 이는 매우 위험합니다. –

0

문제는 여기에 당신이 ... 일이 마이크로 소프트의 힘은 당신이 일을 할 수있는 방법으로 수행되어야한다 :

을하는 방법을 혼합하려고하지만 내 호언 장담이 따로 해당 옵션 3 깨끗한 소리를 생각하다 . 분명히 1이 아닙니다. 그것은 최악입니다. 여러분의 재산 변경 이벤트를 구독하면 미래의 코드를 유지하려고 시도 할 때 디버깅하기 어려운 펑키 한 문제가 발생할 수 있습니다.

당신은 높은 수준에서 생각해 보면

은, 당신이 3에서 제안하는 것은 완벽하게 수업 시간에 무슨 일이 일어나고 있는지에 대해 설명합니다

속성 A가 속성 C가 가지고있는 알려야 클래스의 관찰자 변경되는 때마다 또한 변경되었습니다 (있기 때문에).

0

2는 A, B 및 C를 별도로 유지하기 때문에 가장 순수하지만 속성 알림에서 문자열 구문 분석에 약간의 오버 헤드가 발생합니다.

단순한 속성 집합이라면 1로 유혹 될 것입니다. 아직 완전히 분리되어 있지만 훨씬 간단합니다. 3은 최악의 IMO입니다. 왜냐하면 A + B는 어쨌든 분리되어야하는 코드를 복제하기 때문입니다 (C 알림).

관련 문제