クラスのドメインロジックをドメインレイヤ内のオブジェクトの責任から分離する方法があるかどうか疑問に思っています。コンポジット内のドメインとuiレイヤの分離
例:
// Domain classes
interface MachinePart
{
CalculateX(in, out)
// Where do we put these:
// Draw(Screen) ??
// ShowProperties(View) ??
// ...
}
class Assembly : MachinePart
{
CalculateX(in, out)
subParts
}
class Pipe : MachinePart
{
CalculateX(in, out)
length, diamater...
}
多くの機械部品から組み立て機械のための値Xを算出するアプリケーションがあります。アセンブリはファイル表現からロードされ、コンポジットとして設計されています。各コンクリート部品クラスは、アセンブリ全体の動作をシミュレートするために、CalculateX(in,out)
メソッドを実装するためのデータを格納します。アプリケーションは正常に動作しますが、GUIはありません。ユーザビリティを高めるには、既存の実装の上にGUiを開発する必要があります(既存のコードの変更は許可されています)。 GUIには、アセンブリのスケマティックなグラフィック表現が表示され、いくつかのパラメータを編集するための部品固有のダイアログが表示されます。
これらの目標を達成するには、各機械部品が画面に模式表示を描画したり、プロパティダイアログを表示したり、機械シミュレーションのドメインに関係のない新しい機能をアプリケーションに追加する必要があります。私はいくつかの異なるソリューションを考えて、それぞれの部品にDraw(Screen)
の機能を実装することができますが、私はそれらのそれぞれに満足していません。
最初に私はMachinePartインターフェイスにDraw(Screen)
メソッドを追加することができましたが、ドメインコードがuiコードと混在するため、各マシンパートクラスに多くの機能を追加しなければなりませんでした。理解する。
もう一つの単純な解決策は、すべての部分を訪問可能にし、訪問者にuiコードを実装することですが、訪問者は私のお気に入りのパターンに属しません。
各マシンパートクラスからUIバリアントを派生させてそこにUI実装を追加できましたが、各パートクラスが継承に適しているかどうかを確認しなければならず、ベースクラスの変更に注意が必要でした。
私の現在お気に入りのデザインは、各コンポーネントがデータを格納して、機械部品を定義し、UIメソッドの実装と、対応するドメインクラスのインスタンスを作成するファクトリメソッドを持つ並列コンポジット階層を作成することです。ドメインアセンブリへのUIアセンブリです。しかし、作成したドメイン階層からUI階層に戻って、計算結果を図面に表示するなどの問題があります(たとえば、シミュレーションの後にスケマティック表示に表示したい計算中に一部の値を保存する部分があるとします)。
多分このような問題のいくつかの実績のあるパターンがありますか?
私はMVC、MVP、MVXYZ、パッシブビューをたくさん読みました...記事とすべて私は実際の例で分離を行う方法ではなく、Uiコードからのバスロジックを分離するように私に教えてくれます。私はすべてのguiプロジェクトのガイドラインに従いますが、 'DrawText(mymodel.GiveMeText) 'と同じくらい簡単ではないときにトラブルに遭います。 mvvmはms固有のパターンであるようです(これは.NETプロジェクトではありません)。非常に技術的なC#/ WPFの記事しか見つかりません。私はより一般的なパターンが必要です。 – hansmaad
MVVMはMS .netコンテキストでは多く議論されていますが、完全に「MS特有」ではありません。 JavaのMVVMは、[リンク1]の前にSOでディスカッションされました(http://stackoverflow.com/questions/2984828/is-there-anything-similar-to-wpf-and-mvvm-in-java-world)。 [リンク2](http://stackoverflow.com/questions/2105121/what-to-use-mvc-mvp-or-mvvm-or) – Marijn