ここでのベストプラクティスは何ですか...
ユースケースによって異なりますが、ユーザーはシステムをどのように使用しますか? によって「吹き飛ばされた」ラボでしょうPerson
か?または、システムの使用例は、いくつかのPerson
爆発を起こすことLabs
ですか?
または多分それは問題ではありません:S
最終的には同じ結果になりますが、ここで重要なのはコードの意味です。ラボが人々によって吹き飛ばされるのがばかげているように聞こえる場合は、それをしないでください。
したがって、BobTurbo が述べているように、黄金律は、システム内の「情報の専門家」( GRASPを参照) を見つけて、そのオブジェクトに制御を与えることです。
通常、システムがどのように使用されるかについて、ユーザー履歴または説明を定義します。たとえば、説明が次の場合です。
ある人物が何かを行った場合、ラボの全員に通知する必要があります。
そして、私にとっては、a が a でPerson
動作し、Lab
それが作成されると、その人は自分が取り組んでいるラボを受け取り、自分自身を登録して、その perticula ラボで何が起こっているかを通知されることを意味します。
ラボには通知する人のリストがあるため、ラボが通知を実行するのは理にかなっています (この場合、人はラボに制御を渡します)。
次に、おそらく次のPerson
ように定義できます。
labs.Person {
- name: String
- lab : Lab
+ Person( withLab: Lab , andName: String ) {
self.lab = withLab
self.name = andName
self.lab.subscribe( self ) // want to know what happens
}
+ blowUpLab() {
lab.boom!(blownBy:self)
}
// receive a lab even notification
// performed by "someone"
+ labEvent( lab:Lab, by: Person ) {
// if is my lab and it wasn't me?
if( self.labg .== lab .&& self .!= by ) {
// ok it was someone else....
}
}
}
したがって、人はラボで何かを行います。この場合、blowUpLab
ラボのメソッドを呼び出すことによってその人のラボを爆破するパブリック メソッドboom!
です。
次に、Lab
メソッド アクションを実行し、最後にすべてのサブスクライバーに通知します。
labs.Lab {
- labName:String
- subscribers: Person[0..*]
+ subscribe( to: Person ) {
subscribers.add( to )
}
+ boom!( blowedBy: Person ) {
// do blow up the lab
....
// and then notify:
subscriber.forEach( person: Person ) {
person.labEvent( self, blowedBy )
}
}
}
これがオブザーバーパターンです。
最後に、メイン アプリは人物とラボを作成し、ユース ケースを実行します。
labs.MainApp {
_ main() {
blackMesaLab = Lab("BlackMesa")
gordon = Person( withLab: blackMesaLab, andName: "Gordon Freeman")
scott = Person( withLab: blackMesaLab, andName: "Scott Tiger")
james = Person( withLab: Lab("SO Labs"), andName:" James Hetfield");
persons = Array( gordon, scott, james )
....
while( true ) {
// every now and then, have someone blowing up it's lab
if ( randomNumber() .== 42 ) {
person.at( randomPosition ).blowUpLab()
}
}
}
}
このメインアプリは、いくつかのラボを含む 3 人の人物を作成します。そのうちの 2 人だけが関連しています (スコットとゴードン)。
blowUpLab
そのうちの 1 つがランダムにメッセージを受け取り、メソッドを実行します。ラボは、そのラボのすべてのサブスクライバーに通知します。
だから、ジェームズ・ヘットフィールドがその研究室を吹き飛ばしても、誰にも通知されません:)
ポイントは、ユースケースを説明し、そこにいる情報専門家を特定することです。そのオブジェクトにコントロールを与え、そのオブジェクトがコントロールを他のオブジェクトに依存させますが、ユースケースに応じてのみ
それが理にかなっていることを願っています。