나는 그것이 모두 유스 케이스에 달려 있다고 생각합니다.
많은 속성을 가진 간단한 모델이있는 경우 INPC를 구현하도록 할 수 있습니다. 간단히 말해서이 모델은 오히려 POCO 처럼 보입니다 .
모델이 더 복잡하고 대화 형 모델 도메인 (모델을 참조하고 다른 모델의 이벤트를 구독하는 모델)에 거주하는 경우 INPC로 구현 된 모델 이벤트를 갖는 것은 악몽입니다.
다른 모델과 공동 작업을 수행해야하는 모델 엔터티의 위치에있게하십시오. 구독 할 다양한 이벤트가 있습니다. 그들 모두는 INPC로 구현됩니다. 가지고있는 이벤트 핸들러를 상상해보십시오. if-clauses 및 / 또는 switch claus의 거대한 캐스케이드.
INPC의 또 다른 문제. 구현이 아닌 추상화에 의존하도록 앱을 설계해야합니다. 이것은 일반적으로 인터페이스를 사용하여 수행됩니다.
동일한 추상화의 두 가지 다른 구현을 살펴 보겠습니다.
public class ConnectionStateChangedEventArgs : EventArgs
{
public bool IsConnected {get;set;}
}
interface IConnectionManagerINPC : INotifyPropertyChanged
{
string Name {get;}
int ConnectionsLimit {get;}
/*
A few more properties
*/
bool IsConnected {get;}
}
interface IConnectionManager
{
string Name {get;}
int ConnectionsLimit {get;}
/*
A few more properties
*/
event EventHandler<ConnectionStateChangedEventArgs> ConnectionStateChanged;
bool IsConnected {get;}
}
이제 둘 다 봅니다. IConnectionManagerINPC는 무엇을 알려줍니까? 일부 속성이 변경 될 수 있습니다. 당신은 그들 중 어느 것을 모른다. 실제로 디자인은 IsConnected 만 변경하고 나머지는 읽기 전용이므로 변경됩니다.
반대로 IConnectionManager의 의도는 분명합니다. "IsConnected 속성 값이 변경 될 수 있음을 알려줄 수 있습니다."