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

マヌティン・ファりラヌの翻蚳。 この蚘事では、UIアヌキテクチャの䞀般的なアプロヌチに぀いお説明し、MVC、MVP、プレれンテヌションモデル、フォヌムずコントロヌル、ハンブルビュヌ、パッシブビュヌなどのデザむンパタヌンの詳现な説明を提䟛したす。 この蚘事は脳をきれいにしたす。 ひず぀のニュアンスを逃さないために、翻蚳をするこずにしたした。



䞀般的に蚀っお、私は長い間しゃがみ蟌んでいたので、すぐにすべおをやりたいず思っおいたした。 空に指。 時には坐骚神経痛に打たれ、プロゞェクトのマむルストヌンに近づき、長い箱で移管を延期したした。 たたは他の䜕かが干枉したした。 芁するに、私は䞀床にすべおを習埗しなかったので、消えないように、翻蚳をパラグラフでアップロヌドするこずにしたした。 今、私は半分を移したしたが、半分は残っおいたす。



私はプロの翻蚳者ではないので、䜕かを誀解しおいる可胜性がありたすさらに、堎所によっおは括匧内にメモを䜜成しおいる堎合もありたすが、いずれにしおも元の蚘事を読む機䌚がありたす。 このような興味深い蚘事の翻蚳が、誰かがスキルを向䞊させ、芖野を広げるのに圹立぀こずを願っおいたす。



GUIアヌキテクチャ



グラフィカルナヌザヌむンタヌフェむスは、ナヌザヌず開発者の䞡方にずっお゜フトりェア開発環境のなじみのある郚分になっおいたす。 蚭蚈の芳点からそれらを芋るず、それらはシステム蚭蚈の特別な問題のセットを構成したす-異なるが類䌌した゜リュヌションを持っおいる問題。



私の関心は、プログラマヌがリッチクラむアントクラむアントを開発するために䜿甚できる䞀般的で䟿利なテンプレヌト゜リュヌションを特定するこずです。 蚭蚈怜査の実装䞭ず、より「氞続的な」スタむルで蚘述された䞡方のさたざたなアヌキテクチャを芋たした。 これらのアヌキテクチャには䟿利な゜リュヌションがありたすが、それらを蚘述するこずは簡単な䜜業ではありたせん。 たずえば、Model-View-Controllerを芋おください。 倚くの堎合、この決定はテンプレヌトずしお認識されたすが、テンプレヌトに埋め蟌たれたアむデアが本質的に異なるためだけに、テンプレヌトずしお認識しおもあたりメリットはありたせん。 さたざたな人がさたざたな゜ヌスでMVCを読んで、さたざたな方法で圌のアむデアを認識しおいたすが、これらのアむデアは同じ方法で「MVC」ず呌ばれおいたす。 これは、たるで人々が「壊れた電話」を通しおそれを芋぀けたかのように、MVCの混乱ず誀解に぀ながりたす。



この䜜業では、いく぀かの興味深いアヌキテクチャ゜リュヌションを提䟛し、それらの最も興味深いプロパティのビゞョンを説明したす。 私はすべおを理解できるスタむルで説明するこずを望みたす。



ある意味では、この䜜業を数幎にわたるさたざたなUIプログラミング゜リュヌションの歎史ぞの遠足ずしおずらえるこずができたす。 ただし、譊告する必芁がありたす。 アヌキテクチャを理解するこずは、特にそれらの倚くが倉化したり死んだりする堎合、単玔な問題ではありたせん。 䞀郚のアむデアを远跡するこずはさらに困難です。なぜなら、他の人が芋るものずは異なる人が、自分の䞭で自分を芋るからです。 特に、私が説明するアヌキテクチャの詳现で培底的な分析は行いたせんでした。 私がしたこずは、システム蚭蚈の䞀般的な説明ずしお説明できたす。 䜕かを芋逃した堎合、それは私がそれに぀いお知らないこずを意味したす。 したがっお、私の説明をガむドずしお受け取らないでください。 さらに、重芁でないものは特に簡略化したたたにしたす。 私の䞻なタスクは、これらの゜リュヌションの履歎ではなく、問題の゜リュヌションを説明するこずであるこずを忘れないでください。



ただし、MVCを孊習できるように、Smalltalk-80の䜜業バヌゞョンにアクセスできるずいう点で、私は少し矛盟しおいたす。繰り返したすが、この研究は培底的であるずは蚀えたせんが、他の説明では説明できない゜リュヌションの偎面-他のアヌキテクチャに粟通しおいお、私が䜕かで重芁だず思う堎合、他のアヌキテクチャの説明を唯䞀の真のものずしお提瀺するこずを劚げたす間違っおいるか䜕かを芋逃した、それから私はそれに぀いお知りたい たた、私がお話しするこずをより培底的に分析するこずは、倧孊で勉匷するための良い科目になるず思いたす。



フォヌムずコントロヌル



ファりラヌは、コントロヌルの抂念を非垞に熱心に䜿甚しおいたす。これは、「コントロヌル」ずしお残したり、「コントロヌル」ずしお翻蚳したりできたす。悲しいこずに、ロシア語には「スラング」が䜿われおいたすが、「コントロヌル」ずいう蚀葉はありたせんあなたの目を苊しめないでください、それから私はコントロヌルを単に「芁玠」ず呌びたす。



この研究は、それ自䜓がほずんどの開発者に銎染みのあるシンプルなアヌキテクチャから始めたす。 共通の指定がないため、この䜜業の䞀般的なルヌルの目的のために、「フォヌムず芁玠」ず呌びたす。 このアヌキテクチャは、䞻にVisual Basic、Delphi、Powerbuilderなどのクラむアントサヌバヌアプリケヌション開発環境によっお提䟛されたため、よく知られおいたす。 私のようなクヌルな建築゜リュヌションのファンによっお拒吊されおいるずいう事実にもかかわらず、それはただどこでも䜿甚され続けおいたす。



それを理解するおよび他のアヌキテクチャ゜リュヌションを理解するために、すべおの人に共通の䟋を䜿甚したす。 私が䜏んでいるニュヌむングランドでは、空気䞭のアむスクリヌムの量を远跡するための州プログラムがありたす。 濃床が䜎すぎる堎合、これは私たちが食べるアむスクリヌムの量が少なすぎるこずを意味し、ひいおは経枈ず公序良俗に倧きなリスクをもたらしたす。 私はあなたがこの本のような他の本で芋぀けるよりも珟実的でない䟋を䜿甚したい。



アむスクリヌムを監芖するために、政府はすべおのニュヌむングランド州に特別な远跡ステヌションを構築しおいたす。 掗緎された倧気モデルを䜿甚しお、郚門は各ステヌションに目暙倀を割り圓おたす。 その埌、スタッフはステヌションに行き、アむスクリヌムの濃床を評䟡したす。 以䞋のUIでは、ステヌションを遞択し、枬定日日付ず実際の濃床倀を入力できたす。 システムは、目暙倀ず実際の倀の差異を蚈算したす。 さらに、実際の倀が目暙の90未満の堎合、偏差は赀で匷調衚瀺され、105を超える堎合は緑で匷調衚瀺されたす。







図1UI䟋ずしお䜿甚したす



このビュヌから2぀の重芁な詳现を区別できたす。 フォヌムはアプリケヌション固有ですが、他のフォヌムに共通のコントロヌルを䜿甚したす。 ほずんどのGUI開発環境には、アプリケヌションの開発時に䜿甚できる共通芁玠の特定のセットがありたす。 私たちは独自の芁玠を䜜成するこずができたすこれは良いアむデアですが、アプリケヌションフォヌムず再利甚可胜な芁玠はただ互いに異なっおいたす。 ぀たり、䜜成された芁玠はさたざたな圢匏で䜿甚できたす。



フォヌムには2぀の䞻芁な責任がありたす。



ほずんどのGUI開発環境は、ドラッグアンドドロップ芁玠をフォヌムにドロップできるグラフィカル゚ディタヌなど、画面のレむアりトを決定する手段を開発者に提䟛したす。 これは、原則ずしお、レむアりトを䜜成し、フォヌム䞊の芁玠の配眮を簡単に調敎するのに十分ですただし、この方法は必ずしも最適ではありたせん-埌でこれに戻りたす。



芁玠はデヌタを衚瀺したす-この䟋では、読み取り䞭です。 デヌタは他のどこかから来る可胜性が非垞に高いです。 今回のケヌスでは、SQLデヌタベヌスからのものず想定しおいたす。これは、前述の開発環境のメむンデヌタ゜ヌスであるためです。 ほずんどの堎合、アプリケヌションには䜿甚されるデヌタの3぀のコピヌがありたす。





画面状態ずセッション状態の同期は非垞に重芁なタスクです。 それを解決できるツヌルはData Bindingです。 デヌタバむンディングの考え方は、レコヌドセット内のアむテムデヌタたたはレコヌドデヌタで発生した倉曎が、すぐにお互いに広がるずいうこずです。 ぀たり、画面に珟圚の濃床を入力するず、「テキストボックス」芁玠はレコヌドセット内の察応するデヌタレコヌドの列の倀を曎新したす。



デヌタバむンディングの実装は非垞に耇雑です。たずえば、芁玠を倉曎するずデヌタセットが倉曎され、芁玠が曎新され、デヌタセットが曎新され、芁玠が曎新されるなど、このようなサむクルを回避する必芁があるためです...サむクル-画面が開いたずきにのみ、セッション状態から画面状態にデヌタをロヌドしたす。その埌、画面の倉曎がセッション状態に反映されたす。 画面が開いたずきにセッションの状態を曎新するこずはたれであり、必芁ありたせん。 その結果、デヌタバむンディングは完党に双方向ではない可胜性がありたす。初期デヌタの読み蟌みず、セッション状態ぞの画面倉曎の凊理に制限される堎合がありたす。



䞀般的に、デヌタバむンディングは、クラむアント/サヌバヌアプリケヌションのほずんどの機胜を実装したす。 実際の濃床の倀を倉曎するず、列の倀が曎新されたす。 別のステヌションを遞択しおも、レコヌドセット内の遞択されたレコヌドが倉曎され、他のアむテムが曎新されたす。



基本的に、説明されおいる動䜜は、アプリケヌションフレヌムワヌクの開発者によっお既に実装されおおり、プログラマの基本的なニヌズを迅速か぀簡単に満たすためのツヌルを提䟛および提䟛しおいたす。 特に、1぀の方法は、通垞「プロパティ」ず呌ばれるコントロヌルの特性のいく぀かを明瀺的に蚭定するこずです。 この芁玠は、デヌタセットの列の文字列名を読み取りたす。この文字列は、開発者が単玔なプロパティ゚ディタヌを介しお指定し、それに添付されおいたす。



適切なパラメヌタヌ化でデヌタバむンディングを䜿甚するず、アプリケヌションのほがすべおの機胜を実装できたす。 ただし、デヌタバむンディングはすべおの機胜を実装するこずはできたせん。ほずんどの堎合、アプリケヌションにはパラメヌタヌ化オプションに該圓しないロゞックがありたす。 この堎合、偏差の蚈算は、デヌタバむンディングでは実装できないものの䟋です。そのような機胜はアプリケヌション固有であり、フォヌム自䜓に実装されおいるためです。



それを実装するために、フォヌムはナヌザヌが実際の濃床の倀を入力し終えたこずを知る必芁があり、これはコントロヌルがフォヌムの動䜜を匕き起こす必芁があるこずを意味したす。 このロゞックは、制埡の反転を意味したす。 オリゞナルでは、「これは、クラスラむブラリを取埗し、Inversion of Controlが関䞎しおいるずきにそれを呌び出すこずで䜿甚するよりも少し耇雑です。」



この問題を解決するにはさたざたな方法がありたす。 通垞、クラむアント/サヌバヌアプリケヌション開発環境にはむベントプレれンテヌションシステムがありたす。 各コントロヌルには、トリガヌできるむベントのリストがありたす。 倖郚オブゞェクトには、むベントに関心があるこずを芁玠に䌝える機胜がありたす。 この堎合、芁玠むベントが発生するず、芁玠はそのようなオブゞェクトに制埡を移したす。 基本的に、この説明はObserverパタヌンの再定匏化にすぎず、フォヌムは芁玠に埓いたす。 フォヌムの開発者は、アプリケヌションフレヌムワヌクを䜿甚しお、むベントの発生埌に実行されるメ゜ッドにコヌドを蚘述するこずができたす。 このメ゜ッドずむベント間の接続が発生する方法は、特定のプラットフォヌムによっお異なり、この堎合は重芁ではありたせん。 重芁なこずは、そのようなメカニズムが存圚し、機胜するこずです。



フォヌムが制埡されるず、必芁なこずは䜕でもできたす。 圌女はいく぀かのアクションを実行し、コントロヌルを倉曎し、デヌタバむンディングに基づいお、セッション状態に倉曎を戻すこずができたす。



デヌタバむンディングは垞に利甚できるずは限らないため、このようなメカニズムも必芁です。 䞖界には倚くのりィンドりコントロヌルがあり、それらのすべおがバむンディングをサポヌトしおいるわけではありたせん。 バむンディングがない堎合、フォヌムは状態間のデヌタ同期を凊理する必芁がありたす。 特に、圌女自身がデヌタセットからデヌタを匕き出しお、コントロヌルに入れるこずができたす。 デヌタを保存し盎したい堎合は、「保存」ボタンを抌すむベントず同じ方法で保存できたす。



デヌタバむンディングが利甚可胜な堎合、珟圚の濃床倀がどのように線集されるかを芋おみたしょう。 フォヌムには、コントロヌルぞのリンクが保存されたす。 各芁玠には独自のリンクがありたすが、実際の倀、偏差倀、および目暙倀のテキストフィヌルドにのみ興味がありたす。







図 2フォヌムず芁玠のクラス図



テキストフィヌルドは、テキストが倉曎されたずきにむベントを通知したす。 初期化段階で、フォヌムはそれ自䜓を収集し、むベントにサブスクラむブし、そのメ゜ッドをバむンドしたす-ここでは、 actual_textChanged



。







図3テキストを倉曎するためのシヌケンス図



ナヌザヌが実際の濃床の倀を倉曎するず、テキストフィヌルドがむベントを発生させ、アプリケヌションフレヌムワヌクの特別な魔法を䜿甚しお、 actual_textChanged



フォヌムactual_textChanged



実行したす。 このメ゜ッドは、フォヌム芁玠から実際の倀ず目暙倀を受け取り、蚈算を実行しお、差異テキストフィヌルドに偏差を蚭定したす。 たた、結果の倀を匷調衚瀺する色を蚈算し、匷調衚瀺したす。



これで芁玄できたす







次の郚分はこちらです。



All Articles