|
Duplicate Observed Dataとは、UIのクラス内で使用されるデータを切り出し、 ユーザーインターフェイスのクラスの中にだけ存在するようなデータは、クラスとして切り出すところに第一歩があります。 このリファクタリングのもう一つのエッセンスがobserverパターンを導入することです。 observerパターンが本当に必要になるまでは、observerパターンは実装しない方が良い(パターン指向リファクタリング)という意見がありますので、 リファクタリング前: using System; namespace Observer { //メインクラスです public class Observer { public static void Main() { GUI gui = new GUI(); for(int i=0; i < 10; i++) { if(i != 0) { gui.Name += ","; } gui.Name += i.ToString(); gui.Display(); } } } public class GUI { private string name = ""; public string Name { get { return this.name; } set { this.name = value; } } public void Display() { Console.WriteLine(name); } } } リファクタリング後: using System; namespace Observer { //メインクラスです public class Observer { public static void Main() { GUI gui = new GUI(); Data data = new Data(); //通知を受ける関数の登録 ChangedEventHandler eventHandler = new ChangedEventHandler(gui.update); data.Changed += eventHandler; //DataのNameを変更してみる for(int i=0; i < 10; i++) { if(i != 0) { data.Name += ","; } data.Name += i.ToString(); } data.Changed -= eventHandler; } } //イベントに対してdelegateを宣言するt public delegate void ChangedEventHandler(object sender); //observable class //変更されたときに通知します public class Data { //declare the event using the delegate public event ChangedEventHandler Changed; private string name = ""; public string Name { get { return name; } set { this.name = value; //データが変更されたときに通知することをここで集中管理 OnChange(this); } } private void OnChange(object sender) { if(Changed != null) { Changed(sender); } } } //observer class //変更の通知を受けます public class GUI { public void update(object sender) { Console.WriteLine(((Data)sender).Name); } } }
|