5

質問は難しいかもしれません(その性格や記述方法のため)。データ層のないデスクトップアプリケーション用のMVC

私はこのアプリを書いています:
a)desktop app;
b)データベース、ファイル、または他のリポジトリの意味でのデータレイヤーがない(データの保存、保存、ロードの必要はありません)。 c)appにはいくつかの計算アルゴリズムが実装されています(Genetic Algorithm)。
b)は、アプリケーションと計算結果のコントロールを表示するGUIを提供します。

私はMVCパターンを使用することを考えていますが、使用方法は疑問です。私はデータベース(例えば、ユーザの入力に基づいて実行中にデータが生成される)の意味でデータレイヤーを持たないので、この実装でMVCを使用する方法について懸念しています。これまで私は2つのアプローチを思いついた。

  1. GUIはビューです。 GeneticAlgorithmはコントローラです。 GeneticAlgorithmResultsはModel(データのみを格納するクラス)です。基本フロー:

    • ビューは、ユーザ入力をコントローラに送信します。
    • コントローラはユーザー入力を処理しており、データを生成しています。
    • コントローラは生成されたデータをモデルに送信します。
    • モデルは新しいデータについてビューに通知します。
    • ビューは新しいデータをプルし、表示を更新します。
  2. GUIはビューです。 AppEngineはコントローラです。 GeneticAlgorithm nad GeneticAlgorithmResultsはモデルです。今度は:

    • ビューはユーザー入力をコントローラーに送信します。
    • コントローラはユーザ入力を処理しており、制御信号をモデルに送信しています。
    • モデルは内部状態を更新します(新しいデータを生成します)。
    • モデルはコントローラに新しいデータについて通知します。
    • コントローラはモデルにデータをプルします。
    • コントローラはデータを処理します。
    • コントローラは、処理されたデータをビューにプッシュします。
    • ビューで表示が更新されます。

最初のアプローチは、より簡単でより多くのMVCのようであるように思われます。問題は、いくつかのロジックがモデルになければならないということです。すべてのデータ更新が表示されるわけではないため、モデルに通知するかどうかを決めるか、少しずつ変化するわけではありません。これらの決定はユーザーの入力に基づいて行われます。さらに、実際の表示の前にデータの追加処理が必要になることがあります。これはビューに表示されます。

一方、第2のアプローチは、より複雑で、多くのメッセージがタスクを達成するために渡されているように見えます。しかし、それはコントローラへのLogicを完全に制御し、View、Controller、およびModel(MVCの主な目的)の責任を分けます。

どのアプローチをお勧めしますか?あるいは、私はそれらを混ぜ合わせて、第2のアプローチからのコミュニケーションの流れと最初のアプローチアーキテクチャを使用するべきでしょうか?またはいくつかの異なるデザイン?

答えて

2

私のMVCの理解から、第2のバージョンは厳格なMVCのパラダイムによく似ています。しかし、私の非常に賢い教師の一人は、デザインパターンは、ガイドラインの緩いセットを与えるために存在し、必ずしもTに従うことを意味するものではないと私に言った。

私の意見では、良いアイデア。いくつかのロジックがモデルで終わると、それは世界の終わりではなく、コンポーネントの分離を追跡することについてもっと注意する必要があるということを意味します。 MVCを少し修正すれば、人生を50%(メッセージのオーバーヘッドが少ない)簡単にすることができれば、おそらく良い考えです。

1

私は間違いなく2番目の実装に近いものに行きます。はい、それは多くのメッセージが前後に渡されたようですが、アプリケーションが成長して変更された場合は、小さなクラスでアプリケーションを構築したことに満足しています。

考えてみましょう:アルゴリズムの切り替え、実行、表示用のデータの処理など、日常的なタスクを処理するロジックはどこですか?

遺伝的アルゴリズムは、ある種の入力または開始データで動作しますが、そうではありませんか?これはデータアクセスレイヤーから取得します。シードデータや初期化条件は必要ありませんか?あなたの結果をファイルに保存し、後でレビューのために検索するのはどうでしょうか?私はあなたのアプリケーションが成熟したらこれを行う必要があると思います。最初にファイルベースの永続性を使用することを期待してください。それを感じている場合は、後でデータベースにアップグレードすることができます。抽象化されたデータ永続性レイヤーをコード化する場合、後でビジネスロジックを変更しなくても、ファイルからデータベースへの変更をサポートできます。

アルゴリズムを実装するには、戦略パターンを使用する必要があります。これにより、各アルゴリズムのビジネスロジックを変更することなく、ソルバーの実装を遺伝的アルゴリズムから他のアルゴリズムに変更することができます。

ビジネスレイヤーには入力を受け取るISolverが表示され、mySolver.Solve()を呼び出します。ビジネスレイヤロジック(Open Closed Principle)を変更せずに、異なるバージョン間で切り替えることができるはずです。ビジネスロジックがアルゴリズムとやりとりする方法の唯一の違いは、コンストラクタ内にあるはずです。そこにも、Factoryパターンの使用を検討する必要があります。

関連する問題