やりたいこと
C#と、WPFというWindowsアプリケーションを作成するためのフレームワークを用いて開発しているところです。
その際、「データが変更された場合、ほかのクラスに変更を通知する必要がある」というケースが出てきました。
例としてコードを挙げると以下の通りです。
C#
1public class Main 2{ 3 public Main() 4 { 5 // dataを宣言、何らかの初期値が入る 6 Data data = new Data(name, id); 7 8 // dataを利用したクラスを4つ作成する。 9 // ただし、これらのクラスはdataを書き換えることができる。 10 // 変更が加わった際には、同じdataを利用している他のクラスに 11 // 「データが変更された」ということを通知する必要がある。 12 var a = new A(data); 13 var b = new B(data); 14 var c = new C(data); 15 var d = new D(data); 16 } 17} 18
A,B,C,Dそれぞれのクラスは入力されたdataをいじくったとき、それをほかのクラスに通知する必要があります。
ただし、このdataが複数個そんざいすることは無く、必ずこのアプリケーション上で1つしか存在しないです。
この際のクラス設計について非常に悩んでいます。
現在考えている案
今のところ考えている案が下の2つになります。
1. デザインパターンの一つであるシングルトンとオブザーバーパターンをDataクラスに使用する。
やりたいことで挙げたように、「dataが複数個そんざいすることは無く、必ずこのアプリケーション上で1つしか存在しない」ことを利用し、Dataクラス本体を唯一のクラスであるシングルトンで書く。
かつ、シングルトンであるDataに変更が加わった場合、オブザーバーパターンをDataクラスとそれを利用しているA,B,C,Dに適用し、変更が加わったらそれを通知する。
2. A,B,C,DのクラスすべてにIDataChangeSenderなどのinterfaceを継承させ、変更が加わったら相互で通知させる。
IDataChangeSender、IDataChangeReceiverの2つのインターフェースを作成し、A,B,C,Dのすべてに適応させ、それぞれが変更を加えたら、「変更したのを新しく送るね」といった感じで引数としてdataを渡す。
これらの案に対して自分が思ったこと
1.に関して
もともとは1.で実装していたのですが、アプリケーション全体をリファクタリングしている最中に、「デザインパターンは悪」といった評価をネットで受けました。
また、「シングルトンをグローバル関数として使ってはいけない」ともかかれており、自分はそのような使い方をしていたため
直したほうがいいのかと、2を考えました。
2.に関して
現在は1から2の方法を実装している途中なのですが、インターフェースがごちゃごちゃになり、1.の時よりすっきりとコード全体を把握できなくなりそうと感じました。
改めて聞きたい事
このような「データが変更された場合、ほかのクラスにその変更を通知する必要がある際のクラス設計」に関して皆さんはどのようなアプローチをしますか?
また、1.2.の案についてなど思うところが知りたいです。
よろしくお願いします
