RailsをMVCデザインパターンの定番と見なすのは最善の方法ではないかもしれません。このフレームワークは、いくつかの固有の欠点を伴って作成されており(私は別の投稿でそれについて詳しく説明しました)、コミュニティはたった今、フォールアウトに対処し始めています。DataMapper2の開発を最初の主要なステップと見なすことができます。
いくつかの理論
そのアドバイスをする人々は、非常に一般的な誤解に悩まされているようです。それでは、それを明確にすることから始めましょう。最新のMVCデザインパターンでは、モデルはクラスまたはオブジェクトではありません。モデルはレイヤーです。
MVCパターンの背後にある中心的な考え方は関心の分離であり、その最初のステップはプレゼンテーション層とモデル層の間の分割です。プレゼンテーション層がコントローラー(インスタンス、ユーザー入力の処理を担当)、ビュー(インスタンス、UIロジックを担当)、およびテンプレート/レイアウトに分割されるのと同様に、モデル層も同様です。
モデルレイヤーの主な構成要素は次のとおりです。
ドメインオブジェクト
ドメインエンティティ、ビジネスオブジェクト、またはモデルオブジェクトとも呼ばれます(混乱を招くだけなので、後者の名前は嫌いです)。これらの構造は、人々が通常誤って「モデル」と呼ぶものです。彼らはビジネスルール(ドメインロジックの特定のユニットのすべての計算と検証)を含める責任があります。
ストレージの抽象化:
通常、データマッパーパターンを使用して実装されます(この名前を悪用したORMと混同しないでください)。これらのインスタンスは通常、ドメインオブジェクトへの情報の保存(およびドメインオブジェクトへの取得)を担当します。各ドメインオブジェクトは、ストレージのいくつかの形式(DB、キャッシュ、セッション、Cookie、/ dev / null)があるのと同じように、複数のマッパーを持つことができます。
サービス:
アプリケーションロジック(つまり、ドメインオブジェクト間の相互作用およびドメインオブジェクトとストレージ抽象化間の相互作用)を担当する構造。それらは、プレゼンテーション層がモデル層と相互作用するための「インターフェース」のように機能する必要があります。これは通常、Railsのようなコードで最終的にコントローラーに表示されるものです。
これらのグループ間のスペースには、DAO、作業単位、リポジトリなど、いくつかの構造があります。
ああ...そして(Webのコンテキストで)MVCアプリケーションと対話するユーザーについて話すとき、それは人間ではありません。「ユーザー」は実際にはあなたのウェブブラウザです。
では、神々はどうですか?
恐ろしくてモノリシックなモデルを使用する代わりに、コントローラーはサービスと対話する必要があります。ユーザー入力から特定のサービス(MailService
またはRecognitionService
)にデータを渡します。このように、コントローラーはモデルレイヤーの状態を変更しますが、これは明確なAPIを使用して行われ、内部構造をいじることはありません(これにより、リークのある抽象化が発生します)。
このような変更は、すぐに反応するか、ビューインスタンスがモデルレイヤーから要求するデータにのみ影響するか、またはその両方に影響する可能性があります。
各サービスは、任意の数のドメインオブジェクトおよびストレージの抽象化と対話できます(ただし、通常はほんの一握りです)。たとえば、RecogitionService
は記事のストレージの抽象化についてあまり気にすることができませんでした。
クロージングノート
このようにして、任意のレベルで単体テストが可能で、結合が少なく(正しく実装されている場合)、アーキテクチャが明確に理解できるアプリケーションを取得できます。
ただし、覚えておいてください。MVCは小さなアプリケーション向けではありません。MVCパターンを使用してゲストブックページを作成している場合は、間違っています。このパターンは、大規模なアプリケーションで法と秩序を施行するためのものです。
PHPを第一言語として使用している人には、この投稿が関連している可能性があります。これは、いくつかのコードスニペットを含むモデルレイヤーのもう少し長い説明です。