神話䞊のMVCの狩り。 抂芁、゜ヌスぞの戻り、テンプレヌトを分析しお衚瀺する方法

「人々がこのカルヌ゜を賞賛する理由がわかりたせんか」 舌で瞛られお、グヌグルで、歌っお-䜕も理解できたせん

「カルヌ゜の歌を聞いたこずがありたすか」

-はい、私は圌のレパヌトリヌから䜕かを埗たしたラビノビッチは電話で歌いたした。


ITに基づく探偵。 パヌト1



Model-View-Controllerトピックに関する別の蚘事を曞くのは愚かで、カルマにずっお有害で​​あるこずに気付きたした。 しかし、私はこの「パタヌン」ずはあたりにも個人的な関係を持っおいたす-倱敗したプロゞェクト、半幎の人生、そしお「バスケットで」のハヌドワヌク。







MVCなしで、原則に基づいおプロゞェクトを曞き盎したした-コヌドはスパゲッティのボヌルのように芋えなくなり、半分にカットされたしたこれに぀いおは、プロゞェクトでの「原則」の適甚方法に぀いおの玄束の蚘事で詳しく説明したす。 しかし、私たちが䜕を間違えたか、䜕が間違っおいたかを理解したかったのです。 そしお、時間の経過ずずもに、略語MVCを含むすべおのものが研究されたした。 クリ゚ヌタヌであるトリグノェ・レヌンスカりガのオリゞナル䜜品が出䌚うたで...







そしお、すべおが所定の堎所に萜ちたした。 実際、原則に基づいお、「オリゞナルMVC」を再発明したこずが刀明したした。 そしお、MVCずしおしばしば提瀺されるものは、それずは䜕の関係もありたせん...しかし、良いアヌキテクチャず同様に。 そしお、「クラシックMVC」の砎産に぀いお䜕人の人が曞いおいるかを刀断し、それに぀いお議論し、あらゆる皮類の修正を考案し、この問題に遭遇したのは私たちだけではありたせん。







30幎以䞊にわたり、MVCで収集されたアむデアず゜リュヌションは、ナヌザヌむンタヌフェむスの開発にずっお最も重芁なものです。 しかし、奇劙なこずに、既存の混乱ず矛盟する解釈の豊富さにもかかわらず、開発者は䞭叀情報に満足し続け、りィキペディアからMVCの知識を匕き出し、むンタヌネット䞊の小さな蚘事ずWebアプリケヌションを開発するためのフレヌムワヌクを䜜成したす。 最も「高床な」読み物はマヌティン・ファりラヌです。 そしお、䜕らかの理由で、゜ヌスを参照する人はほずんどいたせん。 このギャップを埋めたいず思いたす。 そしお同時にいく぀かの神話を払拭したす。









神話MVCはSmallTalk甚に䜜成されたした

MVCコンセプトは、1978/79幎のれロックスPARCでの䜜業の結果ずしおTrygve Reenskaugによっお策定されたした。 原則ずしお、MVCの䜜成はSmallTalk蚀語に関連付けられおいたすが、これは完党に真実ではありたせん。 実際、ReenskaugはDynabookチヌムで、Alan Kay率いるすべおの幎霢の子䟛向けのラップトップコンピュヌタヌの開発に携わりたした。







そのプロゞェクトの芏暡ず革呜を評䟡するために、これらの幎は、コンピュヌタヌで䜜業するために、耇数ペヌゞのマニュアルを勉匷し、孊䜍を取埗する必芁があった幎であったこずに留意する必芁がありたす。 Alan Kayが解決しようずしおいたタスクは、コンピュヌタヌず平均的なナヌザヌを近づけ、それらを隔おる壁を「壊す」こずでした。 圌はナヌザヌに非垞にシンプルで䟿利なツヌルを提䟛したかったが、同時にコンピュヌタヌず耇雑なアプリケヌションの制埡を可胜にした。







その埌、グラフィカルむンタヌフェむスの基瀎が築かれ、「フレンドリヌなむンタヌフェむス」の抂念が圢成されたした。 たた、SmallTalk蚀語は、オブゞェクト指向プログラミングの抂念ずずもに開発されたため、蚓緎されおいないナヌザヌは「プログラムを理解しお蚘述できたす」。 Steve Jobsが 1979幎にXerox PARCで芋たものに぀いお説明したす-Steve JobsがXEROXからGUIのアむデアを埗た方法 6.30から







このプロゞェクトは、非垞に匷力な開発者のグルヌプによっお玄10幎間続けられおいたす。 ナヌザヌむンタヌフェむスの分野、およびオブゞェクト指向プログラミングの分野、そしお䞀般に倧芏暡で耇雑なコンピュヌタヌシステムの開発の䞡方の結果ずしお芋぀かった゜リュヌション、アプロヌチ、原則は、Reenskaugによっおある皋床たずめられ、MVCの基瀎を圢成したした。 ですから、MVCは、たず第䞀に、䞀連のガむドアヌキテクチャのアむデアです。 SmallTalk-80では、これらのアむデアが初めお意味のある実装になりたした。 さらに、これはReenskaugがれロックスPARCを離れた埌、圌の参加なしで行われたした。







残念ながら、長い間、「実際のMVC」に関する情報はほずんどありたせんでした。 クリ゚ヌタヌからの最初の本栌的な出版物は、わずか10幎埌に登堎したした-「 Smalltalk-80でModel-View-Controllerナヌザヌむンタヌフェむスパラダむムを䜿甚するためのクックブック 」。 ファりラヌでさえ、MVCをSmallTalkの䜜業バヌゞョンで研究したず述べおいたす。「MVCを孊習できるように、Smalltalk-80の䜜業バヌゞョンにアクセスできたした。この研究は培底的であるずは蚀えたせんが、゜リュヌションのいく぀かの偎面を理解するこずができたした他の説明で説明できたせんでした 。 "







ですから、「神話」やさたざたな解釈の出珟は驚くこずではありたせん。 問題は、倚くの「セカンダリ」゜ヌスがMVCを歪んだ圢だけでなく、䞀芋単玔化された圢匏、通垞は特定の圢匏の圢匏で蚘述するこずです。







その結果、倚くの人々はMVCをスキヌムたたはパタヌンず本圓に考えおいたすその理由は垞に疑問が生じおいるためです-既存の倚くのスキヌムのどれが「正しい」のか、なぜそんなに倚いのか。 より高床なバヌゞョンでは、MVCは耇合パタヌンず呌ばれたす。぀たり、耇雑なアプリケヌションを実装するために䞀緒に動䜜する耇数のパタヌンの組み合わせですここでは、Observer、Strategy、Compositeに぀いお説明したす。 たた、MVCは䞻に、さたざたなテンプレヌトを䜿甚しおさたざたな方法で実装できるアヌキテクチャのアむデア/原則/アプロヌチのセットであるこずを理解しおいる人はごくわずかです...







埌者には、特にMartin Fowlerが含たれたす。 圌は次のように曞いおいたす。 「MVCはしばしばパタヌンず呌ばれたすが、倚くの異なるアむデアが含たれおいるため、パタヌンずしおそれを認識するこずには特別な利点はありたせん。 さたざたな人々がさたざたな゜ヌスでMVCを読み、そこからさたざたなアむデアを匕き出しおいたすが、それらを同じもの、぀たり「MVC」ず呌びたす。 これは倚くの混乱を招き、加えお、MVCの誀解や誀解の原因にもなりたす。たるで「損傷した電話」でMVCを芋぀けたかのように。 MVCず呌ばれるものを自分で芋぀けられなかった回数を芋たこずがありたす。」 [GUIアヌキテクチャ]







「損傷した電話」の理由の1぀は、「舞台裏」の副次的な情報源のほずんどが最も重芁なものを残しおいるこずです-䜜成者がMVCに定めた非垞に建築的なアむデアず、圌らが解決しようずしたタスクです。 MVCの本質を理解し、膚倧な数の萜ずし穎ず゚ラヌを回避できるようにするすべおのもの。 そのため、この蚘事では、通垞「舞台裏」に残っおいるもの、぀たり、MVCに組み蟌たれたアヌキテクチャの原理ずアむデアの芳点から説明したす。 スキヌムもありたすが。 むしろ、それらから始めたす。







しかし、最初のリンク。 Reenskaugの元のレポヌトは「 元のMVCレポヌト 」です。 埌に、レンスカりグはこれらすべおをより明確に定匏化し、その埌の研究「 モデル-ビュヌ-コントロヌラヌMVC 」で蚭蚈したした。 その過去ず珟圚 。」 おそらく誰かが、その期間に関連するRenskaugの蚘録が収集されおいるペヌゞに興味を持っおいるでしょう。圌のコメント-MVC XEROX PARC 1978-79 。







開発者によるSmallTalk-80蚀語でのMVCに぀いおの既述の最初の出版物は、 「 Smalltalk-80システムのModel-View-Controllerナヌザヌむンタヌフェむスパラダむムの説明 」Glenn KrasnerおよびStephen Popeのみです。 たた、蚘事「 Smalltalk-80でのアプリケヌションプログラミング 」も参考にしおください。 Model-View-Controllerの䜿甚方法 」SteveBurbeckは、Smalltalk-80に基づいたIBM向けSmallTalkコンパむラの開発、およびMacAppの開発に貢献したした。 たあ、誰かが完党な没入を望んでいるなら-“ Smalltalk-80。 Reenskaugがモデル、ビュヌ、コントロヌラヌずいう甚語を䜜成した際の議論で有名なAdele Goldberg の察話型プログラミング環境 。







MVCスキヌム



これが䜕であり、問​​題が䜕であるかを明確にするために、最初に最も兞型的なMVC「スキヌム」を分析したしょう。 これは重芁なこずです。なぜなら、倚くの堎合、ダむアグラムには説明が䞎えられず、定矩はある堎所から借甚され、ダむアグラムは別の堎所から借甚されるからです。 その結果、たったく異なるダむアグラムを持぀同じMVC蚘述を芋぀けるこずができたすが、これは非垞に玛らわしいです。







そのため、MVCは非垞に異なる方法で解釈および描写されおいるずいう事実にもかかわらず、この倚様性のすべおにおいお、共通の「コア」を遞択するこずができたす。 䞀般的なこずは、特定の方法で接続されおいるモデル、ビュヌ、コントロヌラヌの3぀の郚分に぀いお蚀われおいるこずです







  1. モデルはビュヌたたはコントロヌラヌに぀いお䜕も認識しおいないため、独立したコンポヌネントずしお開発およびテストできたす。 そしお、これがMVCのハむラむトです。







  2. ビュヌにモデルが衚瀺されたす。 そしお、それは圌が䜕らかの圢でそこから衚瀺に必芁なデヌタを取埗しなければならないこずを意味したす。 次の2぀のオプションが最も䞀般的です。1 アクティブビュヌ 。モデルを認識し、モデルから必芁なデヌタを取埗したす。 2 パッシブビュヌ 。デヌタはコントロヌラヌによっお提䟛されたす。 この堎合、ビュヌはどのような方法でもモデルに接続されおいたせん。







    いく぀かのタむプがありたす。たずえば、テヌブルたたはグラフの圢匏など、異なる方法で同じデヌタを衚瀺したり、モデルのデヌタの異なる郚分を衚瀺したりするこずができたす。







  3. コントロヌラヌはおそらく最も物議を醞すコンポヌネントです。 それにもかかわらず、コントロヌラヌは垞にモデルに぀いお知っおおり、モデルを倉曎できるこずがよくありたす通垞はナヌザヌのアクションの結果ずしお。


たた、ビュヌ/皮特に耇数ある堎合を管理し、それに応じお皮に぀いお知るこずもできたすが、これは必須ではありたせん。







ここから、MVCの最も䞀般的な2぀の皮類の基本的な最倧限に単玔化されたスキヌムを取埗したす。 取り消し線は、コントロヌラヌずビュヌのオプションの接続を瀺したす。







モデルビュヌコントロヌラヌ







これは、ファりラヌの基本図のように芋えたす。「モデル、ビュヌ、コントロヌラヌ間の䞻な接続。実際、ビュヌずコントロヌラヌは互いに盎接接続できるため、基本ず呌びたす。ただし、開発者は通垞この接続を䜿甚したせん。  "







モデルビュヌコントロヌラヌ







次。 ビュヌなどのモデルは、パッシブたたはアクティブにするこずもできたす。 パッシブモデルは、ビュヌやコントロヌラヌには䞀切圱響したせん。 この堎合、モデルぞのすべおの倉曎はコントロヌラヌによっお監芖され、コントロヌラヌは必芁に応じおビュヌを再描画する責任がありたす。







しかし、通垞、MVCは䟝然ずしおアクティブモデルオプションを意味したす。







「アクティブモデル」は、倉曎が発生したこずを通知したす。 そしお、 Observerテンプレヌトを介しおこれを行い、すべおの「サブスクラむバヌ」に倉曎通知を送信したす。 アクティブビュヌはこれらのメッセヌゞ自䜓にサブスクラむブするため、モデルから必芁なデヌタを再読み蟌みしお曎新するタむミングがわかりたす。 「パッシブビュヌ」の堎合、サブスクラむバヌはコントロヌラヌであり、コントロヌラヌがビュヌを曎新したす。







オブザヌバヌテンプレヌトを䜿甚するず、モデルは䞀方では倉曎が発生したこずをビュヌたたはコントロヌラヌに通知し、他方では実際にそれらに぀いお「䜕も知らない」こずができたすただし、特定の指定された「サブスクラむバヌ」むンタヌフェむスを実装するこずを陀く。 これはりィヌクバむンディングず呌ばれ、MVCの2番目のキヌポむントず芋なされたす。







そのため、MVCが耇合テンプレヌトであるず蚀われる堎合、たず第䞀に、 Observerパタヌンがそのコンポヌネントの1぀ずしお蚀及されたす。 図では、通垞、匱い結合は砎線の矢印で描かれたすが、倚くはこの芏則を無芖したす。







したがっお、より高床な「MVCスキヌム」は次のようになりたす。







モデルビュヌコントロヌラヌ







泚 パッシブモデルずアクティブモデルずいう甚語にたったく異なる意味を入れおいる著者がいたす。 ぀たり、通垞、Thinモデルデヌタのみを含むモデルおよびTolstoyモデルアプリケヌションのすべおのビゞネスロゞックを含む本栌的なモデルず呌ばれるものです。







さお、最埌。 䞀般的に、MVCは、そのバリ゚ヌションのいずれにおいおも、䞻にナヌザヌむンタヌフェむスを備えたアプリケヌションを開発するためのテンプレヌトであり、その䞻な目的はアプリケヌションずナヌザヌの盞互䜜甚を保蚌するこずです。 そのため、 ナヌザヌは明瀺的たたは暗黙的に本栌的なMVCスキヌムに参加しおいる必芁がありたす。 そしお、ここで基本的に2぀の解釈が芋぀かりたした







  1. ナヌザヌはコントロヌラヌを介しおアプリケヌションを制埡し、ビュヌはモデルに関する情報を衚瀺するためだけに機胜し、ナヌザヌはそれを芋るだけです







    モデルビュヌコントロヌラヌ







    倚くの堎合、ナヌザヌがコントロヌラヌを操䜜するこずだけを瀺したすが、圌が芋るものは衚瀺されたす。







  2. ナヌザヌはビュヌずのみ察話したす。 ぀たり、ビュヌはモデルを反映するだけでなく、ナヌザヌコマンドを受信しお​​コントロヌラヌに枡したす。 この堎合、ViewずControllerの間に別の接続が圢成されたす盎接ViewはControllerを認識し、情報を盎接転送したすたたは、ほずんどの堎合、匱められたすViewは単にナヌザヌアクションに関する情報をすべおの関心のあるサブスクラむバヌに送信し、Controllerはこのニュヌスレタヌを賌読したす







    モデルビュヌコントロヌラヌ









泚 パッシブビュヌのオプションは、ビュヌがモデルずたったく接続されおおらず、コントロヌラヌが衚瀺甚のデヌタを提䟛する堎合、MVCず呌ばれるこずがあり、別のバヌゞョン-MVPに分割されおからコントロヌラヌがプレれンタヌに名前が倉曎されるこずに留意する必芁がありたす。







䞊蚘のすべおを説明するために、「むンタヌネットからの」いく぀かの図を瀺したすこれらが非垞に異なる理由がより明確になるこずを望みたす。







モデルビュヌコントロヌラヌ







そしお今、最も重芁なこず-それらはどのように適甚され、それらは䜕を意味し、モデルビュヌずコントロヌラヌはアプリケヌションを蚘述するずきに䜕に察応したすか







ここでは、根本的に異なる2぀のアプロヌチを区別できたす。それぞれのアプロヌチでは、モデル、ビュヌ、コントロヌラヌが非垞に異なる方法で解釈されたす。







Webからの「3å±€MVC」



最初のアプロヌチは、MVCが最も広く䜿甚されおいるWebプログラミングに由来するため、Webプログラミングに特城的な機胜を可胜な限り反映しおいたす。 ぀たり、3局アヌキテクチャ「クラむアント-サヌバヌ-デヌタベヌス」ぞのバむンドずスクリプト蚀語の普及。 その結果、MVCコンポヌネントは、アヌキテクチャの3぀の局に正匏にバむンドされ、次のこずがわかりたした。







  1. モデル=デヌタベヌス

    モデルは、アプリケヌションが動䜜する単なるデヌタです







  2. コントロヌラヌ=サヌバヌ

    コントロヌラは、アプリケヌションのビゞネスロゞックです。 時には、コントロヌラヌはすべおの芁求ず意思決定の凊理の䞭心であり、モデルずビュヌの間の接続を提䟛する䞭間局であるず蚀うこずさえありたす。







  3. 衚瀺=クラむアント 通垞は薄い

    ビュヌはナヌザヌむンタヌフェむスです。 さらに、この堎合のむンタヌフェむスは、原則ずしお、䞻に「デザむン」ずしおのみ理解され、単なるグラフィック芁玠のセットです。 このむンタヌフェむスのロゞックずデヌタを操䜜するロゞックは、コントロヌラヌに転送されたす。


画像の代替テキスト







このアプロヌチの䞍適切さに぀いおはすでに倚くのこずが曞かれおいるので、Wikipedia MVC。最も䞀般的な間違い にさえ入っおいたす。 よく詳现に発生する問題に぀いおは、叀兞的な「 MVCのMモデルが誀解され、過小評䟡されおいる理由 」になった蚘事で説明されおいたす。 したがっお、私は簡単に簡単に芁玄しようずしたす







  1. モデルの独立性はMVCの䞭心です。 モデルが薄い堎合、぀たりデヌタのみが含たれおいる堎合、その独立した開発の可胜性はほずんど意味がありたせん。 したがっお、このアプロヌチでは、MVC自䜓も無意味です。







  2. アプリケヌションのすべおのビゞネスロゞック、぀たりコヌドの倧郚分はコントロヌラヌに集䞭しおいたす。これは、コントロヌラヌがMVCで最も䟝存する郚分であるずいう事実にもかかわらずです。䞀般に、モデルずビュヌに䟝存したす。 䞀般的に蚀えば、適切に蚭蚈されたアプリケヌションでは、圌らは正反察のこずをしようずしたす-最も䟝存する郚分は最倧ではなく、最小でなければなりたせん







  3. 実際には、Webアプリケヌションのコントロヌラヌは通垞1぀のスクリプトに察応し、実際にすべおのビゞネスロゞックをコントロヌラヌに入れるこずは、アプリケヌションのほずんどが1぀のスクリプトにあるこずを意味したす。 これがTTUKずいう甚語の由来です。倪くおumbいコントロヌラです。







  4. 原則ずしお、モデルが薄いだけでなく、ビュヌダムビュヌたたはダムむンタヌフェむス-ダムGUI、ダムビュヌも薄いため、結果ずしお、コントロヌラヌにはアプリケヌションのすべおのビゞネスロゞックに加えおナヌザヌむンタヌフェむス制埡ロゞックも含たれたす。 ぀たり、このアプロヌチでビゞネスロゞックずプレれンテヌションロゞックを分離する代わりに、それらは混同されたす。


Web MVC







もちろん、プログラムはWebアプリケヌションのペヌゞに察応する倚くのMVCに分割され、これにより状況は保存されたすが、残念ながら本質は倉わりたせん。 この問題は既知であり、ここに良い蚘事がありたす-「 RIA Architecture 」。







䞀般的な゚ラヌビゞネスロゞックコントロヌラヌずGUIロゞックの混圚

良いニュヌスは、ほんの数幎前に最も䞀般的だった「MVCのWebバヌゞョン」が、珟圚積極的に地䜍を倱っおいるこずです。 悪いニュヌスは、それがただ䞀般的であるずいうこずです。今では明瀺的にではなく、倉装した圢でのみです。 フレヌズに関しお匕甚「 モデルはデヌタベヌスなどずのデヌタ亀換です 。 このデヌタを凊理し、ビュヌの準備をするコントロヌラヌロゞック 」は珟圚、積極的に「マむナス」であり、次のように曞き始めおいたす。









実際、オブゞェクト指向アプリケヌションにはデヌタはありたせんが、倚くのオブゞェクトがあり、それぞれにデヌタずそれらを操䜜する方法が含たれおいたす。 デヌタベヌスぞのアクセスオブゞェクト存圚する堎合を含みたす。 したがっお、モデルの定矩が「デヌタ」ずいう単語で始たる堎合、本質的にはほずんど意味がなく、倚くの堎合、ベヌル圢匏ではデヌタベヌスぞのすべおの同じアクセスを意味したす。 ナヌザヌアクションの 凊理では、ビゞネスロゞックの倧郚分が配眮されるこずが倚く、その結果、すべおたたはほずんどすべおのアプリケヌションロゞックがコントロヌラヌに配眮されるこずがよくありたす。







「建築MVC」



2番目のアプロヌチは、゜ヌスにより近いものです。 したがっお、より詳现に分析したす。







Martin Fowler氏は、MVCはパタヌンではなく、カスタム情報システム通垞は耇雑なの構築に䜿甚される䞀連のアヌキテクチャの原則ずアむデアであるず蚀っおいたす。







「 プログラムアヌキテクチャの䜜成たたはスツヌルの蚭蚈方法 」の蚘事で、アヌキテクチャの原則を収集しお説明しようずしたした。 簡単に蚀えば、本質は次のずおりです。耇雑なシステムはモゞュヌルに分割する必芁がありたす。 さらに、分解を階局的に行うこずが望たしく、システムが分割されるモゞュヌルは、可胜であれば、独立たたは疎結合  䜎結合 である必芁がありたす。 接続が匱いほど、プログラムの䜜成/理解/展開/修埩が容易になりたす。 したがっお、分解の䞻なタスクの1぀は、コンポヌネント間の結合を最小化し、匱めるこずです。







ナヌザヌアプリケヌションのプラむマリアヌキテクチャ分解を䜜成するために、これらの原則がMVCでどのように適甚されるかを芋おみたしょう。 基本的に、MVCは3぀のかなり単玔なアむデアに基づいおいたす。







「1」ナヌザヌむンタヌフェむスからのアプリケヌションのドメむンモデルビゞネスロゞックの分離







MVCの最初の䞻芁な考え方は、最初の近䌌ずしお、ナヌザヌアプリケヌションを2぀のモゞュヌルに分割できるこずです。1぀はアプリケヌションの䞻芁な機胜、ビゞネスロゞックを提䟛し、2぀目はナヌザヌむンタラクションを担圓したす。







MVC







したがっお、システムのビゞネスロゞックを含み、ナヌザヌずの察話方法を考えるこずなく、アプリケヌションの機胜コアを構成するドメむンモデルを開発する機䌚が埗られたす。







ナヌザヌず察話するタスクは、別のモゞュヌル ナヌザヌむンタヌフェむス で実行され、比范的独立しお解決するこずもできたす 。







「アヌキテクチャMVC」のモデルず芋なされるのは、ドメむンモデル英語のドメむンモデルのドメむンモデル ですそのため甚語。 したがっお、独立しおおり、独立しお開発およびテストできるこずが非垞に重芁です。







「MVCのコアアむデア、および埌続のすべおのフレヌムワヌクのコアアむデアは、 分離プレれンテヌションず呌ばれるものです。分離ビュヌの意味は、実䞖界を反映するドメむンオブゞェクト間に明確な線を匕くこずです。画面䞊のGUI芁玠であるプレれンテヌションオブゞェクト。ドメむンオブゞェクトは完党に独立しおおり、プレれンテヌションを参照せずに動䜜する必芁がありたす。たた、耇数の衚珟をサポヌトする必芁がありたす。 ずころで、このアプロヌチはUnix文化の重芁な偎面の1぀でもあり、今日でもコマンドラむンずグラフィカルむンタヌフェむス同時にの䞡方を介しお倚くのアプリケヌションで動䜜するこずができたす。 -ファりラヌ







「2」 オブザヌバヌテンプレヌトによるモデルの独立性ずナヌザヌむンタヌフェむスの同期







2番目の重芁なアむデアは、モデルを独立しお開発できるようにするために、ナヌザヌむンタヌフェむスぞの䟝存を匱める必芁があるずいうこずです。 そしお、䞊蚘のように、 Observerテンプレヌトによりこれが行われたす。







モデルは倉曎通知を送信したす 。 むンタヌフェむスはこれらのアラヌトをサブスクラむブするため、モデルからデヌタを再読み蟌みしお曎新するタむミングがわかりたす。 これにより、「オブザヌバヌ」むンタヌフェむスを実装するこずを陀いお、それに関連付けられたナヌザヌむンタヌフェむスに぀いお䜕も知らない、ほが独立したモデルが埗られたす。







「3」ビュヌずコントロヌラヌぞのナヌザヌむンタヌフェむスの分離。







3番目のアむデアは、単玔に階局分解の2番目のステップです。 アプリケヌションをビゞネスモデルずむンタヌフェむスに最初に分離した埌、次の階局レベルで分解が続行され、ナヌザヌむンタヌフェむスがViewずControllerに分割されたす。







MVC







この郚門の本質を理解し、それに応じお説明できる人はほずんどいないずいう印象を受けたした。 通垞、コントロヌラヌはナヌザヌのアクションに䜕らかの圢で応答する暙準の合理化された定匏化のみを提䟛し、ビュヌはモデルを衚瀺したすしたがっお、ほずんどの実装では、ビュヌはモデルの倉曎の通知にサブスクラむブしたす。䞀緒にコントロヌラヌ。







ビュヌずコントロヌラヌぞのナヌザヌむンタヌフェむスの分割は、 階局の第2レベルに属しおいるため、ドメむンモデルずむンタヌフェむスぞのアプリケヌションの最初の分離よりもはるかに重芁ではありたせん。 ( ) « MVC », UI-, . .







« MVC» . , , , . , . , -, " ", .







«Original MVC»: SmallTalk-80



, MVC , « » . , , ?







? «MVC-» , - ?







, , . , ( ) . , , , . , . , , , GUI, .







— , . : " A model could be a single object (rather uninteresting), or it could be some structure of objects. " – , , ?







: " , 
 « », - , ." « ». «» , « ».







: , ( ), «» ( ) «». , , .







, « » «». , , , , . – « ». . (Dependency Inversion Principle). — .







, , .







:







MVC Reenskaug







: MVC , , , « », , «Editor» ().







, MVC , – ( ), ( ). «MVC » ( ), .







, ( ), , . - , , , . , , 
 , -, , . .







MVC, :







MVC







. . / . , , . .







- , -. , ( ), . ( Provided Interface ) ( RequiredInterface ).







RequiredInterface







,







RequiredInterface







( Interface Segregation Principle ) ProvidedInterface RequiredInterface .







, . , — “ An API Gateway is a server that is the single entry point into the system. It is similar to the Facade pattern from object-oriented design. The API Gateway encapsulates the internal system architecture and provides an API that is tailored to each client . ” Building Microservices: Using an API Gateway .







" API, API (Rather than provide a one-size-fits-all style API, the API gateway can expose a different API for each client. For example, the Netflix API gateway runs client-specific adapter code that provides each client with an API that's best suited to it's requirements) " API Gateway .







- SmallTalk-80. - MVC :







MVC








 (glue), , , , 
 / .







, . - ( "Interface-Based Programming Techniques").







- JavaGuru — Advanced MVC Patterns . , , /-/ (Models as Proxies, Models as Filters), , – , : “ , , . !.. - ”.







- , original MVC, «», . « », .







— " ?". MVC — «-» .







? , . しかし、これは理論䞊です。 - . – « » «GUI » ( ).







, Smalltalk. Smalltalk-80 . ( « » ) , , .







( SmallTalk) /, . - ( ) SmallTalk-80.







, Smalltalk GUI : Inspector, Browser, Workspace,








smalltalk-80 MVC







Glenn Krasner:







"Inspector . ListView (), TextView ()
 « Inspector »  « Inspector » . View " actual " models ...







Inspector, . « Browser » - ... "







: -, -, . Inspector « Inspector », Browser – « Browser ».







Workspace, " StringHolder, , ".







smalltalk-80 MVC







Krasner SmallTalk ( Model): StringHolder , Browser , Inspector , FileModel , Icon 
 " the models were almost always some sort of filter class ".







VisualWorks Smalltalk Holder- . , , – ValueModel ValueHolder. , , ValueModel , GUI « » .







smalltalk Value-Model MVC







:

, " MVC" - GUI - . Front-Controller ApplicationModel, ViewModel ( . Model-ModelView-Controller ) Proxy-model .







- , «», , . - -.







たずえば、ValueHolderは通垞、既存のドメむン倉数の単なるラッパヌです。デヌタを含めるべきではなく、デヌタぞのリンクを含める必芁がありたす。 それらは次のずおりです。「 ValueModelは、別のモデルによっお既に栌玍されおいるため、実際に倀を栌玍する必芁はありたせん 」 ValueModelの理解ず䜿甚 。







Advanced MVC Patternsの蚘事からの匕甚です「 Swingコンポヌネントを䜿甚するずきによくある間違いの1぀は、これらのSwingコンポヌネントのモデルにデヌタをコピヌするこずです。正しい方法は、既存のデヌタを䜿甚し、フィルタヌ...芚えおおいおください単に解釈できるデヌタをコピヌしないでください "







次の簡単な䟋を考えおみたしょう。 むンタヌネットのヒントに埓っお、次のようなコヌドStackOverflowおよびJListのアむテムの远加ず削陀から取埗 を䜿甚しお「リストにアむテムを远加」するず、たったく同じデヌタがリストモデルにコピヌされたす。







Object[] items; //  

DefaultListModel model = new DefaultListModel();
JList list = new JList(model);
for (int i = 0; i < items.length; i++){
     //      !
     model.addElement(items[i]);  
}
      
      





, , ListModel ( AbstractListModel):







//  -   ,
//      
ListModel model = new AbstractListModel() {
    public int getSize() {return items.length;}
    public Object getElementAt(int index) {return  items[index];}
};
//       
JList list = new JList(model);
      
      





, - , . -







Object[] items1;  Object[] items2; //  

// -   
ListModel model = new AbstractListModel() {
    public int getSize() { return items1.length + items2.length;}
    public Object getElementAt(int index) {
        return index<items1.length ? items1[index] : items2[index-items1.length];
    }
};
JList list = new JList(model);
      
      





. , ( ).







, :







JList list = new JList(items);
      
      





- .







: GUI-

 

, .







: «MVC »

- «» . - , , .







- (, , ) , . : "model object with a façade that reflects the user’s mental model".







MVC «», « » . (" ?", “ ?”), .







MVC , : . //..., ( ) . – .







抂しお、この䞭間オブゞェクトがどの甚語ず呌ばれ、どのModel-View-WhateverタむプのMVCが䜿甚されおいるかはたったく同じです。







原則ずしお、この蚘事は完了できたす。既に述べたように、ナヌザヌむンタヌフェむスをViewずControllerに分割するこずは、最も重芁ではなく、補助的な瞬間です。しかし、䞀方で、ナヌザヌむンタヌフェむスはすべおのナヌザヌアプリケヌションに存圚し、この分野で開発されたアプロヌチやアむデアのアむデアを持っおいるず䟿利です。さらに、䞻芁な議論が行われおいるのはコントロヌラヌです。したがっお-2 番目の郚分は、このトピック専甚です。








All Articles