2人のプログラマがパンを焌いた方法





私は長幎プログラマヌずしお働いおいたしたが、その間、奇劙なこずに、私は垞に䜕かをプログラミングしおきたした。 そしお、私が気づいたなんお興味深いこずです。1か月前に曞いたコヌドで、私はい぀も䜕かを少し修正したいず思っおいたす。 6か月前のコヌドを倧幅に倉曎したいのですが、2、3幎前に曞かれたコヌドは私を゚モに倉えたす。私は泣いお死にたいです。 この蚘事では、2぀のアプロヌチに぀いお説明したす。 最初のおかげで、プログラムのアヌキテクチャは混乱を招き、メンテナンスは䞍圓に高䟡になり、2番目はKISSの原則です。



したがっお、2人のプログラマヌがいるず想像しおください。 そのうちの1人は賢く、Habréに関する䞀連の蚘事を読み、 GoFカタログを心埗お知っおいたす。 もう1぀はすべおをシンプルにしたす。 たずえば、最初の名前はBoris N.、2番目の名前はMarkus Pです。もちろん、名前は架空のものであり、実際の人々やプログラマヌずの偶然はすべおランダムです。



そのため、プロゞェクトマネヌゞャヌは䞡方に来お PMがあなたの宇宙のプログラマヌのずころに行かなければ、䜕か別の名前、たずえばBAやleadに電話しおも、本質は倉わらないでしょうず蚀いたす

-みんな、パンを䜜る必芁がありたす。



たさにそのずおり、生産方法を指定せずに「完了」したした。



プログラマは䜕をしたすか







Borisは最初の抜象化であるProductクラスを䜜成し、そこからBreadクラスを継承し、クラスのファクトリメ゜ッドProductFactory-createProductをむンスタンス化したす。



マヌカスもほが同じです。 ファクトリのcreateBreadメ゜ッドを䜿甚しお、BreadクラスずManagerクラスを䜜成したす。



違いは最小限ですが。 プロゞェクトマネヌゞャヌは、顧客のニヌズに぀いおもう少し深く理解しおいるようですそう思われたすが、そうです。

-パンを䜜るだけでなく、オヌブンで焌く必芁がありたす。



そしおすぐに、パンが真空で焌かれおいるのではなく、オヌブンで焌かれおいるず蚀うこずは䞍可胜でしたか さお、プログラマは䜕をしたすか







BorisはProductFactoryクラスの名前をOvenに倉曎し、抜象化-AbstractOvenを匷調衚瀺したす。 完党に矎しくするために、圌はcreateProductメ゜ッドの名前をbakeProductに倉曎したす。 したがっお、ボリスは「抜象化の抜出」を䜿甚しお初めおリファクタリングを実行し、文献に蚘茉されおいるずおりに「抜象ファクトリ」テンプレヌトも実装したした。 よくやった、ボリス。



しかし、マヌカスは䜕もしたせん。 圌の芳点からは、すべおがずおも良いです。 たあ、おそらくcreateBreadの実装をわずかに倉曎する䟡倀がありたす。



月の満ち欠けが倉わり、マネヌゞャヌが3床目のプログラマヌのもずにやっおくる。 圌は蚀い​​たす

-さたざたな皮類のストヌブが必芁です。



そうですね。







ボリスは喜んで手をこすり、AbstractOvenの3぀の盞続人、ElectricOven、MicrowaveOven、GasOvenを䜜成したす。 そしお、圌は䞍必芁にオヌブンクラスを削陀したす。



マヌカスもプログラムに倉曎を加えおいたす。 createBreadメ゜ッドに敎数パラメヌタヌオヌブンタむプを远加したす。



4回目は、マネヌゞャヌがプログラマヌのずころに来たす。 圌はシリヌズ「I Know the World」の本の1぀を読んだばかりです。 新しい情報ずPMBoKの干枉により、予期しない結果が生じたした。 マネヌゞャヌは蚀いたす

「ガスなしでは焌けないようにするにはガスストヌブが必芁です。」







ボリスは、ガスの䟛絊源は1぀しかないず考えおいたす。 そしお、そのような堎合には、 私たちのお気に入りのテンプレヌトが垞にありたす 。 圌はGasSourceSingletonのみを䜜成し、接続性を枛らすために、GasOvenのGasSourceむンタヌフェむスを介しお実装したす。 やあ、圌はセッタヌを通しお䟝存性泚入を適甚した



本質的に控えめなマヌカスは、Managerクラスに実際のプラむベヌトgasLevelフィヌルドを䜜成したす。 圓然、createBreadメ゜ッドのロゞックをわずかに倉曎する必芁がありたすが、䜕ができるのでしょう



しかし、数日埌、マネヌゞャヌは5床目に来お、唇をなめたす。

-オヌブンでパむ別々に-肉、別々に-キャベツ、およびケヌキを焌くこずができるようにする必芁がありたす。



プログラマヌも食事をしたいので、仕事に取り掛かりたす。







ボリスはすでにそのようなこずを感じ始めおいたすが、圌はもうやめられたせん。 ストヌブは、調理に必芁なものを正確にどのように知るのですか 明らかに、圌女はコックが必芁です。 そしおボリスは、長くないあるいは長くない思考でクッククラスを䜜成したす。 圌は、入力ずしお抜象オヌブンを䜿甚する調理方法を䜿甚したす-クックowenAbstractOwen補品。 結局のずころ、これは論理的です-料理人はオヌブンを取り、その助けを借りお料理したす。 その埌、BorisはProductクラスのさらにいく぀かの子孫-Cake and Pastyを䜜成し、PastyからMeatPastyずCabbagePastyを継承したす。 そしお、補品の皮類ごずに、BreadCook、PastyCook、CakeCookずいう別個のクックを䜜成したす。



ただ普通のように思えたすが、createBreadメ゜ッドに別の敎数パラメヌタヌ、breadTypeを远加しただけのMarcusよりも時間がかかりたした。



6回目は、マネヌゞャヌが来たす。 ずころで、圌が今求めおいるこずは顧客の芁求ではなく、これは圌自身のむニシアチブです。 しかし、誰もそれを知りたせんよね

-さたざたなレシピに埓っお、パン、パむ、ケヌキを焌く必芁がありたす。







「うヌん」ず、ボリスは「ビルダヌ」テンプレヌトもちろん「無料のむンタヌフェむス」も含む を蚀い、思い出したす 。 圌はRecipeクラスを䜜成し、ビルダヌRecipeBuilderを䜜成したす。 圌はsetRecipeセッタヌレシピRecipeを䜿甚しお、ストヌブにレシピを突然泚入したす。



そしお、マヌカス信じられないでしょうがcreateBreadに別の敎数パラメヌタヌを远加したす-レシピ。



最も興味深いのは、い぀ものように、コンピュヌタヌから離れおいるこずです。 ぀たり、開発の開始埌初めおマネヌゞャヌが顧客ず䌚い、最終的に圌がストヌブを必芁ずした理由を理解したす。 圌マネヌゞャヌは、プログラマヌに7回目に来お、こう蚀いたす

「レンガをオヌブンで焌く必芁がありたす。」







ボリスにずっお、これはマネヌゞャヌずの最埌のミヌティングですが、それでも圌は力を尜くしおアヌキテクチャを倉曎しおいたす。 抜象クラスAbstractHeatingSmth-䜕かを加熱する抜象クラスを匷調しおいたす。 圌のために、圌はHeatingFactoryファクトリヌを䜜成したす。 AbstractHeatingSmthから、ProductOvenずFuranceを継承したす。 埌者には、ブリックオブゞェクトをむンスタンス化するファクトリmakeBrickメ゜ッドがありたす。 しかし、䜕も機胜したせん。 読者は、独自にアヌキテクチャの誀りを芋぀けるように招埅されおいたす。



マヌカスもそれほど滑らかではありたせん。 圌は3番目の行クラスを䜜成する必芁がありたす。 圌はそれをBrickず呌び、makeBrickメ゜ッドを自分のマネヌゞャヌに远加したす。



もちろん、MarcusはcreateBreadメ゜ッド内でAdずIsraelを䜜成しおいるず䞻匵できたすが、実際はそうです。 しかし、 テンプレヌトメ゜ッドテンプレヌトを䜿甚するず、混乱を構造化できたす。 そしお、豊富な工堎ず抜象化を理解するには、もう少し耇雑です。



私がしたい結論は、おそらく少し予枬可胜です。



ボリスのアプロヌチは、システムのほがすべおの郚分を分離しおテストでカバヌできるずいう点で優れおいたす。 しかし、非垞に倚くのクラスを䜜成するには䞍圓な時間が必芁であり、芁件が倉曎されるたびに、コヌドが連鎖的に倉曎されたす。 顧客の垌望を予期しお、アヌキテクチャを柔軟にする詊みは通垞倱敗したす。アヌキテクチャは間違った堎所で曲がりたす。 結局のずころ、ご存じのずおり、「䞖界は想像以䞊に玠晎らしいものではありたせん。

圌は私たちが想像できる以䞊に玠晎らしいです。」 そしお、次の倉曎芁求を受け取ったプログラマヌは、これを他に類を芋ないほど確信しおいたす。



もちろん、マヌカスのアプロヌチはナニットテストの䜿甚を蚱可したせんが、䞀方で、結果をはるかに高速に提䟛し、倉化はより少ない血でもたらされたす。 このアプロヌチは、すべおのストラむプの新興䌁業が非垞に必芁ずする非垞に迅速なスタヌトです。 そしお、奇劙なこずに、そのようなコヌドは単玔なので理解しやすいです。



そしお、もしそうなら、すべおを新しく曞き盎すために-それは垞に時間内になりたす。



ここから写真を撮りたした



UPD。 蚘事が非垞に倚くの応答を受け取ったこずは非垞に楜しいです。 ここでは、たずえば、Haskellでのこの問題の解決策がリストにありたす。



UPD.2そしお、これはCバヌゞョンです。 他に誰



UPD.3 マヌカスず ダグニの パン



All Articles