とても素敵な議論。私はこの哲学的な質問に何時間も取り組んできましたが、私の執着を満足させる解決策にたどり着きました。(私がこのようなものを気に入っている理由は、具体的なロジックと抽象的なロジック(ブール値+デザイン)を組み合わせているからです。)
結果を返すために例外を使用することを簡単に検討しました。多くの場合、パターン自体の核心であるデカップリングがなくなるため、そのアイデアを放棄しました。さらに、結果は多くの場合、例外ではなく、標準の戻り値になります。おそらく潰瘍になるでしょう。
最終的に、レシーバーをそれ自体でインスタンス化し、それが属するレシーバーのすべてのロジックを保持するクライアントを作成しました。クライアントはコマンドのexecute()を呼び出して続行します。その後、受信者はクライアントのパブリックメソッドを呼び出すことができます。返すものは何もありません。
ここにいくつかのサンプルコードがあります。コマンドクラスがなくても理解できると思うので、コマンドクラスは作成しませんでした。そのexecute()メソッドは、レシーバーのrun()メソッドを呼び出します。
クライアント:
Class ClientType{
CommandType m_Command;
ReceiverType m_Receiver;
boolean m_bResult;
ClientType(){
m_Receiver = new ReceiverType(this);
m_Command = new CommandType(m_Receiver);
}
public void run(){
...
m_Command.execute();
}
/* Decoupled from both the
* command and the receiver.
* It's just a public function that
* can be called from anywhere. /
public setResult(boolean bResult){
m_bResult = bResult;
}
}
受信機:
Class ReceiverType{
ClientType m_Client;
boolean m_bResult;
ReceiverType(ClientType client){
m_Client = client;
}
public void run(){
...
m_Client.setResult(m_bResult);
}
}
一見すると、デカップリング要件に違反しているように見えるかもしれません。ただし、クライアントは受信者の実装について何も知らないと考えてください。受信者がクライアントでパブリックメソッドを呼び出すことを知っているという事実は、標準的な料金です。受信者は、パラメータオブジェクトをどう処理するかを常に知っています。依存関係はありません。レシーバーのコンストラクターがClientTypeパラメーターを受け取るという事実は関係ありません。それはどんなオブジェクトでもかまいません。
これは古いスレッドであることは知っていますが、皆さんの何人かがまたチャイムを鳴らしてくれることを願っています。傷が見られたら、遠慮なく私の心を壊してください。それは私たちがやっていることのようなものです。