web-dev-qa-db-ja.com

Scientific Computing MVCアプリでのプロットと計算ロジックの分離

私は科学計算アプリケーション用のMatlab GUIを開発しており、かなり重い中間結果をプロットする必要があります。

現在、計算は関数として表されます。 GUIはユーザー入力を受け入れ、それを計算関数に渡し、最終的なデータ結果を返します。

アーキテクチャ上、GUIにはビューとコントローラクラスが組み込まれています。 Mainは、ソースファイルにある計算関数を定義することに加えて、これらのオブジェクトを初期化します。

さて、中間結果をプロットする必要があるので、計算ロジックとプロットの間の関心の分離を作成するための最良の方法を見つけようとしています。ユーザーへの中間結果の物理的な表示は、計算が完了するまで行われる必要はありません。

私の本能は、計算関数はそれらがプロットされていることを知らないはずです。

これまでのアイデア:

  1. 計算ロジックはUI軸ハンドルを入力引数として受け入れ、プロットは計算ロジック内で行われます。これは、懸念の分離に違反しているようです。
  2. 計算ロジックは、中間結果を含むデータ構造を返します。 GUIは、データをGUIプロットにバインドします。すべての中間データを保持するのは面倒なので、これは好きではありません。
  3. Main()で初期化され、構成できる(オンまたはオフにするなど)プロッターオブジェクトを作成します。計算手順の間、計算関数はプロッターメソッドを呼び出し、必要なプロットを生成してデータを破棄します。計算関数のプロットロジックは、1つのプロッターメソッド呼び出しに削減されますが、まだ存在しています。これは、大規模なアプリケーションでのロギングの慣用的なソリューションに似ています。
  4. 計算はクラスの内部で行われ、継続的に上書きされるメンバー変数として中間結果が得られます。中間結果が完了するとイベントがトリガーされ、プロッターオブジェクトがそのイベントをリッスンして、計算クラスの中間結果メンバー変数にアクセス/プロットします。これは最も完全に分離されているように見えます。これは、計算ロジックがコード化されるための知識がないためです。

最終的に、計算は別のオブジェクトでキャプチャおよび処理する必要がある中間結果を生成して破棄します。元の関数を変更せずに追加のロジックを散在させる何らかの方法が必要です。

他のアイデアはありますか?これはMatlabで行われていますが、他の言語でこれに取り組む従来の方法がある場合は、それについて学びたいと思っています。

過去の研究:

この問題は、 この質問 のように、ロギングコードを整理するのと非常に似ています。ただし、ロギングステートメントがビジネスロジックに散在していることは広く受け入れられているようですが、プロットがより強力な分離を要求するのか、それとも不可分にそれ自体がビジネスロジックと見なされて計算コード内に含まれるのかは不明です。

2
Dragonsheep

私は解決策#5に行くでしょう-標準の依存性注入:

  • 構築時(計算がクラスに実装されている場合)、または関数を呼び出すときに、計算ロジックは中間結果を報告するためにいくつかのインターフェイスのインスタンスを取得します。そのインターフェースには、計算中に適切な場所で呼び出すことができるメソッドを含める必要があります。

そのようにして、計算はそのインターフェースの実装について何も知りません(これは、ロガー、プロットロジック、他の種類のGUI、または完全に異なる何かである可能性があります)。中間結果が処理されるか、すぐに表示されるか、バッファリングされるか、非同期イベントとしてどこかに送信されるか、または無視されるか、およびその方法はわかりません。

GUIでこれらの結果をプロットする場合は、これを正確に実行するインターフェース実装を渡す必要があります。それでも、2つのコンポーネントは厳密に分離されています。

3
Doc Brown