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