ブリッゞ/ブリッゞデザむンパタヌンの誀った䜿甚

先史時代



Bridgeのデザむンパタヌンに関するこの蚘事を読みたした。 悲しいかな、それは非垞に頻繁に誀っお䜿甚されたす。 さらに、 オブゞェクト指向蚭蚈のトリックずいう本を開きたした。 デザむンパタヌン 。 それが刀明したした-そしお、著者は非垞に挠然ずその存圚の理由ずそれを䜿甚する理由を宣蚀したす。 そのため、以䞋では、これを䜿甚する方法ず理由を説明したす。



曎新する



これは、正確に解釈できない衚面的な蚘事です。 しかし、その尊厳は、それが短く、問題に぀ながるこずです。 専門家にずっおは、より深い質問を提起するこずができ、若い開発者にずっおは、いく぀かの誀解がありたす。 私は実際にThe Gang of Fourず議論しおいたすが、私はファりラヌずリファクタリングに察する圌のアプロヌチに完党に同意したすそしお圌らは自分たちの間で矛盟を持っおいたす-しかし、私が議論する人のように。



専門家向けの拡匵蚘事を準備しおいたすが、若い開発者が蚭蚈パタヌンを機械的に孊習するのに圹立぀堎合がありたす。 圌らはい぀䜿うべきかをよく理解しおいたせんが、専門家がパタヌンから優先されるべきであるずいう意味で議論するこずは重芁だず思いたす。 この拡匵された蚘事で、「ブリッゞ」パタヌンを取り陀く必芁がある理由を説明し、限られた意味でメディ゚ヌタヌパタヌンを䜿甚するこずを期埅したす。



この蚘事には既に「Bridge」パタヌン双方向ブリッゞたたはMVC->「Business Entity-Visualization-Controller」の正しい䜿甚方法のブランチがありたす 。 芖芚化ずビゞネスロゞックを分離するずきに、ブリッゞ/メディ゚ヌタヌを組み合わせお䜿甚​​できるこずが瀺されおいたすが、これがこれらのテンプレヌトのほずんど唯䞀の領域です。 玔粋なビゞネスロゞックず䜎レベル/システムタスクでは、これらのパタヌンは避ける必芁がありたす。



しかし、公開するこずはできたせん。カルマはありたせんが、理解しおいるように、入力するたで他の遞択肢はありたせん。 だからあなたは読みたい、あなたは䜕をすべきか知っおいる:)



実際にブリッゞの蚭蚈パタヌンは䜕ですか



オブゞェクト指向プログラミングを知っおいるなら、私はすべおの責任をもっお、パタヌンに぀いお知るこずは絶察に必芁ではないず宣蚀したす。 パタヌンは単なるプラむベヌトであり、OOPの原則に基づいた最も成功した゜リュヌションずは限りたせん。



「ブリッゞ」パタヌンずは䜕か、この難解な甚語の背埌にあるものを芋おみたしょう。 それは、継承ず集玄の組み合わせにすぎたせん。 悲しいかな、圌らはしばしば集玄が䜕であるかを知らない。 簡単に蚀えば、これは、あるオブゞェクトが別のオブゞェクトに含たれる堎合です。





ブリッゞパタヌンを䜿甚する本圓の理由



この本の著者はこの目暙を宣蚀しおいたす「抜象化をその実装から分離するこず」。



しかし、これは完党に真実ではありたせん。 原則ずしお、それは有害ですらありたす。 これはOOPに反しおいたす。 実装は、抜象化で宣蚀されおいるものず完党に䞀貫しおいる必芁がありたす。 それ以倖の堎合、䟡栌は䞀般に宣蚀を販売から分離する䟡倀がありたす。 クラス宣蚀を芋お、クラスの実装がそれに察応しおいないこずが刀明した堎合、最も重芁なものを倱いたした- 倚態性を倱いたした。 その埌、実装に慣れるこずを䜙儀なくされ、抜象化/仕様のみを知るだけでは䞍十分です。



しかし、ポむントは倚少異なりたす。 そしお、䟋によっお明らかになりたす。 継承が適甚される䟋が瀺されおいたす。 しかし、継承は単玔ではありたせんが、2぀の異なる基準に埓っおいたす。 たずえば、「Windows」はさたざたなオペレヌティングシステムXWindow、PMWindow、...、およびさたざたな目的アむコン甚りィンドりIconWindow、メッセヌゞ甚りィンドりMessageWindowなどに分類できたす。



次に、最終りィンドりには、ある階局の関数ず別の階局の関数が含たれおいる必芁がありたす。 ぀たり 目的ずオペレヌティングシステムに特化する。 次に、圓然ながら、継承装眮に問題が生じ、これらの階局の乗算ずしおクラスを䜜成する必芁があるこずがわかりたす。 XIconWindow、PMIconWindow、XMessageWindow、PMMessageWindow。 もちろん、これは別のOOP原則-単玔な゚ンティティの単なる組み合わせである䜙分な゚ンティティの䜜成-にすでに違反しおいたす。



これは、倚重継承を䜿甚する兞型的な䟋であるこずに泚意しおください。 ぀たり XIconWindowは、IconWindowおよびXWindowの子孫です。 しかし、最近の傟向により、耇数の継承が䞍適切なPLOずしお特定されおいたす。 ここでは説明したせんが、実際には理論的には倚重継承は䞍芁であり、䞻題領域の誀解がありたす。



そのため、パタヌンの䜜成者は別の方法を提䟛したす。 圌らは、階局の1぀が物理的な実装に責任があるずいう特定を芋たした。 どのOSのためにそれが行われたす。 そしお、もちろん、これは非衚瀺にする必芁がありたす。 しかし、これは特殊性にすぎたせんが、実際には他の階局が存圚する堎合がありたす。 たずえば、りィンドりは、シングルりィンドりSDIたたはマルチりィンドりMDIの原理によっお異なる堎合がありたす。 そしお、䜕、階局のもう䞀぀の乗算



そしおもちろんそうではありたせん。 オブゞェクトのこれらの階局がプロパティであるずいう理解を保存したす。 そしお、プロパティを実装する方法は 指定されたオブゞェクトにそれらを含めお、そうです。 ぀たり 集玄を適甚したす。



これが「ブリッゞ」パタヌンを䜜るものです。 しかし、本質的にこのパタヌンは、OOPのより䞀般的な原則の䞍噚甚な説明です。



しかし、どうすればより正確に議論するのでしょうか



ずおも簡単です。 䞀般的なプラむベヌトの関係がありたす—継承を適甚​​したす;郚分党䜓の関係がありたす—集玄を䜿甚したす。 しかし、これはそれほど明癜ではない堎合があり、䞀般的なプラむベヌトの関係があるように思われたすが、2぀、3぀の異なる基準䞊蚘に埓っおいたす。 しかし、このような掚論は混乱を招くだけであり、それに応じおプログラムのアヌキテクチャを悪化させるこずを芚えおいたす。 それから、どの基準がより重芁でどれがより䜎いかを決定しなければなりたせん。 それらを階局に配眮し、䞀方を他方にネストしたす。 「ブリッゞ」パタヌンの䜜成者は、オペレヌティングシステムぞの特性の実装は、りィンドりの目的よりも重芁ではないず考えおいたす。 しかし、これは特別な堎合にすぎたせん。 他の基準が存圚する堎合があり、そのたびに䜕が䞀郚で䜕が党䜓かを決定する必芁がありたす。



さらに、これは倚くの堎合、郚品がすでに実装されおおり、远加の補品が登堎したずきに決定する必芁がありたす。 次に、リファクタリングを凊理し、継承を集玄に倉換する必芁がありたす。 したがっお、継承はクラス間でより厳しい束を䜜成するこずを芚えおおく必芁がありたす。 そしお垞に、機䌚があれば、集玄を奜む方が良いです。 これにより、クラス仕様ず異なるクラス間の関係をより明確に定匏化できたす。 継承は非垞に慎重に䜿甚する必芁がありたす。 それ以倖の堎合、埌で集玄に再䜜成する必芁がありたす。これは倚くの堎合、それほど単玔ではありたせん。 継承は、遺䌝的分類の基準を明確に区別できない堎合にのみ䜿甚する必芁がありたす。 このクラスがより抜象的なクラスの亜皮であり、基準ではなく䞀般的なものであるこずがわかっおいる堎合。



しかし、「アラヌム」の実装ず「アラヌム」の抜象化を決しお区別しないでください。 これは、PLOの誀解を瀺しおいるだけです。 したがっお、このメモを䜜成する理由ずなった蚘事では、目芚たし時蚈の実装ずしお宣蚀された゚ンティティが「ブリッゞ」ずしお提瀺されおいたす。 興味深いこずに、しかし、いわゆる アラヌムの抜象化-実装ではありたせんか



実際には、メッセヌゞの呌び出しず送信ずいう2぀の機胜がそこに䜜成されおいたす。 そしお、これはさたざたな方法で行うこずができたす。 明らかに、これらの機胜の組み合わせは人為的です、なぜなら それらのさたざたな組み合わせが可胜です。 したがっお、私たちが持っおいる目芚たし時蚈の抜象化は、擬䌌実装ではなく、2぀の゚ンティティ-メッセヌゞマネヌゞャヌの抜象化ずメロディプレヌダヌのマネヌゞャヌを䜿甚したす。 そしお、コンストラクタヌの助けを借りた具䜓的なクラスは、メッセヌゞのタむプずメロディヌの挔奏方法を定矩したす。



結論は1぀だけです。蚭蚈パタヌン、特にBridgeで議論されたもの、特に重芁な原則を理解しおいないものなど、よく考えられおいないものは、プログラマヌずそのプログラムを干枉、混乱させるだけです。



曎新したした。 远加の説明。



この蚘事の目的は、読者がブリッゞずは䜕かに粟通しおいるこずです。 「ブリッゞ」パタヌンを次のものず混同しないようにお願いしたす。

1.単玔な集玄-゚ンゞンがマシンに集玄される堎合䜿甚可胜なマシンず゚ンゞンの皮類に関係なく

2.むンタヌフェむスの䜿甚は最初のものず䌌おいたすが、唯䞀の違いは抜象クラスの代わりにEngine、Engineなどのむンタヌフェむスが䜿甚されるこずです。



これはすべお、「ブリッゞ」パタヌンの必芁性に達したせんあたりにも现かく、぀たり、「ブリッゞ」パタヌンは、より耇雑なケヌスで著者が考えたように䜿甚されたす。 ここでも、「ブリッゞ」を適甚するず、すべおの実装が匷調衚瀺される、぀たり、 別のクラスのすべおの䜎レベル関数、぀たり マシンの゚ンゞンの機胜ではなく、MachineRealizationのマシン自䜓の䜎レベルの機胜プラむベヌトです。



「ブリッゞ」ずは別のものを意味する堎合、この蚘事はあなたに向いおいたせん。 あなたはすべおを正しくしおいる、たたは単に「橋」が必芁な状況にただ遭遇しおいない-そしお非垞によく、 圌は本圓に必芁ではありたせん。



別の「ブリッゞ」-倚重継承を䜿甚しお実装できるので、自分自身ず䟋を確認しおください。 したがっお、たずえば、最初の2぀のタむプ-「単玔な集玄」ず「むンタヌフェヌスの䜿甚」は、明らかに倚重継承を保持する堎所がないこずを瀺しおいたす。぀たり、「ブリッゞ」も必芁ないずいうこずです。



それずも、もっず簡単です-機械から゚ンゞンを継承するこずはあなたに起こりたすか たたは、手玙からの手玙の送信者を蚀う たたは、デヌタベヌスの抜象化たたはWindowからのファむルクラスですか



ただし、「ブリッゞ」パタヌンの䜿甚䟋では、これが初期䜍眮であり、「ブリッゞ」を䜿甚しお修正する必芁がありたす。 しかし、そのような圢匏の継承が可胜かどうかを考えおください。 最初の状況が異なっおいお、䜕か他のものに぀いおブリッゞを䜿甚したず思うのはなぜですか



「橋」の話は、1぀のセクションではなく、継承があるずきに始たりたす。 ぀たり 乗甚車ずトラックが機械から継承されるだけでは䞍十分です。 機械から継承する別の欲求がシステムに必芁です-芳光甚の機械、茞送甚の機械...そしお、旅行甚の旅客機、茞送甚の旅客機の組み合わせクラスも必芁です...そしお、そのような恐怖が珟れたずきのみ-あなたは「ブリッゞ」を䜿甚するこずを䜙儀なくされたす必芁な堎合でも、ブリッゞを適甚しないでください。 しかし、パタヌンの䜜者が説明するようにではなく、この蚘事で説明するように、私は本圓に望んでいたす。



upd2。 もう1぀の誀解を取り陀いおみたしょう。



もちろん、「ブリッゞ」を実装するために、抜象クラスの集合が䜿甚されるか、むンタヌフェヌスが䜿甚されるか、他の䜕かが䜿甚されたす。 これはそれに぀いおではありたせん。 「ブリッゞ」パタヌンを䜿甚する堎合ず䜿甚しない堎合の理由に぀いおです。 䜿甚する動機に぀いおです。 著者によっお蚘述された特定の動機があり、この蚘事の䞀郚である堎合、それは必芁です。 しかし、これは反察を意味するものではなく、むンタヌフェむスたたは抜象クラスを䜿甚した堎所はどこでも、ブリッゞになりたす。 したがっお、機械ず゚ンゞンを䜿甚した䞊蚘の䟋は、玔粋に意味論的には「ブリッゞ」パタヌンではありたせんが、構文的には同じむンタヌフェヌスを芋るこずができたすが、「ブリッゞ」ではありたせん。

これはほんの䞀面です。 蚘事のもう1぀の䞻芁な蚘事で、著者が「ブリッゞ」の䜿甚を掚奚する状況に実際に遭遇した堎合、これはお勧めしたせん。これは有害であり、他の方法もありたす。 しかし、パタヌンの䜜成者ずしお議論するこずはお勧めしたせん-抜象化から実装を遞択したす。



upd3。 コメントに問題がありたす。 ここで2぀の質問に答えたす。



1. TheShockの倚重継承に぀いお。 これは、コンパむラがこれを行ったかどうかを確認できないため、゚ラヌが発生する可胜性があるためです。



2.コルりィンの興味深いパズル。 オプションの1぀。 最初のステップは、WinずOs2の盞続人を含む階局OSを䜜成するこずです。 ImageMap LoadFromFileおよびPaintBigImage argImageメ゜ッドを䜿甚しおImageProcessingむンタヌフェむスを䜜成したす。 WinずOs2は、それぞれ独自の方法でImageProcessingを実装したす。 準備された階局にリファクタリングするこずでBigImageImpを取り陀きたす。 BigImageでは、ImageProcessing imむンタヌフェヌスを集玄したす。 BigImageの埌継では、Loadメ゜ッドは最初にim.LoadFromFileを呌び出し、Showは最埌にim.Paintthisを呌び出したす。



それは橋でもあるず蚀えたすか しかし、少なくずも、セマンティクスは桁違いに明確になりたした。



オプション2最初から䜜成され、䞊行しお実行するこずもできたす。぀たり、最初のオプションをロボットのたたにしたす。 クラむアントにOSを䜿甚させるこずができたす。 OS.PaintargBigImageを呌び出したす。 これを行うには、OSがBigImageメ゜ッドを呌び出すように、他の方法が必芁です。 ぀たり ペむントはargImageMap = LoadFromFileを呌び出し、次にargBigImage.LoadargImageMapを呌び出したす-たずえば、BmpBigImageは独自の特異性を画像の継承者にしたす。 次に、OSはargBigImage.PrepareForShowを呌び出しこれにより、むメヌゞのShowメ゜ッドの意味が明確になりたす。実際には、それは自分自身を衚瀺できないこずが刀明しおいるため、OSは実際に衚瀺されたす。 そしお、橋はすでに絶察にありたせん。 たた、最初の゜リュヌションを削陀するず、ImageProcessingむンタヌフェヌスを取り陀くこずができたすが、これはオプションです。 ちなみに、2番目のオプションは最初のオプションを正しいセマンティクスに分解するこずによっおのみ発明でき、ブリッゞのフレヌムワヌク内で考えるこずは実際にはオプションではなく、解決策は悪いこずに泚意しおください。



All Articles