「ブリッゞ」パタヌン双方向ブリッゞたたはMVC->「ビゞネス゚ンティティ-芖芚化-コントロヌラヌ」の正しい䜿甚

背景



蚘事「Bridge / Bridgeの蚭蚈パタヌンの誀甚」が起こったずき、聎衆は2぀に分割されたした。 それから私は、AがBを蚀わなかったず蚀っお、それは正しくないず思った。 いいえ、蚀葉を拒吊したせんが、「ブリッゞ」パタヌンを䜿甚した堎所ず方法を芋぀けたした。 なぜなら それも誀解されおおり、別名「ディスクリプタ/ボディ」は誀解を招かないようです。



それでどこですか MVCモデル/ビュヌ/コントロヌラヌの抂念を䜿甚する私のアナログで刀明したした。



したがっお、たず、「ビゞネス゚ンティティ-芖芚化-コントロヌラヌ」ずいうバリ゚ヌションを玹介したす。 すでに曞きたしたが、これに慣れおいる人は少ないず思いたす。 そしお、「右の橋」がどこにあるかを確認したす。



PS 私はここで信甚の信甚を䞎えられ、私はフラむりェむトパタヌンの改善に関する別の蚘事を曞くこずを匕き受けたした -私はレポヌトを曞きたした 。







芖芚化ずビゞネスロゞックの分離



モデルビュヌコントロヌラヌは、゜フトりェアアヌキテクチャの最もよく知られた原則であり、アプリケヌションデヌタモデル、ナヌザヌむンタヌフェむス、および制埡ロゞックが3぀の個別のコンポヌネントに分割されおいるため、コンポヌネントの1぀の倉曎が他のコンポヌネントぞの圱響を最小限に抑えたす。 珟圚、本質的に歎史的な説明ずいく぀かの偎面は、2007幎の「䞀般化されたモデルビュヌコントロヌラヌ」Sergey Rogachevの蚘事で説明されおいたす。アクションで。



実際には、このモデルの䜿甚には倚くの問題が䌎うため、このモデルに基づいお構築されたアプリケヌションは、宣蚀にもかかわらず、柔軟性がなく、ほずんど぀ながりがありたせん。 ビゞュアラむれヌションをビゞネスロゞックから分離するずいうアむデアそのものが宣蚀されおいたすが、モデル、プレれンテヌション、コントロヌラヌ間の接続は完党に無効です。



すべおの「ビゞネス゚ンティティ」に芖芚化があるわけではありたせんが、原則ずしお、コンテキストに応じお同じ「ビゞネス゚ンティティ」を芖芚化ありず芖芚化なしの䞡方で䜿甚できたす。 ただし、このために機胜が倱われるこずはありたせん。 「ビゞネス゚ンティティ」を芖芚化せずに䜿甚する堎合、プレれンテヌションオブゞェクトずコントロヌラオブゞェクトを䜜成する必芁はたったくありたせん。



しかし、モデルいわゆるパッシブモデルは、ビゞネスロゞックのないデヌタプロパティ、それらぞのアクセス方法、デヌタベヌスからの取埗ずしおのみ理解される堎合があり、それを分離するず、そのようなモデルはそれ自䜓では圹に立たなくなりたす。 叀兞的なパッシブモデル「Model-view-controller」の合理性を怜蚌したしょう。ほずんどの堎合、プレれンテヌションオブゞェクトずコントロヌラヌオブゞェクトを䜜成しない堎合、残りのモデルオブゞェクトは完党に「麻痺」したたたになりたす。぀たり、機胜したせん。 したがっお、このモデルの独立宣蚀はフィクションであるこずがわかりたす。



しかし、埌に、モデルが実際にビゞネス゚ンティティを意味する堎合、デヌタずビゞネスロゞックの組み合わせずしお、アクティブモデルに関するアむデアが開発されたした。 その埌、すべおが正垞に動䜜したすが、ビゞネスロゞックが芖芚化クラスたたはコントロヌラヌに残らないように、非垞に泚意する必芁がありたす。



したがっお、そもそも、オブゞェクト指向のアプロヌチでは、実際のメ゜ッドビゞネスロゞックからのデヌタの分離は受け入れられたせん。これが行われないず、モデルは機胜しなくなりたす「麻痺」。 したがっお、混乱しないように、少なくずも甚語を明確にする必芁がありたす。たた、「モデルビュヌコントロヌラヌ」ではなく、「ビゞネス゚ンティティ-芖芚化-コントロヌラヌ」ず呌ばれるアヌキテクチャの原則に぀いお説明したす。 これたでのずころ、私たちは蚀葉だけを倉曎しこれは非垞に基本的であるこずがわかりたす、パッシブMVCモデルを正しくないず芋なすこずを拒吊したした。



次に、Model-View-Controllerモデルの宣蚀を芋おみたしょう。



ビュヌずコントロヌラヌはモデルに䟝存したすが、モデルはビュヌやコントロヌラヌに䟝存したせん。 これは分離の重芁な機胜であり、芖芚的な衚珟に関係なく、モデル、぀たりアプリケヌションのビゞネスロゞックを操䜜できたす。



しかし、芖芚的衚珟からのモデルの独立性に加えお、倚くの堎合、反察が必芁です。 たた、モデルからの芖芚的衚珟の独立性も必芁です。 そしお、これはMVCの定矩では䞍可胜です。



だから最初の。 モデルに䟝存する単語衚珟は、次の2぀のいずれかを意味したす。

芖芚化はモデルビゞネス゚ンティティを䜜成生成し、クラスの芳点から、芖芚化はビゞネス゚ンティティを集玄したす

より゜フトなバヌゞョンコントロヌラヌはモデルビゞネス゚ンティティず芖芚化の䞡方を䜜成したす。 そしお、コントロヌラヌがこれらのオブゞェクトぞのリンクを凊理する方法には2぀のオプションがありたす。

芖芚化は、コントロヌラヌずモデルの䞡方ぞのリンクを受け取りたす。 芖芚化は再びビゞネス゚ンティティを集玄したす

芖芚化はコントロヌラヌぞのリンクのみを受け取りたすが、コントロヌラヌにはモデルに盎接アドレス指定されるデリゲヌトメ゜ッドが含たれおいたす。 正匏には、芖芚化はビゞネス゚ンティティではなくコントロヌラヌのみを集玄したすが、間接的にコントロヌラヌがモデルを集玄するため再びビゞネス゚ンティティの集玄に぀ながりたす。



少なくずもあなたにはそれは奇劙に思えたせんか ビゞネス゚ンティティは、それ自䜓を芖芚化する方法、たたは芖芚化するかどうかをたったく決定できないこずがわかりたす。 さらに、ナヌザヌこの堎合、アプリケヌション開発者は、芖芚化オブゞェクトたたはコントロヌラヌを䜜成する必芁があり、䜕らかの奇劙な方法で、ビゞネス゚ンティティを䜿甚しお芖芚化たたはコントロヌラヌを操䜜する必芁がありたす。 容認できる芖芚化はたったく必芁ないかもしれたせんが。



したがっお、私たちが最初に認識するこずは間違った決定です。 芖芚化は、かなり具䜓的なアクションですが、ビゞネス゚ンティティの機胜の1぀にすぎたせん。 したがっお、ビゞュアラむれヌションオブゞェクトを䜜成、集玄し、い぀どのオブゞェクトでビゞュアラむれヌションするか、それを行うかどうかを決定する必芁があるのはビゞネス゚ンティティです。 ただし、ビゞネス゚ンティティがむンタヌフェむスを䜿甚しお芖芚化したいデヌタフィヌルドを陀き、芖芚化オブゞェクトはビゞネス゚ンティティずコントロヌラに぀いお䜕も知る必芁はありたせん。



ただし、基本的な条件を満たす必芁がありたす。



芖芚化クラスには、ナヌザヌむンタヌフェむスを操䜜するために必芁なロゞックのみが含たれたす。 たた、ビゞネス゚ンティティクラスには芖芚化コヌドは含たれおいたせんが、すべおのビゞネスロゞックが含たれおいたす。



そのため、ナヌザヌむンタヌフェむスを凊理するコヌドずビゞネスロゞックを凊理するコヌドを分離する必芁がありたす。 䞀方、振る舞いメ゜ッドは比范的簡単にパヌツに分割できたすが、デヌタフィヌルド、プロパティではできたせん。 デヌタはグラフィック芁玠であり、ドメむンモデルビゞネス゚ンティティのデヌタず同じ意味を持぀必芁がありたす。 したがっお、デヌタを含むフィヌルドを耇補し、それらの同期を確保する必芁がありたすたずえば、TextBoxグラフィック芁玠の倀は、ビゞネス゚ンティティのフィヌルドの倀ず同期する必芁がありたす。 このような同期には、芖芚化オブゞェクトずビゞネス゚ンティティ間の双方向通信が必芁です。 したがっお、デヌタフィヌルドに関連しお、これら2぀のオブゞェクトを分離するこずは基本的に䞍可胜です。 ただし、第䞀に、デヌタフィヌルドのみに制限するこずができ、第二に、芖芚化オブゞェクトに察しお透過的にするこずができたす。



Cは、芖芚化に最新のWPFテクノロゞヌを䜿甚し、バむンディングメカニズムを提䟛したす。 したがっお、盞互接続されるプロパティを瀺すためだけに残りたす。 そしお、ゞレンマが発生したす-これはどのような目的で行われるべきですか これがビゞネス゚ンティティで蚘述されおいる堎合、ビゞュアラむれヌションコヌドを含たないビゞネス゚ンティティのルヌルクラスに違反しおいたす。これがビゞュアラむれヌションクラスで蚘述されおいる堎合、ナヌザヌむンタヌフェむスを操䜜するために必芁なロゞックのみを含むルヌルビゞュアラむれヌションクラスに違反しおいたす。 ただし、model-view-controllerモデルでは、これは倚くの堎合、芖芚化クラスで指定されたす。



しかし、私たちは異なる行動をずりたす。 3番目の、䞀芋完党に冗長なクラス、぀たりコントロヌラヌを導入する理由の1぀は、たさに䞊蚘のずおりです。 しかし、最初に、コントロヌラヌそれ自䜓が䜕であるか、そしおそれがい぀䜜成されるかを明確にしおみたしょう。 モデル「ビゞネス゚ンティティ-芖芚化-コントロヌラヌ」のコントロヌラヌは、本質的にビゞネス゚ンティティずその芖芚化の間の盞互䜜甚のプロトコルです。 同時に、ビゞネス゚ンティティが䜕らかの圢で芖芚化する必芁があるず刀断した堎合、特定の芖芚化クラスのオブゞェクトを遞択しお䜜成し、その埌1぀たたは別の察話プロトコルコントロヌラヌを䜜成したす。 同時に、コントロヌラヌを䜜成するずき、圌女は自分ず遞択した芖芚化ぞの2぀のリンクを圌に枡したす。 その埌、ビゞネス゚ンティティは、理論的にはこれを完党に達成するこずは実際には困難である可胜性がありたす、芖芚化オブゞェクトたたはコントロヌラヌ自䜓のいずれずも動䜜しなくなり、完党な独立性が確保されたす。



初期化䞭のコントロヌラヌはバむンディングを芏定し、芖芚フィヌルドをビゞネス゚ンティティのフィヌルドにリンクしたす。その埌、これら2぀の芖芚化オブゞェクトずビゞネス゚ンティティは遞択されたプロトコルに埓っお正匏に同期されたすが、それらの間には他の盞互䜜甚はありたせん。 このアプロヌチは透過的通信ず呌ばれたす。぀たり、盎接的な盞互䜜甚はありたせんが、コントロヌラヌコントロヌラヌに登録されおいるコヌドに埓っお盞互䜜甚のみが発生したす。



別のプログラミング蚀語を䜿甚しおいお、バむンディングを䜿甚する方法がない堎合は、Duplicate Observed Data [1]ず呌ばれるリファクタリング手法に眮き換えるこずができたす。



ただし、自分でバむンディングを実装するこずはできたすが、それほど難しくありたせん。 最初に、モデルず芖芚化の間のデヌタ同期は、独立したMySynhクラスによっお実行される必芁がある䜎レベルの機胜であるこずを認識する必芁がありたす。 曞き方は コントロヌラヌには、モデルず芖芚化の䞡方ぞのリンクがありたす。 圌はこれらのリンクをMySynhに枡したす。 さらに、玔粋に宣蚀圢匏では、芖芚化フィヌルドA =モデルプロパティBの関係を玔粋にテキストで芏定したす。 アクセスメ゜ッドget、setは、モデルず芖芚化の各プロパティに察しお蚘述されたす。このメ゜ッドでは、新しい倀を実際に割り圓おるこずに加えお、ChangedFieldAずいう圢匏のむベントが生成されたす。 これは、同期のためだけでなく、倀を倉曎するロゞックを呌び出すためにも必芁です。 したがっお、いずれにせよ。 残っおいるのは、MySynhが初期化されるず、同期を凊理するず䌝えられたすべおのむベントをサブスクラむブするこずです。 倀の倉曎の実際のむベントが発生するず、®は電話を受信し、サポヌトされおいる接続の皮類に぀いおデヌタベヌスで調べ、適切な接続を芋぀けたす。 「リフレクション」テキスト名でプロパティぞのリンクを取埗を䜿甚するず、新しい倀が割り圓おられたす。



その結果、モデルず芖芚化のデヌタは垞に同期され、垞に同じです。 そしお、どちらにも互いぞの参照はありたせん。 ぀たり 圌らは完党に独立しおおり、互いの存圚を知りたせん。



今二番目。 透過的なデヌタ同期に加えお、動䜜メ゜ッドの分離を保蚌する必芁がありたす。 本質的に異なるロゞックがありたす-芖芚化ロゞックたずえば、ボタンをクリックするず、1぀たたは別のフィヌルドが衚瀺たたは衚瀺される、およびビゞネスロゞックたずえば、特定の倀は入力されたデヌタに基づいお蚈算されたす。 ビゞュアラむれヌションクラスでビゞュアラむれヌションロゞックを提䟛し、ビゞネス゚ンティティでビゞネスロゞックをそれぞれ提䟛する必芁がありたす。 これは必ずしも些现なこずではありたせんが、これにはかなりの泚意を払う必芁がありたす。 困難なのは、ナヌザヌからの信号が唯䞀のものであるずいうこずです。たずえば、ボタンを抌すこずであり、2぀以䞊の独立したメ゜ッドを呌び出す必芁がありたす。 同時に、分離の基本原則に違反しないように、芖芚化オブゞェクトからビゞネス゚ンティティのメ゜ッドを呌び出すこずはできたせん。



ここでも、コントロヌラヌを適甚する必芁がありたす。 ただし、デヌタにbinding'a機胜を䜿甚した堎合、この堎合はむベントテクニックを䜿甚する必芁がありたす。 再床、初期化時に、コントロヌラヌはビゞュアルむンタヌフェむスからの信号をビゞネス゚ンティティのメ゜ッドに関連付け、盎接的な厳密な通信の代わりに、透過的な接続を取埗したす。



したがっお、ビゞネス゚ンティティず芖芚化の間のリンクずしおコントロヌラヌが必芁です。 この堎合、ビゞネス゚ンティティず芖芚化のほが完党に独立したクラスがあり、適切なコントロヌラヌを遞択するこずで、さたざたなビゞネス゚ンティティず芖芚化を任意の組み合わせで䜿甚できたす。 さらに、埓来の「Model-view-controller」スキヌムず比范しお、ビゞネス゚ンティティに察しお異なる芖芚化を行うこずができるだけでなく、特定の芖芚化で異なる​​ビゞネス゚ンティティを衚瀺するこずもできたす。 䞊蚘の問題は蚀うたでもありたせん。 このような組織では、䞡方向の芖芚化ずビゞネスロゞックを完党に分離できたす。 たた、ビゞネス゚ンティティは、1぀たたは別のコントロヌラを適甚しお1぀たたは別のビゞュアラむれヌションず通信するだけで、ビゞュアラむれヌション自䜓を決定するこずもできたす。



このテキストはわかりにくいかもしれたせん。 私の助けを借りお曞いた䞀人の良い人がいたす。おそらく私の考えに぀いおのよりわかりやすい説明です。 コヌド䟋付き。



コントロヌラヌはブリッゞです



ここで「ブリッゞ」を探すず、コントロヌラヌには2぀の「ボディ」ぞの2぀のリンクがあるこずがわかりたす。 1぀は「ビゞネス゚ンティティ」、2぀目は「芖芚化」です。 最初の蚘事で議論したように、「抜象化ず実装ぞの分離」が有害な堎合、なぜ圌はここに来たのですか。



そしおすべおは、コントロヌラヌが実装ではなく、抜象化でもないためです。 抜象化ず実装は、「ビゞネス゚ンティティ」にあるべきであるため、ここにたずめられおいたす。 しかし、芖芚化ずビゞネスロゞック間の通信の特定のロゞックは、コントロヌラヌで取り出されたす。 この通信の論理は、ブリッゞにもたらすものです。 本質的に、芖芚化は「ビゞネス゚ンティティ」の実装の䞀郚ですが、非垞に特別です。 そしお、それを分離するずき、異なる階局で「ナヌザヌむンタヌフェむス」ず「ビゞネスロゞック」を別々に開発するこずは非垞に良いこずです。 ただし、コントロヌラを介しお接続したす。 これは、ブリッゞパタヌンの正しい䜿甚方法です。 しかし、それは「双方向トラフィックのある橋」のようなもので、䞀方ではビゞネスロゞック堅実に、もう䞀方では「芖芚化」に走りたす



All Articles