1

クラスのドメインロジックをドメインレイヤ内のオブジェクトの責任から分離する方法があるかどうか疑問に思っています。コンポジット内のドメインと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階層に戻って、計算結果を図面に表示するなどの問題があります(たとえば、シミュレーションの後にスケマティック表示に表示したい計算中に一部の値を保存する部分があるとします)。

多分このような問題のいくつかの実績のあるパターンがありますか?

答えて

0

model-view-presenter (mvp)model-view-viewmodel (mvvm)パターンをご覧ください。

ファウラーのpresentation modelには2つのサンプルアプリケーションが含まれています。それはまたあなたにとって興味深いかもしれません。

これらのパターンを調べることで、どのように続けるかについてのアイデアが得られると思います。 Mvvmは現在のソリューションによく似ています。だから、もし私があなただったら、そこから始めたいと思う。

+0

私はMVC、MVP、MVXYZ、パッシブビューをたくさん読みました...記事とすべて私は実際の例で分離を行う方法ではなく、Uiコードからのバスロジックを分離するように私に教えてくれます。私はすべてのguiプロジェクトのガイドラインに従いますが、 'DrawText(mymodel.GiveMeText) 'と同じくらい簡単ではないときにトラブルに遭います。 mvvmはms固有のパターンであるようです(これは.NETプロジェクトではありません)。非常に技術的なC#/ WPFの記事しか見つかりません。私はより一般的なパターンが必要です。 – hansmaad

+0

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

0

@マージンと同意し、彼の答えを一般化する。あなたが必要とするものはModel-View-Controllerで、MVPとMVVMはその種類が異なります。あなたのコメントから、私はそれを理解していると思いますが、パターンを実装する方法を理解する必要があります。あなたの言語を知らずに&ターゲットアーキテクチャは絶対的な仕様を与えるのは難しいです。それにもかかわらず、私はObserverパターン(リンクにはサンプルコードがあります)から始めます。

あなたが扱っている問題は、UI固有のコードでドメインに邪魔をすることなく、ドメインからUIへの観察可能なアクセスを提供する方法です。オブザーバーはこれを行う手段を提供します。特に、オブザーバーの登録と変更の通知を可能にするために、ドメインの変更が必要です。しかし、GUI特有のことは何もないので、うまくカプセル化されています。

hth。

PS:アプリが一般的なシンクライアントのウェブアプリの場合、アプローチを変更する必要があります。そして、注意:多くのWebアプリケーションフレームワークは「MVC」として宣伝されますが、実装はObserverパターンとは構造的にかなり異なります。

+0

ドメインクラスのオブザーバー登録にはuiは追加されませんコードをドメインに追加します。しかし、私の主な問題は、ドメインオブジェクトを描画するときではなく、どのようにするかです。 MachinePartコンポジットのクライアントコードは、ドメイン "Calculate"の抽象化のみを認識し、コンクリートアセンブリを認識しないため、それを描画する方法はわかりません。各MachinePartは「緑色の矩形で赤い円を描く」と言うことができますが、ドメインの一部ではないため、この知識でドメインコードに負担をかけたくありません。 – hansmaad

+0

OPごとに、ドメインクラスとUIクラスの2つの階層が必要です。簡単に言えば、各ドメインクラスには、そのパーツタイプを描画する方法を知っている対応するUIクラスがあります。ドメインクラスとそれに対応するUIクラスは、Observerを使用して接続されています(私は、UIクラスには、ドメインクラスから継承しません)。各UIサブクラスには、対応するドメインクラスの適切なシェイプをレンダリングする 'draw()'メソッドがあります。構造体をトラバースすると、 'Assembly'のUI対応部分に落ち、' draw() 'が' Assembly.subParts'を反復します。 – sfinnie

0

多分View Helperが役に立ちます。あなたのケースでは、あなたのドメインオブジェクトをプレゼンテーションの詳細から完全に分離するでしょう...