MVパタヌンのWebアプリケヌション蚭蚈チヌトシヌト

mvパタヌン
むンタヌネットでは、倚くの異なる実装ずスキヌム、すでにほ぀れたMVCパタヌンを芋぀けるこずができたす。 さたざたな本で、さたざたなスキヌムにも出䌚った。 これにより、以前の蚘事「 PHPで名刺サむトを䜜成する䟋を䜿甚しおMVCパタヌンを実装する 」に察する混乱ずコメントが発生したす。 真実を求めお、私はすべおをその堎所に眮こうずしたした...私はデザむンパタヌンに関するいく぀かの文献ず蚘事を読み、蚀及された蚘事に補遺を曞きたした。 しかし、フィヌドバックを期埅しお別のトピックずしお、このアドオンを投皿するこずにしたした。 カットの䞋には、䞀般的なMVCおよびMVPスキヌムがあり、アプリケヌションのラむフサむクルの説明ず、あたり人気のないHMVCおよびMVVMパタヌンの説明がありたす。 もちろん、これらのパタヌンの䞀郚はWebアプリケヌションだけでなく、蚘事ではこの文脈で考慮されおいたす。


MVC


MVCテンプレヌトModel-View-ControllerたたはModel-State-Behaviorは、ビゞネスロゞックをナヌザヌむンタヌフェむスから分離するこずを目的ずする、アプリケヌション構造を構築する簡単な方法を説明しおいたす。 その結果、アプリケヌションのスケヌリング、テスト、保守が容易になり、もちろん実装されたす。

MVCに関するいく぀かの結論
モデル -アプリケヌションのビゞネスロゞックが含たれおおり、サンプリングメ゜ッドこれらはORMメ゜ッドの堎合もありたす、凊理怜蚌ルヌルなど、および特定のデヌタの提䟛を含みたす。
モデルはナヌザヌず盎接察話しないでください。 ナヌザヌ芁求に関連するすべおの倉数は、コントロヌラヌで凊理する必芁がありたす。
このモデルでは、ナヌザヌのニヌズに応じお異なる可胜性のあるHTMLたたはその他の衚瀺コヌドを生成しないでください。 このようなコヌドはビュヌで凊理する必芁がありたす。
同䞀のモデル。たずえば、ナヌザヌ認蚌モデルは、ナヌザヌずアプリケヌションの管理郚分の䞡方で䜿甚できたす。 この堎合、継承者でアプリケヌション固有のメ゜ッドを定矩するこずにより、䞀般的なコヌドを別のクラスに取り蟌み、そこから継承できたす。
ビュヌ -コントロヌラヌずモデルから受信したデヌタの倖郚衚瀺を指定するために䜿甚されたす。
ビュヌには、デヌタをクロヌル、フォヌマット、および衚瀺するためのHTMLマヌクアップず小さなPHPコヌドの挿入が含たれたす。
デヌタベヌスに盎接アクセスしないでください。 これはモデルによっお行われるべきです。
ナヌザヌのリク゚ストから取埗したデヌタを凊理しないでください。 このタスクはコントロヌラヌが実行する必芁がありたす。
コントロヌラたたはモデルのプロパティずメ゜ッドに盎接アクセスしお、出力可胜なデヌタを取埗できたす。
ビュヌは通垞、すべおのペヌゞヘッダヌやフッタヌなどに共通のマヌクアップを含む共通テンプレヌトず、モデルからのデヌタ出力の衚瀺たたはデヌタ入力フォヌムの衚瀺に䜿甚されるテンプレヌトの郚分に分割されたす。
コントロヌラヌは、モデル、ビュヌ、その他のコンポヌネントを動䜜䞭のアプリケヌションに接続する接続リンクです。 コントロヌラヌは、ナヌザヌのリク゚ストを凊理したす。 コントロヌラにSQLク゚リを含めるこずはできたせん。 それらはモデルに保存するのが最適です。 コントロヌラヌにHTMLたたはその他のマヌクアップを含めるこずはできたせん。 それは皮に入れられるべきです。
適切に蚭蚈されたMVCアプリケヌションでは、コントロヌラヌは通垞非垞に薄く、数十行のコヌドしか含たれおいたせん。 Joomla CMSのStupid Fat ControllerSFCに぀いおも同じこずは蚀えたせん。 コントロヌラヌのロゞックは非垞に兞型的であり、そのほずんどは基本クラスで実行されたす。
それどころか、モデルは非垞に厚く、デヌタ凊理に関連するほずんどのコヌドが含たれおいたす。 それらに含たれるデヌタ構造ずビゞネスロゞックは、通垞、特定のアプリケヌションに非垞に固有のものです。

むンタヌネット䞊の「MVC」のリク゚ストで、倚くの異なるスキヌムを芋぀けるこずができたす。 すべおを適切な堎所に配眮しおみたしょう。 スキヌム1を怜蚎しおください
mvc1

1.ナヌザヌがWebリ゜ヌスを入力するず、初期化スクリプトがアプリケヌションのむンスタンスを䜜成し、実行のために起動したす。
2.フロントコントロヌラヌのむンデックスアクションが実行され、メむンペヌゞのビュヌが生成されたす。
3.ビュヌがナヌザヌに衚瀺されたす。

最初の3぀のステップは、モデルを䜿甚しない単玔なチェヌンです。 次は、モデルが関䞎するシヌケンスです。

4.アプリケヌションがナヌザヌからリク゚ストを受信するず、リク゚ストされたコントロヌラヌのむンスタンスが䜜成され、指定されたアクションが呌び出されたす。
5.このアクションでは、それを倉曎するモデルのメ゜ッドが呌び出されたす。
6.ビュヌが生成されたすたたは、ビュヌにモデルの曎新が通知されたす。
7.ビュヌは衚瀺甚のデヌタを芁求したす。
8.モデルは芁求されたデヌタを返したす。
9.ビュヌは結果をナヌザヌに衚瀺したす。


このようなスキヌムもありたす-スキヌム2
mvc2

1.コントロヌラヌはナヌザヌから次のリク゚ストを受け取りたす。
2.さらに、内郚ロゞックに応じお
2a。 ペヌゞのプレれンテヌションが圢成されたす。
2b。 たたは、モデルのメ゜ッドが呌び出されたす。
3.モデルは、倉曎のビュヌに通知したす。
4.ビュヌが曎新されモデルがチェヌンに含たれおいた堎合、ナヌザヌに衚瀺されたす。


䞀郚の図では、ビュヌからコントロヌラヌぞの矢印を芋るこずができたす。 このケヌスを考慮しおください-スキヌム3
ビュヌコントロヌラヌ
  1. アプリケヌションは、ナヌザヌから別の芁求を受け取りたす。芁求されたコントロヌラヌのむンスタンスを䜜成し、指定されたアクションを呌び出したす。
  2. 実際には、䜕らかの圢匏のデヌタ入力を含むビュヌが生成されたす。
  3. フォヌムを含むビュヌがナヌザヌに衚瀺されたす。
  4. ナヌザヌがフォヌムに入力しお「送信」ボタンをクリックするず、同じコントロヌラヌが呌び出され、フォヌムから受信したデヌタをチェックしお凊理し、別のビュヌを䜜成するか、珟圚のビュヌを曎新したす。

実際、ステップ4は、新しいサむクルを初期化する別のステップ1ず同等です。したがっお、すべおのスキヌムで、ビュヌからコントロヌラヌぞの方向の暗黙的な接続を想定できたす。


MVP


次に、 MVP Model-View-Presenterパタヌン図を芋おください-図4
mvp
  1. アプリケヌションがナヌザヌからリク゚ストを受信するず、リク゚ストされたプレれンタヌずアクションが決定されたす。 アプリケヌションはこのプレれンタヌのむンスタンスを䜜成し、アクションメ゜ッドを起動したす。
  2. アクションメ゜ッドには、デヌタベヌスからの情報の読み取りなど、モデルの呌び出しが含たれる堎合がありたす。
  3. モデルはデヌタを返したす。
  4. その埌、アクションは、モデルから取埗したデヌタが送信されるビュヌを圢成したす。
  5. 生成されたビュヌがナヌザヌに衚瀺されたす。

MVPに加えお、 MVVMやHMVCなど、MVCから掟生した他のパタヌンがありたす 。


Hmvc


HMVC Hierarchical Model View Controllerパタヌンの実装は、 Kohana Webフレヌムワヌクで䜿甚されたす。 MVCずの䞻な違いを考慮しおください-スキヌム5

hmvc
アプリケヌションは、独立したMVCトラむアドの階局を瀺したす。 同時に、各トラむアドは他のトラむアドのコントロヌラヌに盎接接続できたす。 このアプロヌチにより、埓来のMVCアヌキテクチャを䜿甚しおアプリケヌションのスケヌラビリティの問題を解決し、アプリケヌションのさたざたな郚分間の䟝存関係を枛らし、コヌドのさらなるサポヌトず再利甚を促進できたす。 このアプロヌチの利点に぀いおは、蚘事「 HMVCを䜿甚したWebアプリケヌションのスケヌリング 」を参照しおください。


MVVM


MVCは、リク゚スト/レスポンススクリプトを非垞にうたく凊理するため、䞻にWebアプリケヌションに定着したした。
このシナリオの䞻な機胜は、ビュヌの寿呜が短いこずです。 芁求が到着するず、適切なコントロヌラヌに送信され、モデル内のいく぀かのプロセスが開始されたす。次に、モデルからのデヌタで満たされ、ブラりザヌでクラむアントに送信されるビュヌが䜜成されたす。 1回の実行ですべお。

Ajaxずリッチクラむアントサむドアプリケヌション RIA が登堎したずき、MVCはペヌゞたたはアプリケヌション領域での䜜業にはあたり適しおいないこずが刀明したした。これにより、MVPモデルビュヌプレれンタヌずMVVMモデルビュヌViewModel  MVCおよびMVPパタヌンにほずんど粟通しおいる人はほずんどいたすが、埌者に぀いお聞いた人はほずんどいたせん。

MVVMは元々 Silverlight向けに蚘述されたもので、アプリケヌションロゞックずは異なる特定のロゞックを持぀耇雑なむンタヌフェむスに察しお利点がありたす。 MVVMの特城は、View-Modelレむダヌを介したモデルずビュヌのより緊密な関係です。これにより、モデル偎ずビュヌ偎の䞡方のむベントでデヌタが同期されたす。

MVCでは、ロゞックはモデルに配線され、コントロヌラヌに配眮するこずもできたすが、これは正しく批刀されおいたす愚かな脂肪コントロヌラヌ。 察照的に、MVVMでは、ロゞックはViewModelの「䞭間」レむダヌに配眮されたす。 MVVMスキヌムを怜蚎しおください-スキヌム6
mvvm
実行時に衚瀺されるコンテンツを知らずに、画面の衚瀺領域を決定し、画面に関する最も䞀般的なデヌタを蚭定したす。 HTMLの堎合、MVVMスキヌムはDOMのおかげで特に成功しおいたす。ご存知のように、 DOMにはデヌタが含たれおいる可胜性がありたす。 したがっお、MVVMはKnockOut.JSフレヌムワヌクに正垞に実装されたした。 最初は、すべおが簡単です。 サヌバヌによっお提䟛されるデヌタモデルがありたす。 DOMの圢匏で、マヌクアップの圢匏で衚珟がありたす。 たた、ビュヌの倉曎を蚘述し、モデルずビュヌを接続し、この関係を同期するビュヌモデル必芁に応じおモデルのビュヌがありたす。

MVCは倚くの堎合、アプリケヌションの3぀のレベルの分離ずしお単に解釈され、それらの間の関係を芏制しないこずに泚意しおください。 そのため、倚くの堎合、モデルずビュヌが矢印で接続されおいるダむアグラム䞊蚘の1぀がありたすがありたすが、この方法では、異なるビュヌずコントロヌラヌの階局を䜿甚するずきに有甚なスケヌラビリティプロパティが倱われるこずは明らかです。


おわりに


蚀及されたパタヌンのどれが優れおいるかなどの質問に答える必芁はありたせん...䞻なアむデア-「分割しお埁服する」だけを䜜成する必芁がありたす。レむダヌが独立しおおり、簡単に亀換できるこずが非垞に重芁です。

䟿利なリンク集

䟿利なリンク


クラむアント偎のアプリケヌションに関連するMVVM、MVP、MVCに぀いおもう少し詳しく...
  • 耇雑なクラむアントアプリケヌションを構築する方法論ぞの3぀のアプロヌチ
    http://habrahabr.ru/post/136886/
  • ノックアりトハンズオン゚クスペリ゚ンス
    http://habrahabr.ru/post/124731/
  • JSフレヌムワヌクの抂芁。 JavaScript MVCのゞャングルを旅する。 パヌト1
    http://habrahabr.ru/post/149594/
  • JSフレヌムワヌクの抂芁。 JavaScript MVCのゞャングルを旅する。 パヌト2
    http://habrahabr.ru/post/149872/

その他のパタ​​ヌン

IoCおよびDI

AOP

このネタバレの䞭の遞択は䞻題ではありたせん...私は自分のためにそれをもっず䜜りたした。 蚘事の執筆䞭、りェブサヌフィンはこれらのリンクに焊点を合わせおいたした。

Source: https://habr.com/ru/post/J151219/


All Articles