6

自宅で個人用Webアプリケーションを再構築する際に、MVCの厳密な解釈に固執しようとしていますが、いくつかの問題があります。

アプリケーションは、財務追跡アプリケーションです。その月の銀行口座取引のリストである最初のページで立ち往生しています。トランザクションリストは私のモデルです。コントローラーとビューは、この時点で想像できるほど簡単です。

ただし、ページの上部にも2つのボタンがあります。それらは矢印で、1つは前月に対応し、もう1つは翌月のトランザクションリストに対応します。前月/来月のトランザクションがない場合はこれらのボタンを有効にしたくないので、データベースに問い合わせて、各ボタンが実際にどこかにリンクする必要があるかどうかを判断する必要があります。

私が読んだほとんどのことから、可能な限りデータベースアクセスをモデルにカプセル化する必要があり、コントローラーとビューでのデータベースアクセスはほとんどまたはまったくありません。

ただし、これらのボタンは基本的に、データベースに「次の/前の月のトランザクションはありますか?」と尋ねる必要があります。答えは、それらのリンクが無効になっているかどうか、およびユーザーをどこに送るかを決定します。

厳密に言えば、トランザクションが要求された範囲外に存在するかどうかはトランザクションリストモデルの関心を超えているため、それらのロジックをトランザクションリストモデルに入れることは適切ではないようです。

トランザクションが存在するすべての年月の組み合わせに対応する別のモデルを作成することもできると思います。次に、このモデルとトランザクションリストを適切なビューに渡すことができます。

または、no-database-access-outside-the-modelパラダイムから逸脱して、ビューにいくつかのクイックDBクエリをスローする必要があります(結果は本質的にUIの問題であり、ナビゲーションが容易になるため)?

この概念的な問題についてどう思いますか?

ところで、私はフレームワークを使用していません。これは、MVCパターンの要点をよりよく理解するために設計されたペットプロジェクトです。

4

2 に答える 2

2

... no-database-access-outside-the-modelパラダイムから逸脱し、ビューにいくつかの簡単なDBクエリをスローする必要があります...

簡単な答えは:いいえ。MVCの学習と一般的なコーディングの改善に本当に興味がある場合は、「理由だけで」ショートカットを使用することは非常に悪い考えです。ドメインロジックの分離はMVCの基本的な概念であり、これに違反すると、基本的にMVCから、ひどいコードと「MVCフレームワーク」が支配的な領域に移動することになります。「MVCの要点」を学びたい場合は、要点は関心の分離のようなものであり、非常に重要であることを理解する必要があります。

あなたの質問の多くのテキストは、モデルがどうあるべきかについてのいくつかの混合されたアイデアを示唆しているので、MVCモデルに関して最もリンクされた答えにあなたをリダイレクトするつもりです。その答えは、モデルの概念について知りたいと思うすべてのものを網羅しています。それから最も重要な概念を要約すると、モデルはクラスではなく、レイヤーです。モデルレイヤーには多くのコンポーネントがあり、すべてが独自の機能を果たします。これにより、テスト可能、拡張可能、セマンティック、および論理ドメインロジックレイヤーが残ります。

注意することを忘れないでください。MVCについては、信頼できる情報よりもはるかに多くの誤った情報があります。適切なMVCを学習するためにできる最悪のことは、MVCであると主張するフレームワークの内部を調べることです。

編集:私は応答中に言語がPHPであると仮定したので、私の答えのいくつかはその仮定を反映しているかもしれません。ただし、この概念はほぼすべての言語に適用できます

于 2012-08-21T19:28:41.550 に答える
1

アプリケーションは、財務追跡アプリケーションです。その月の銀行口座取引のリストである最初のページで立ち往生しています。トランザクションリストは私のモデルです。コントローラーとビューは、この時点で想像できるほど簡単です。

Webページ上のすべてのものは、Viewドメインに分類されます。「リスト」は視覚的なオブジェクトです。

Webアプリケーション/ページの場合、モデルはサーバーのデータベース内に存在します。Webページに存在するすべてのもの(ボタン、フォーム、リストボックスなど)は、ドメインの表示です。

私が読んだほとんどのことから、可能な限りデータベースアクセスをモデルにカプセル化する必要があり、コントローラーとビューでのデータベースアクセスはほとんどまたはまったくありません。

従来、ViewオブジェクトはModelオブジェクトと直接通信します。つまり、Viewオブジェクトがデータベースと通信する方法を提供する必要があります。

例、

  • http // server / transactions(すべてのトランザクションを取得)
  • http // server / transactions?from = x(xからトランザクションを取得)
  • http // server / transactions?from = x&to = y(xからyへのトランザクションを取得)

ビューによるモデルへのインターフェースである可能性があります。

于 2012-08-24T10:54:12.483 に答える