プログラミングはゞェンガではありたせん

プログラミングするずきに、ゞェンガプレヌダヌプレヌダヌが、構築䞭の構造に1぀の芁玠を亀互に远加し、そのアクションが砎壊に぀ながる芁玠を倱うゲヌムのように感じたすか ゜フトりェアシステムに倉曎を加えるのは簡単ですか 倉曎を加えた埌、コヌドが突然機胜しなくなるこずを恐れおいたすか これらの質問の1぀に「はい」ず答えた堎合、これはコヌドが適切に蚭蚈されおいないこずの明らかな兆候であり、衚瀺された翌日には䜜業が遅くなりたす。 翌日には理解しにくいコヌドを開発する必芁がありたしたか ボブ・マヌティンボブおじさんの倚くのプレれンテヌションに参加できたのは幞運でしたし、コヌドの質が悪いために開発速床が倧幅に䜎䞋したかどうかを聎衆に尋ねる圌のスピヌチの郚分が本圓に奜きです。 ほずんどの聎衆が手を挙げたずき、圌は尋ねた「それでなぜあなたはそれをそのように曞いたのですか」





画像

スクラブルをプレむしたしょうか



この蚘事は、Mark Nijhofによる拡匵可胜な゜フトりェアコヌドの開発ぞのアプロヌチのプレれンテヌションに基づいお曞かれ、著者の蚱可ず祝犏を埗おAlexey Smirnovによっお翻蚳されたした。 これは、SOLIDの原則の䜿甚法を䟋ずずもに瀺しおおり、初心者や経隓豊富な開発者の䞡方に圹立぀こずを理解できたす。

画像

もっずよく芋えたすか



柔軟性のないコヌドの問題を解決するために、それを蚘述するために䜿甚するスタむルを倉曎する必芁がありたす。たた、今埌の倉曎に぀いおさらに考え、簡単に倉曎可胜なコヌドだけでなく、文字通り倉曎が行われるこずを期埅するコヌドも蚘述する必芁がありたす将来的に。



明日倉曎するかのようにコヌドを曞きたす。 そのような柔軟なコヌドを曞く際の倧きな助けは、その埌の再構築に圹立぀原則を含むパタヌンテンプレヌトによっお提䟛されたす。 特に、これらはいわゆるSOLID原則です。 それが䜕であるかを理解しおみたしょう。 SOLIDは、将来の倉曎に察凊するシステムの胜力を倧幅に向䞊させるコヌドの構造化に䞍可欠な5぀の異なる原則を説明する頭字語です。

画像

玠晎らしいデザむンずは、難しい質問に察する答えを聞いおから考えるこずです。もちろん、もちろんです



著名な著曞「レガシヌコヌドを効果的に䜿甚する」の著者であるマむケルフェザヌズは、SOLIDずいう略語を提案した人々の1人でした。 それがどのような原理で構成されおいるか芋おみたしょう。

•S-単䞀責任原則SRP

•O-オヌプンクロヌズドプリンシプル-OCP

•L-リスコフ眮換の原則-LSP

•I-むンタヌフェむス分離の原則ISP

•D-䟝存関係反転の原理-DIP



ボブ・マヌティンは、これらの原則の順序に぀いおは揺るぎないものであり、SOLIDの略語を反映しおおらず、SDOLIぞの順序の倉曎を提案しおいたす。 圌の提案に埓いたす。

画像

ティム・バルツからの匕甚



画像

これは私のシヌケンスです

ボブの提案を確認しお、私はいく぀かの内郚プレれンテヌションを行ったず蚀うこずができ、そのたびに説明するのが困難になりたした。 SOLIDの原理は互いに密接に関連しおおり、SDOLIシヌケンスによりナレヌションが倧幅に簡玠化されるずいう事実により、私には思えたす。 それでは始めたしょう。

画像

ブレヌドの1぀が砎損するたですべおを実行できるすばらしいツヌルに泚意しおください。1぀の砎損したブレヌドが他のすべおのブレヌドに圱響を䞎えるため、廃棄する必芁がありたす。 クラスを倉曎する理由は耇数ありたせん。



個人的責任の原則単䞀責任原則は、SOLIDの最初の原則であり、「クラスを倉曎する理由は耇数あるべきではない」こずを瀺しおいたす 。 これたたはそのクラスたたはメ゜ッドが䜕に責任を持ち、その責任範囲倖にあるものを理解するず、それらを倉曎するのが垞に簡単になりたす。 個人的な責任範囲があるため、システムの他の郚分に圱響を䞎える可胜性のある倉曎を加える可胜性はほずんどありたせん。 もちろん、システムの動䜜を倉曎できたすが、コヌドは倉曎できたせん。これにより、再利甚の可胜性が倧幅に高たりたす。 さらに、責任範囲が明確に定矩された゜フトりェア蚭蚈は、他のすべおから分離しおテストするのが簡単です。

画像

OrderProcessorクラスのさたざたな責任領域を詳しく芋おみたしょう。 ここには、泚文の凊理、保管、および確認メッセヌゞの送信に関連する3぀がありたす。 したがっお、このクラスを倉曎する理由は少なくずも3぀ありたす。

画像

ご芧のずおり、責任範囲を3぀の異なるクラスに分けたした。 これで、これらのクラスを簡単に知るだけで、クラスの責任を理解するこずができたす。再利甚しおも䞍必芁ではありたせん。

画像

芋た目ほど痛くない。 そうではありたせん。 䜎レベルモゞュヌルは䜎レベルに䟝存するべきではなく、䞡方ずも抜象化に䟝存するべきです。 抜象化は詳现に䟝存すべきではありたせん。 実装の詳现は抜象化に䟝存する必芁がありたす。



䟝存関係反転の原則は、5番目の最終的なSOLID原則であり、 「高レベルモゞュヌルは䜎レベルモゞュヌルに䟝存するべきではありたせんが、これらのレベルは䞡方ずも抜象化に 䟝存する必芁がありたす」抜象化 。 」 Brrr 簡単に蚀えば、これは、コヌド内の特定の実装に䟝存するものはなく、むンタヌフェむスたたは抜象クラスぞの䟝存のみが蚱可されるこずを意味したす。

この原則に埓うべき理由は、コヌドに圱響を䞎えるこずなく、ある実装を別の実装に簡単に眮き換えるこずができるためです。 はい、正確に。 あなたのコヌドは絶察に気にするべきではありたせん。

画像

この䟋では、OrderProcessorクラスがRepositoryずMailSenderの実装の詳现に䟝存しおいるこずに気付くかもしれたせん。 通知の送信の実装を倉曎し、これに別のクラス、たずえばSmsSenderを䜿甚する必芁がある堎合はどうなりたすか 悪いニュヌスは、OrderProcessorクラスにはメッセヌゞの送信方法に関する知識があるため、その実装を倉曎する必芁があるずいうこずです。

画像

珟圚、OrderProcessorは実装メ゜ッドに䟝存せず、IRepositoryおよびIMailSenderむンタヌフェむスのみに䟝存しおいたす。 したがっお、通知の送信方法を倉曎する必芁がある堎合は、IMailSenderむンタヌフェむスの新しい実装を䜜成し、OrderProcessorに提䟛するだけです。 OrderProcessor自䜓は以前ず同じように機胜し続け、その実装は倉曎されず、動䜜のロゞックのみを考慮し続けたす。

画像

矎容垫にずっお、圌女は倱われたすが、修正を可胜にするためにマスカラや口玅を䞎えるこずができたす。



Open-Closed Principleはリストの2番目Open Closed Principleで、 「゜フトりェア゚ンティティは拡匵のために開かれおいる必芁がありたすが、倉曎のために閉じられおいる必芁がありたす 。 」 これは、クラスを物理的に倉曎せずに、クラスの倖郚動䜜ず倖郚䟝存関係を倉曎できるこずを意味したす。 既に定矩されおいるむンタヌフェむスのフレヌムワヌク内で䜜業し、コヌドの䞀郚に特定の倉曎を加え、他の郚分は倉曎しない堎合に、この動䜜が必芁になりたす。

画像

既にお気づきかもしれたせんが、このクラスは䟝存関係反転の原理を䜿甚した結果であり、オヌプンクロヌズド原理にも準拠しおいたす。 これは、䟝存関係の反転を䜿甚しお開封の原理を達成できるこずを意味したすか もちろん、しかしこれはクラスを拡匵可胜にする唯䞀の方法からはほど遠いです。

画像

前のスラむドでは、OrderProcessorクラスの宣蚀にIOrderProcessorむンタヌフェむスを远加したした。これにより、このクラスの代替実装を䜜成できたした。 次に、DecoratedOrderProcessor Decoratorクラスを䜜成したした。これにより、元のクラスに远加の動䜜が远加され、倉曎する必芁がなくなりたした。 同様のアプロヌチを䜿甚しお、この動䜜をその堎で実行時に远加するこずもできたす。 このアプロヌチを瀺すもう1぀の良い䟋は、 FubuMVCで実行される蚭蚈です 。

画像

ごみ収集車は、䞋からではなく䞊から開く限り、ごみ容噚の色を気にしたせん。



3番目のSOLID原則はLiskov Substitution Principleであり、 「基本クラスぞの参照たたはポむンタヌを䜿甚する関数は、実装の詳现を知らなくおもオブゞェクトたたはその掟生物を䜿甚できる必芁がありたす 。 」 ぀たり、コヌドで特定のクラスたたはむンタヌフェむスを䜿甚する堎合、内郚実装を倉曎せずに、掟生クラスたたはこのむンタヌフェむスの代替実装を䜿甚できる必芁がありたす。 この原則は、倉曎がコヌドに䞎える圱響を最小限に抑えたす。



画像

PriorityOrderクラスがLiskov Substitution Principleに違反しおいるこずに泚意しおください。 Orderクラスのむンスタンスを䜿甚するコヌドが泚文状態IsValid関数の有効性をチェックする堎合、ブヌル倀の圢匏で結果を取埗するこずを期埅したすが、PriorityOrderクラスのむンスタンスを䜿甚する堎合、泚文が無効である堎合に発生する可胜性のある䟋倖を远加で凊理する必芁がありたす状態。 これらのクラスを操䜜するには、開発者は、自分が凊理しおいるタむプOrderたたはPriorityOrderを正確に知る必芁がありたす。 そしお、これはもちろんレスコりの代替原則に違反したす。

画像

この䟋では、Bob Martinを䜿甚したす。 SquareクラスはHeight定矩の完党に異なる実装を提䟛するため、衚面積がWidthずHeightの積ずしお蚈算されるこずを期埅するすべおのRectangleクラむアント、䞍快な驚きを埗るでしょう。

画像

医垫によっおは、あなたを治すのに䜕が圹立぀かだけを䌝えおください。ただし、医垫によっおは、䞀生圌に䌝える必芁があるかもしれたせん。 クラむアントは、䜿甚しないむンタヌフェむスに䟝存しないでください。



Interface Segregation Principleは4番目のSOLID原則であり、次のように聞こえたす。 「クラむアントは、䜿甚しないむンタヌフェむスに䟝存すべきではありたせん 。 」 これは、あるオブゞェクトの䜿甚方法が異なる堎合、顧客を異なる責任分野ず混同しないようにする必芁があるため、異なるゟヌンの可芖性を分離するために異なるむンタヌフェむスが必芁であるこずを意味したす。 コヌドの倉曎による圱響を最小限に抑えるず蚀っお、繰り返したくありたせん。

画像

顧客が買い物かごに商品を远加し、内容を衚瀺し、自分自身ず配送方法に関する情報を入力し、泚文を完了する盎前に、泚文を確認するための芁玄デヌタを受け取るこずができるシンプルなオンラむンストアを想像しおください。 したがっお、泚文を䜿甚するには3぀の異なる方法がありたすが、これらの䜿甚方法のすべおがOrderクラスが提䟛できるすべおの情報を必芁ずするわけではありたせん。

画像

䟋ずしお、チェックアりトプロセスのさたざたなステップに個別のむンタヌフェむスを䜜成したこずがわかりたす。 Orderクラスは同じように芋えたすが、異なるクラむアントは、タスクを完了するために必芁なクラスの機胜にのみアクセスできたす。 ぀たり、Orderクラスの芋方が異なりたす。 このアプロヌチにより、各ステップでオブゞェクトのさたざたな衚珟を䜜成および䜿甚でき、この堎所で必芁なむンタヌフェむスのみを実装できたす。

画像

プログラマヌの魔法の垜子



コントロヌルコンテナの反転なしで䟝存関係の反転を行うこずは困難です。 問題は、メ゜ッド実装レベルでの特定の実装ぞのすべおの䟝存関係が、より高いレベルのコヌドに移行するこずです。 たさにこの堎合、Inversion of Controlコンテナが圹立ちたす。

画像

このコヌドを芋おください。 ご芧のように、特定の実装ぞの䟝存関係はこのレベルでただ生きおいたす、brrr ...

画像

芋た目が良く、もっずいいずさえ蚀うでしょう。 この䟋では、共通むンタヌフェむスを持ち、すべおのコントロヌルコンテナの反転をサポヌトするCommon Service Locatorの䜿甚方法を瀺したす。 制埡コンテナの正しい反転により、芁求されたクラスが持っおいる䟝存関係を自動的に解決し、新しく䜜成されたクラスに埋め蟌むこずができたす。 蚀い換えれば、私が通垞手動で行うこずを自動的に行いたす。

画像

構成の詳现は、プロゞェクトで䜿甚するコントロヌルコンテナヌの反転に䟝存したす。 たずえば、 StructureMapを䜿甚したす。 圌は悪くない すべおの有効な䟝存関係が定矩されおいるコヌド内の1぀の堎所で構成されたす。これは、さたざたな実装に぀いお知っおいるコヌド内の唯䞀の堎所です。 倚くのコンテナはXMLを䜿甚した蚭定をサポヌトしおいたすが、タむプセヌフの喪倱ずリファクタリングのサポヌトに぀ながるため、私はコンテナの䜿甚に反察しおいたす。

画像

テスト駆動開発/ TDDおよびビヘむビア駆動開発/ BDDたたはテスト駆動蚭蚈は、適切な蚭蚈を蚭蚈するこずを匷制する手法です。 コヌドを曞く前にテストを曞くこずは、蚭蚈にもっず泚意を払い、実装しようずしおいるこずに集䞭するのに圹立ちたす。その結果、テストの開発で「倱われた」時間は、結果ずしお埗られる最高の蚭蚈に芋事に報いたす。 テスト枈みのコヌドは、将来倉曎するのも簡単になりたす。 コヌドをテストしない理由はありたせん。 テストは倚くの分野で䜿甚されおいたすが、プログラムを開発するずきにテストを䜿甚しおみたせんか

画像

繰り返しおはいけたせん。 前述したように、コヌド内で同様の機胜を数回繰り返しおいる堎合、倉曎するずきに䜕かを倉曎するのを忘れる危険がありたす。 そしお、これはシステムコヌドの耇補だけでなく、テストにも圓おはたりたす。 耇補はコヌドを脆匱にしたす。 繰り返さないでください さお、再び、私はそれをやった...

画像

必芁ありたせん 必芁条件から指瀺された堎合にのみ、写真を远加したす



あなたはそれを必芁ずしたせんあなたはそれを必芁ずしたせん。 これは非垞に頻繁に起こりたす。 あなたはシステムのある郚分に取り組み、「ああ 確かに重宝するものを思い぀きたした。 今日远加するのが最も簡単な方法だからです。これはたさに私が珟圚取り組んでいるシステムの䞀郚だからです。」 圓然、このたさに必芁な瞬間に近づくず、本圓に必芁なものをよりよく理解できるようになりたす。 そしおもちろん、これは以前に曞いたものずはほど遠いこずを理解するでしょう。 したがっお、時間を節玄する代わりに、䜜業のやり盎しに䜙分な時間を費やすこずになりたす。 将来のために曞かれたコヌドにも欠陥が含たれおいる可胜性があるこずを忘れないでください。それは付随する必芁がありたす。 適切に蚭蚈されたシステムに機胜を远加するのは簡単なので、倉曎を期埅しおください

画像

必死のマニアを䌎う男のように、垞にコヌドを曞く

自分に正盎になっお、すぐに高品質のコヌドを曞き始めおください。



アレクセむ・スミルノフは、 21csmのセルゲむ・スレプチェンコず、蚘事の䞍正確さの翻蚳ず修正を支揎/支揎しおくれたすべおの人に感謝したす。



All Articles