5

質問はトリッキーかもしれません (その性質または私の説明方法のため) ので、答える前にこれをよく読んでください。

私はこのアプリを書く必要があります:
a)デスクトップアプリ。
b) データベース、ファイル、またはその他のリポジトリという意味でのデータ層がない (データを保存、保存、またはロードする必要がない)。
c) アプリには、いくつかの計算アルゴリズムが実装されます (遺伝的アルゴリズム)。
b) アプリと計算結果のコントロールを表示する GUI を提供します。

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

  1. GUI はビューです。GeneticAlgorithm はコントローラーです。GeneticAlgorithmResults はモデルです (データのみを格納するクラスとして)。基本的な流れ:

    • ビューはユーザー入力をコントローラーに送信します。
    • コントローラーはユーザー入力を処理し、データを生成します。
    • コントローラーは、生成されたデータをモデルに送信します。
    • モデルは新しいデータについてビューに通知します。
    • ビューは新しいデータを取得し、表示を更新します。
  2. GUI はビューです。AppEngine はコントローラーです。GeneticAlgorithm と GeneticAlgorithmResults はモデルです。これで、次のようになりました。

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

最初のアプローチはより簡単で、MVC に似ているようです。問題は、一部のロジックをモデルに含める必要があることです。すべてのデータ更新が表示されるわけではないため、モデルに通知するタイミングを決定するか、小さな変更ごとではなくデータのセットで表示が更新される可能性があります。これらの決定は、ユーザーの入力に基づいて行われます。さらに、実際に表示する前に、データの追加処理が必要になる場合があります。これはビューにあります。

一方、2 番目のアプローチはより複雑で、タスクを達成するために多くのメッセージが渡されているように見えます。ただし、コントローラーにロジックの完全な制御を与え、ビュー、コントローラー、およびモデルの責任を分離します (これが MVC の主な目的です)。

どのアプローチをお勧めしますか? それとも、それらを混ぜて、最初のアプローチのアーキテクチャを使用し、2 番目のアプローチからの通信フローを使用する必要がありますか? それとも違うデザイン?

4

2 に答える 2

2

MVC についての私の理解では、2 番目のバージョンはより厳密な MVC パラダイムに似ています。しかし、私の非常に知的な教師の 1 人は、デザイン パターンは大まかな一連のガイドラインを提供するためにあるものであり、必ずしも T.

私の意見では、両方の混合は良い考えです。いくつかのロジックがモデルで終わったとしても、それは世界の終わりではなく、コンポーネントの分離を追跡することにもっと注意を払う必要があることを意味します。MVC を少し変更するだけで作業が 50% 楽になる (メッセージのオーバーヘッドが減る) 場合、それはおそらく良い考えです。

于 2009-04-21T00:26:13.937 に答える
1

私は間違いなく、2番目の実装に近いものを使用します。確かに、より多くのメッセージがやり取りされているように見えますが、アプリケーションが成長して変更された場合、小さなクラスでアプリケーションを構築できたことに満足するでしょう。

考えてみてください: アルゴリズムの切り替え、アルゴリズムの実行、表示用のデータ処理などのありふれたタスクを処理するロジックはどこにあるのでしょうか?

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

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

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

于 2009-04-21T01:09:09.607 に答える