ViewModel、モデル、MVVM アーキテクチャの問題。
むかしむかし、次のようにモデル クラスを定義していました。
public class Person
{
public string FirstName;
public string LastName;
}
数年後、次のようにモデル クラスを定義する方がよい考えであることがわかりました。
public class Person
{
private string firstName;
private string lastName;
public string FirstName {get{ return firstName;} set{ return firstName; } }
public string LastName {get{ return lastName; } set{ return lastName; } }
}
なぜ..一般的に、より汎用性が高いためです。例:
public class Person
{
private string firstName;
private string lastName;
public string FirstName {get{ return firstName;} private set{ return firstName; } }
public string LastName {get{ return lastName; } private set{ return lastName; } }
public Person(string firstName, string lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
}
数か月後、自動プロパティが導入され、再び簡単になりました。
public class Person
{
public string FirstName {get; set;}
public string LastName {get; set;}
}
そして汎用性はそのままです:
public class Person
{
public string FirstName {get; private set;}
public string LastName {get; private set;}
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
}
そして、プライベート セッターなしでクラスに行くと、さらに別の利点があります。
var myInstance = new Person{FirstName = "Che", LastName="Guara"}
これまでのところ - 優れています。
しかし今、MVVM が本当に使用したい別の進化があります.. (モデルで!)
public class Person : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string firstName;
private string lastName;
public string FirstName
{
get{ return firstName; }
set
{
firstName = value;
if(PropertyChanged!=null)
PropertyChanged(this,new PropertyChangedEventArgs("FirstName");
}
}
public string LastName
{
get{ return lastName; }
set
{
lastName = value;
if(PropertyChanged!=null)
PropertyChanged(this,new PropertyChangedEventArgs("LastName");
}
}
}
だから..わかりました..以前ほど短くはありませんが、許容範囲です。
しかし、モデルの進化が何かであるならば、当然のことです..
そして、「Don't Repeat Yourself」が良い原則であることに同意します。
多くの場合、特定の View-Model クラスは必要ありませんが、すべての場合ではありません。
そして、それは大丈夫です。
オブジェクト中心のパラダイムに対する態度全体を変えることがなぜ間違っているのでしょうか?
例:
publie interface IPersistable
{
Guid Id {get;set;}
DataAccessLayer Dal {get;set}
void Persist();
void Populate();
}
public class Person : INotifyPropertyChanged, IPersistable
{
public DataAccessLayer Dal;
private Guid Id;
public Guid Id
{
get {return id;}
set
{
id=value;
if(PropertyChanged!=null)
PropertyChanged(this,new PropertyChangedEventArgs("Id");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private string firstName;
private string lastName;
public string FirstName
{
get{ return firstName; }
set
{
firstName = value;
if(PropertyChanged!=null)
PropertyChanged(this,new PropertyChangedEventArgs("FirstName");
}
}
public string LastName
{
get{ return lastName; }
set
{
lastName = value;
if(PropertyChanged!=null)
PropertyChanged(this,new PropertyChangedEventArgs("LastName");
}
}
public void Persist() //assume this is part of IPersistable.
{
Dal.Persist(this);
}
public void Populate() //assume this is part of IPersistable.
{
var t=Populate(Id);
FirstName = t.Firstname;
LastName = t.LastName;
}
}
したがって、モジュールのどこかで、私ができることは次のとおりです。
myObj.Persist();
これは間違った考えですか、それとも良い考えですか? 良いアーキテクチャまたは悪いアーキテクチャ?
その中にはまだ懸念事項の分離があります - 書き方が違うだけです。
本当に頭を悩ませていますが、これに関するあなたの意見に感謝します。
ありがとう。
GY