GRASP コントローラー パターンを SOLID のまま、より具体的には単一の責任で維持しながら適用することについて質問があります。
ウィキペディアのコントローラー パターンの定義には次のように書かれています。
コントローラー パターンは、システム イベントを処理する責任を、システム全体またはユース ケース シナリオを表す非 UI クラスに割り当てます。Controller オブジェクトは、システム イベントの受信または処理を担当する非ユーザー インターフェイス オブジェクトです。
そしてSOLIDの単一責任原則について:
オブジェクト指向プログラミングでは、単一責任の原則は、すべてのクラスが単一の責任を持つべきであり、その責任はクラスによって完全にカプセル化されるべきであると述べています。そのすべてのサービスは、その責任と密接に連携する必要があります。
いくつかのサンプルコードに行きましょう。次の Java クラスがあるとします。
public class foo {
public foo(){}
public int foo1(){/*Some code*/}
public String foo2(){/*Some code*/}
public String foo3(int foo31){/*Some code*/}
}
public class bar {
public bar(){}
public int bar1(){/*Some code*/}
public String bar2(){/*Some code*/}
public String bar3(int bar31){/*Some code*/}
}
単一の責任を維持しながら、適切なコントローラーの実装は何ですか? ユースケースを通過するだけですか、それとも何ですか? 例えば:
public class bazController {
private foo fooInstance;
private bar barInstance;
public bazController(){
this.fooInstance = new foo();
this.barInstance = new bar();
}
public void fooAction1(int arg){
this.foo.foo3(arg);
}
public void barAction1(int arg){
this.bar.bar3(arg);
}
public void fooAction2(){
this.foo.foo1();
}
public void barAction2(){
this.bar.bar1();
}
}
ここで私は 1 つの責任を負っていますか? 私はこれを正しく行っていますか、またはこれを正しく理解していますか? よろしくお願いします。
編集:bazController
このメソッドがあり、両方のクラスが関連しているとどうなりますか?
public int bazAction(){
return this.foo.fooAction1() + this.bar.barAction1();
}