2011-12-15 8 views
2

私は自分のシステムにコマンドパターンを実装しました。なぜなら、私はいくつかの層を持っており、ロジックを遠隔から呼び出す必要があるからです。コマンドパターンの醜い経験:OOPの任意の点?

class DoWorkCommandMessage { int param; } 

class DoWorkCommandHandler : Handler<DoWorkCommandMessage> 
{ 
    Execute(MyObject object) { 
     object.DoWork(message.param); 
    } 
} 

class MyObject 
{ 
    void DoWork(int param) { 
     _proxy.SendMessage(new DoWorkBinaryMessage(param)); 
    } 
} 

あなたは、私は基本的に、別の階層に送信されるメッセージに戻ってそれを変換されたメソッド呼び出し、に変換、メッセージを取得しています見ることができるように。

ここに何か問題があるように感じます。

私はすべてのメソッドを削除するためにMyObjectをリファクタリングし、単純なProcessMessageメソッドに置き換えました。このメソッドは、メッセージを受け取り、それを翻訳し、ディスパッチします。

これは)私がProcessMessageを(呼び出して維持する必要がありますユニットテストのために... MyObjectには、主にちょうど変換コードではなく、「オブジェクト」は終わった以外

OKだった代わりに簡単なメソッド呼び出しを作ります。

「メッセージ&の変換」と「メッセージ - >方法 - >メッセージ」の対戦のこの戦いについて、私は考えています。明らかにメッセージとメソッドは非常に密接に関連しています。

+0

MyObjectで動作やロジックを使用できないのはなぜですか?あなたの "MyObject"は、プロキシとして立つのではなく、より具体的で、何らかのロジックを実行できますか? – Thurein

+0

MyObjectは実際には、フィールド内のハードウェアのビットを表す「オブジェクト」です。サーバーには、このようなオブジェクトが多数あります。これは、数千のハードウェアデバイスが現場に存在するためです。実際のハードウェアデバイスは、ほとんどの状態を保持し、メッセージを送信し、本質的にサーバーに最新の状態をキャッシュします。私はこのデバイスをOOPのようにモデル化するのか、それとも気にしないのかについて断ち切っています... Unitテストではその方法が良いとテストします。それ以外の場合は全く使われません。 – Schneider

+0

これは常にあなたが達成しようとしていること。あなたの場合は、あなたがそれを必要としなかったようです。 – ivowiblo

答えて

1

私は、実際にコマンドパターンを使用していないという混乱や困難があると思います。あなたはそれをMessagingと混合します。あなたはあなたのコマンドの名前でこれを見ることさえできます... DoWorkCommandMessage。古典的なコマンドパターンでは、実際にはCommandオブジェクトによって処理が行われます。メッセージング手法では、メッセージはDTOとして渡され、ハンドラによって実行されます。

をさらに説明するために

は、私が使用するアプリケーションがある

AbstractCommand 
+ Execute() 
+ CanUndo() 
+ Undo() 
+ CanChain(cmd) 
+ Chain(cmd) 

そのクラスの具体的な例は次のとおりです。

MoveUnitCommand // a unit is a graphic piece on a game board 
+ UnitId 
+ Destination 
+ Execute() 
    { 
     units = Units.Find(UnitId) 
     prevCoords = units.Position 
     units.Position = Destination 
    } 
+ CanUndo() { return true; } 
+ Undo() 
    { 
     units = Units.Find(UnitId) 
     units.Position = prevCoords 
    } 
+ etc, etc 

コマンドサブクラスはただ、それをどうするかについては説明しません。なおシステム状態に実際に作用します。

+0

コマンドをリモートにするには、メッセージングを使用する必要があります。コマンドを遠隔操作できないと言っていますか?これは、コマンドハンドラパターンを使用して終了します。コマンドはデータ(メッセージ)とコード(ハンドラ)の部分に分割されます。私のqnでは、私の "オブジェクト"がコマンドメッセージを別の層に転送するという事実を悩ましています。私はこれが本当に目的であるかどうかに存在する危機を抱えています...メッセージを別の層に送るための方法にメッセージを変換する必要はありますか?そうでなければ、私は貧血のオブジェクトで終わる。おそらくそれはOKです。私はアドバイスを探しています(道徳的なサポート!?) – Schneider

+0

私の応答は、あなたが "コマンドパターン"の使用をコーディングしたことについてのより多くのコメントでした。少なくとも古典的な意味では(すべてのパターンの使用には灰色の色合いがありますが)、実際にはそうではありません。あなたの他の懸念に対処するために、私はフォローアップの質問があります。すべての "コマンド"は、実際にはメッセージがプロセス(リモート)から送信されていますか?もしそうなら、私はそれらをメッセージだけにリファクタリングして、コマンド関連のコードを忘れてしまいます。おそらく必要な場合は、シリアライズの実装からメッセージを分離し、複数の "プロトコル"をワイヤでサポートできるようにすることを検討します。 – tcarvin