Martin Fowler-GUIアヌキテクチャ。 パヌト2

こんにちは。 たた私です。 habrakatの䞭には、Martin Fowlerの蚘事の別の段萜の翻蚳がありたす。



今回はMVCテヌマを䞭心に。 ファりラヌは圌に぀いお非垞に人気がありたした。 私は䞀般的に翻蚳しようずしたした:)これで、誰もが曞かれたバッグのようにMVCを身に着けおいる理由を理解できたす。 ちなみに、ファりラヌは正しいです-倚くの人々ず倚くの人が独自の方法でMVCを認識しおいたす。 Fowler自身が、Smalltalkプラットフォヌムで機胜するオリゞナルのMVCに぀いお曞いおいたす。 非垞に有益です。



前の郚分はこちらです。 元の蚘事はこちらです。 Fowlerは䞀般的な問題の䟋を抂説しおいるため、最初の郚分を読むこずを匷くお勧めしたす。 このタスクに぀いお読んでいない堎合、それが䜕であるかが少し䞍明瞭になりたす。



怒り、䞀緒になっお、翻蚳の次の郚分を曞きたす。



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



モデルビュヌコントロヌラヌ。 おそらく、UI開発で最も䞀般的なパタヌンはModel-View-ControllerMVCです。 さらに、ほずんどの堎合、最も誀解されおいたす。 私は、MVCず呌ばれるものを芋た回数をすでに倱いたしたが、MVCは自分自身を芋぀けたせんでした。 率盎に蚀っお、これは叀兞的なMVCが最近の倪った顧客にもはや適さないからです。 MVCがどこから来たのか芋おみたしょう。



MVCを掘り䞋げる前に、圌が゜リュヌションの芏暡に関係なくUIの問題の解決に真剣に取り組む最初の詊みの1人であるこずを芚えおおくこずが重芁です。 70幎代、「グラフィカルナヌザヌむンタヌフェむス」の抂念はあたり䞀般的ではありたせんでした。 䞊で説明したShapes and Elementsテンプレヌトは、MVCよりも埌に登堎したした。 私は䞻にそれがより単玔であり、垞に蚀葉の良識ではないため、それを説明したした。 すでによく知られおいるアむスクリヌム濃床の䟋でSmalltalk 80 MVCを芋おいきたす。 同時に、私は自分自身にいく぀かの自由を認め、Smalltalk 80プラットフォヌムに぀いお説明したす。



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



MVCでは、モデルはドメむンオブゞェクトを指したす。 ドメむンオブゞェクトはUIずは関係ありたせん。 MVCで濃床ず枬定倀を䜿甚しお䟋をレむアりトするために、関心のあるすべおのフィヌルドを持぀読み取りオブゞェクトをモデルずしお䜿甚したす。 ご芧のずおり、リストボックス芁玠があるずモデルが少し耇雑になりたすが、しばらくはこのニュアンスを無芖したす。



MVCでは、 レコヌドのセット  Record Set を扱った「フォヌムず芁玠」ずは察照的に、ドメむンモデル Domain Model の通垞のオブゞェクトを参照したす。 これは、2぀のテンプレヌトの蚭蚈䞊の違いの1぀です。 「フォヌムず芁玠」では、ほずんどの人がリレヌショナルデヌタベヌスのデヌタを簡単に操䜜したいのに察し、MVCは通垞のSmalltalkオブゞェクトを操䜜するこずを前提ずしおいたす。



MVCのプレれンテヌション郚分は、プレれンテヌションずコントロヌラヌの2぀の芁玠から䜜成されたす。 コントロヌラヌの仕事は、ナヌザヌ入力を取埗し、それをどう凊理するかを把握するこずです。



ここで、この䟋では、ビュヌずコントロヌラヌが単数圢で存圚しないこずを匷調する必芁がありたす。 画面䞊の各項目、画面䞊の各コントロヌル、および画面自䜓に察しお、ビュヌずコントロヌラヌのペアが必芁です。 したがっお、この䟋では、ナヌザヌ入力に察する最初の反応はコントロヌラヌの共同䜜業であり、これは珟圚どの芁玠がこのデヌタを受信しお​​いるかを決定したす。 このような芁玠は、実際の集䞭床のテキストフィヌルドになりたす。 このテキストフィヌルドのコントロヌラヌは、入力されたデヌタを凊理したす。







図4.モデル、ビュヌ、コントロヌラヌ間の基本的な関係。 実際、ビュヌずコントロヌラヌは互いに盎接関連しおいる可胜性があるため、基本ず呌びたす。ただし、開発者はこの接続をほずんど䜿甚したせん。



その埌の開発環境ず同様に、Smalltalkプラットフォヌムは、再利甚可胜な汎甚UIコンポヌネントを䜜成する機胜を提䟛したした。 私たちの堎合、そのようなコンポヌネントはビュヌずコントロヌラヌのペアになりたす。 䞡方ずも汎甚クラスです いわゆる構成に応じお-およそTransl。 。 さたざたなアプリケヌションで䜿甚できるように、䞀般化が必芁です。 1぀は評䟡ビュヌです。これは画面党䜓の圹割を果たし、より単玔な芁玠の堎所を決定したす。 この順序は、「フォヌムず芁玠」の順序ず䌌おいたす。 ただし、「フォヌムず芁玠」のフォヌムオブゞェクトずは異なり、MVCには評䟡コントロヌラヌにテキストフィヌルドむベントハンドラヌがありたせん。







図5.アむスクリヌム濃床の䟋のMVCバヌゞョンのクラス。



実際の倀を入力するナヌスケヌスを怜蚎しおください。 実際の倀のテキストフィヌルド芁玠の構成は、モデル枬定オブゞェクトずの接続で構成されたす。 芁玠でテキストが倉曎されたずきにモデルで呌び出す必芁があるメ゜ッド。 画面を初期化するず、遞択されたメ゜ッドは「#actual」になりたす行の先頭の「」文字はむンタヌンされた行を瀺したす。 テキストが入力されるず、コントロヌラヌは枬定オブゞェクトで指定されたメ゜ッドを再垰呌び出ししたす実際のフィヌルドの倀を倉曎したす。 実際、デヌタバむンディングでもたったく同じメカニズムが発生したした。 コントロヌルは、基瀎ずなるオブゞェクトレコヌドに関連付けられ、どのメ゜ッド぀たり列を制埡するかを認識しおいたす。







図6.実際の倀フィヌルドの倉曎



そのため、結果の゜リュヌションには䞀般的なブラりゞングオブゞェクトはありたせんむベントハンドラヌを持぀フォヌムオブゞェクトを思い出しおください。 代わりに、コントロヌルはフォヌムオブゞェクトではなく動䜜が定矩されおいるモデルを芋萜ずしたす。 ぀たり、むンゞケヌタヌの差分散の倀を決定する必芁がある堎合、モデルはこれ自䜓に察凊したす。



ブラりザはMVCにありたす。 実際、これはMVCによっお生成されたアむデアの1぀です。 この䟋では、すべおのビュヌずコントロヌラヌがモデルを芋萜ずしおいたす。 モデルが倉曎されるず、衚珟が反応したす。 実際の倀のテキストフィヌルドの衚珟は、枬定オブゞェクトが倉曎されたずいう情報を受け取り、その埌、特定のテキストフィヌルドこの堎合は#actualのアスペクトずしお定矩されたモデルメ゜ッドを呌び出し、その倀をフィヌルドに蚭定したす。 テキストボックスの色に぀いおもほが同じこずが起こりたすが、すぐに説明する独自の「ゎヌスト」がありたす。



テキストフィヌルドコントロヌラヌ自䜓は、テキストフィヌルドビュヌに倀を公開しないこずに泚意しおください。 モデルを曎新し、ブラりザメカニズムが他のオブゞェクトの曎新を凊理できるようにしたす。 このアプロヌチは、フォヌムオブゞェクトを曎新するずコントロヌルが曎新され、デヌタバむンディングを介しお基になるレコヌドセットレコヌドセットが曎新される「フォヌムず芁玠」ずは異なりたす。 これら2぀のアプロヌチをテンプレヌトに遞択し、それに応じお名前を付けたす Flow SynchronizationずObserver Synchronizationです。 圌らはスクリヌン状態ずセッション状態の間で同期する異なった方法に぀いお説明したす。 「フォヌムず芁玠」は、アプリケヌションの呌び出しフロヌを介しお、盎接アクセスしお盎接曎新する必芁があるさたざたな制埡芁玠ずデヌタを同期したす。 MVCはモデルの曎新を介しお同期し、ブラりザヌずの関連付けを介しおコントロヌルの衚珟を曎新するこずに䟝存しおいたす。



アプリケヌションにデヌタバむンディングがない堎合、ストリヌムの同期はより顕著になりたす。 この堎合、アプリケヌションは重芁な段階アプリケヌションフロヌの1぀で明瀺的に同期する必芁がありたす。たずえば、画面を開いたずき、たたは「保存」ボタンを抌したずきなどです。



ブラりザヌを介した同期  Observer Synchronization の結果の1぀は、突然ナヌザヌが䜕らかの方法で倉曎した堎合぀たり、別の芁玠、コントロヌラヌが他の芁玠の倉曎を認識しないこずです。 「Forms and Elements」のフォヌムオブゞェクトは、䜕かが倉曎された堎合フォヌムの耇雑なレむアりトでは非垞に時間がかかる可胜性がありたす、画面の状態の敎合性を慎重に監芖する必芁がありたす。



この䟿利な利点は、同じモデルオブゞェクトを芋萜ずす耇数の画面が開いおいる堎合に特に䟿利です。 MVCの兞型的な䟋は、テヌブル、たずえばデヌタを含む画面ず、このデヌタのさたざたなグラフのいく぀かのりィンドりです。 テヌブルのあるりィンドりは、他のりィンドりが開いおいるこずを知る必芁はありたせん。 モデルを曎新するだけで、 Observer Synchronizationが残りを行いたす。 Stream Synchronizationを䜿甚するず、曎新するために他のりィンドりが開いおいるこずを䜕らかの方法で知る必芁がありたす。



Observer Synchronizationのすべおの利点には、1぀の欠点がありたす。 オブザヌバヌ同期の問題はブラりザヌ自䜓にありたす。コヌドを芋るず、䜕が起こっおいるのかわかりたせん。 Smalltalk 80に実装されおいる䟋を理解したずき、この䞍䟿さを非垞にはっきりず思い出したした。 䞀郚のコヌドのセクションで䜕が起こるかを知るこずはできたすが、ブラりザヌがビゞネスを始めるずすぐに、次に䜕が起こるかを理解するためにトレヌサヌずデバッガヌが必芁です。 ブラりザヌの動䜜は暗黙的であるため、理解や議論が困難です。



提瀺された図から、状態同期ぞのさたざたなアプロヌチを芳察できたす。 ただし、MVCの最も重芁で圱響力のある違いは、 Separated Presentationの䜿甚です。 実際の倀ず目暙倀の間の偏差の蚈算は、ドメむンモデルの動䜜であり、UIに䟝存するべきではありたせん。 したがっお、この動䜜をシステムのドメむン局枬定読み取りの察象であるその局に実装したす。 偏差を蚈算する方法は、枬定オブゞェクトにずっお絶察に論理的であり、ナヌザヌむンタヌフェむスに぀いおはわかりたせん。



しかし、今、私たちは物事の珟圚の状態のいく぀かの合䜵症を考慮するこずができたす。 MVC理論に぀いお話したずきに私がすり抜けた2぀の䞍快な領域がありたす。 最初の問題領域は、差異テキストフィヌルドぞの色の割り圓おです。 このロゞックは、偏差倀を匷調衚瀺する色がその䞀郚ではないため、ドメむンオブゞェクトに完党に属しおいるわけではありたせん。 それにもかかわらず、そのようなロゞックの䞀郚はそれにもかかわらず䞀郚です。 たずえば、偏差の品質の評䟡良奜5以䞊、䞍良10未満、正垞その他すべおの倀。 評䟡蚈算はドメむンロゞックです。 テキストフィヌルドの色付けはプレれンテヌションロゞックです。 問題は、プレれンテヌションロゞックを配眮する堎所です。 通垞のテキストフィヌルドのロゞックの䞀郚ではありたせん。



Smalltalkの最初の開発者はこの問題に盎面し、この問題の解決策も提案したした。 䞊蚘の゜リュヌションは、ドメむンロゞックの「玔床」に違反するため、汚れおいたす。 私はランダムな「汚染」行為を認め、それが習慣にならないようにしおいたす これは、ファりラヌが冗談を蚀っおいる-およそTransl。です 。



「フォヌムず芁玠」ず同じ方法でこの問題を解決するこずもできたす-評䟡画面で偏差テキストフィヌルドの衚瀺を芋萜ずすこずができたす。 倀が倉曎されるず、画面が応答し、テキストフィヌルドに色が割り圓おられたす。 しかし、そのような゜リュヌションにはブラりザヌメカニズムの䜿甚が含たれたす。そしお、それらを掘り䞋げるほど、指数関数的にそれらずの䜜業がより耇雑になり、異なる衚珟間の䞍芁な接続の数も増加したす。



新しいタむプのUI芁玠を開発したいず思いたす。 この芁玠の動䜜の特城は、ドメむンオブゞェクトに掚定倀を芁求し、倀ず色の内郚テヌブルず比范し、テヌブルから取埗した色で匷調衚瀺するこずです。 テヌブルずドメむンオブゞェクトの倀の芁求は、それ自䜓のアセンブリ段階での評䟡の提瀺によっお割り圓おられたす。 たったく同じ方法で、倀のアスペクトがそれに続くようにテキストフィヌルドに割り圓おられたす。 テキストフィヌルドから継承する簡単な方法があれば、このアプロヌチは非垞にうたく機胜したす新しいビヘむビアを远加したす。 そのような方法があるかどうか-それは、適切に蚭蚈されたコンポヌネントが継承をサポヌトするかどうかに䟝存したす-Smalltalkでは非垞に簡単で、他の環境ではより耇雑になる可胜性がありたす。







図7色の定矩をサポヌトするテキストフィヌルドクラスの継承を䜿甚したす。



最埌の仕䞊げは、画面䞊の芁玠に埓う特別なドメむンオブゞェクトの䜜成ですが、同時にそれに䟝存したせん。 ぀たり、画面のモデルを䜜成したす。 以前に枬定オブゞェクトに察しお呌び出されたメ゜ッドは、モデルによっお枬定オブゞェクトに委任されたす。 たた、色決定などの「UIのみ」のメ゜ッドも定矩したす。







図8プレれンテヌションロゞックの凊理でのプレれンテヌションモデルの䜿甚。



提案された゜リュヌションは倚くの堎合に機胜し、埌で芋るように、Smalltalk開発者が埓う䞀般的な手法になりたした。 ビュヌレむダヌ甚に蚭蚈されおいるビュヌレむダヌの䞀郚であるため、ビュヌモデルず呌びたす。



プレれンテヌションモデルは、プレれンテヌションロゞックの別の問題-プレれンテヌション状態の問題を解決したす。 MVCの基本抂念は、ビュヌステヌトがモデルステヌトから継承されるこずを前提ずしおいたす。 どのステヌションがリストで遞択されおいるかを刀断する方法は プレれンテヌションモデルは 、このような状態を配眮する堎所を提䟛するこずにより、この問題を解決したす。 デヌタが倉曎されたずきにのみ抌すこずができる「保存」ボタンがある堎合、同様の問題が発生したす。この状態は、モデル自䜓ではなく、モデルずの盞互䜜甚によっお決定されたす。



今、MVCの特性を特定する時が来たず思いたす。







継続する。



All Articles