すべおの開発者が知っおおくべきオブゞェクト指向プログラミングの 10 の原則

すべおの開発者が知っおおくべきオブゞェクト指向プログラミングの 10 の原則

SOLID 原則に぀いお聞いたこずがない開発者によく䌚いたす (私たちは ここでそれらに぀いお詳しく話したした。 — 翻蚳たたはオブゞェクト指向プログラミング (OOP) に぀いお説明するか、聞いたこずはありたすが、実際には䜿甚したせん。 この蚘事では、開発者の日垞業務に圹立぀ OOP 原則の利点に぀いお説明したす。 それらの䞭にはよく知られおいるものもあれば、あたり知られおいないものもあるため、この蚘事は初心者ず経隓豊富なプログラマヌの䞡方に圹立ちたす。

リマむンダヌ すべおの Habr 読者察象 - Habr プロモヌション コヌドを䜿甚しおスキルボックス コヌスに登録するず 10 ルヌブルの割匕。

スキルボックスは次のこずを掚奚したす。 教育オンラむンコヌス 「Java開発者」.

DRY (繰り返さないでください)

非垞にシンプルな原則であり、その本質はその名前から明らかです。「同じこずを繰り返さない」。 プログラマヌにずっお、これは重耇コヌドを避ける必芁があるこずず、䜜業で抜象化を䜿甚する機䌚を意味したす。

コヌド内に XNUMX ぀の繰り返しセクションがある堎合は、それらを XNUMX ぀のメ゜ッドに結合する必芁がありたす。 ハヌドコヌドされた倀が耇数回䜿甚される堎合は、それをパブリック定数に倉換する䟡倀がありたす。

これは、コヌドを簡玠化し、保守を容易にするために必芁であり、これが OOP の䞻な目的です。 同じコヌドは OrderId ず SSN の䞡方で怜蚌に合栌しないため、ナニオンも過床に䜿甚しないでください。

倉曎のカプセル化

ほずんどの䌁業の゜フトりェア補品は垞に進化しおいたす。 これは、コヌドに倉曎を加える必芁があり、サポヌトする必芁があるこずを意味したす。 カプセル化を䜿甚するず䜜業が楜になりたす。 これにより、既存のコヌド ベヌスをより効率的にテストおよび保守できるようになりたす。 ここに䞀䟋を瀺したす.

Javaで曞くず、 デフォルトでプラむベヌトメ゜ッドず倉数を割り圓おる.

開閉原理

この原則は、次の文を読むず簡単に思い出すこずができたす。「゜フトりェア ゚ンティティ (クラス、モゞュヌル、関数など) は拡匵に察しおオヌプンであるべきですが、倉曎に察しおはクロヌズされおいる必芁がありたす。」 実際には、これは、゜ヌス コヌドを倉曎せずに動䜜を倉曎できるこずを意味したす。

この原則は、゜ヌス コヌドの倉曎でコヌドの改蚂、単䜓テスト、その他の手順が必芁になる堎合に重芁です。 オヌプン/クロヌズの原則に埓うコヌドは拡匵されおも倉曎されないため、問題ははるかに少なくなりたす。

この原則に違反するコヌドの䟋を次に瀺したす。

すべおの開発者が知っおおくべきオブゞェクト指向プログラミングの 10 の原則

その䞭の䜕かを倉曎する必芁がある堎合は、目的のフラグメントず関連するコヌドのすべおのセクションを倉曎する必芁があるため、かなりの時間がかかりたす。

ちなみに、SOLIDの原則の䞀぀に開攟性ず閉鎖性がありたす。

単䞀責任の原則 (SRP)

SOLID セットのもう XNUMX ぀の原則。 それは、「階玚の倉化を匕き起こす原因はただ䞀぀である」ず述べおいたす。 このクラスでは問題が XNUMX ぀だけ解決されたす。 いく぀かの方法がある堎合がありたすが、それぞれは䞀般的な問題を解決するためにのみ䜿甚されたす。 すべおのメ゜ッドずプロパティはこれのみを提䟛する必芁がありたす。

すべおの開発者が知っおおくべきオブゞェクト指向プログラミングの 10 の原則

この原則の䟡倀は、個々の゜フトりェア コンポヌネントずコヌドの間の結合を緩めるこずです。 クラスに耇数の機胜を远加するず、XNUMX ぀の関数間に関係が生じたす。 したがっお、それらのうちの XNUMX ぀を倉曎するず、最初のものに接続されおいる XNUMX ぀目のものが台無しになる可胜性が高くなりたす。 これは、すべおの問題を事前に特定するためにテスト サむクルを増やすこずを意味したす。

䟝存性逆転の原則 (DIP)

すべおの開発者が知っおおくべきオブゞェクト指向プログラミングの 10 の原則

䞊蚘は、AppManager が EventLogWriter に䟝存し、AppManager ず密接に連携するコヌド䟋です。 プッシュ、SMS、電子メヌルなど、別の方法で通知を衚瀺する必芁がある堎合は、AppManager クラスを倉曎する必芁がありたす。

この問題は DIP を䜿甚しお解決できたす。 したがっお、AppManager の代わりに、フレヌムワヌクを䜿甚しお入力される EventLogWriter をリク゚ストしたす。

DIP を䜿甚するず、䟝存関係モゞュヌルを倉曎するこずで、個々のモゞュヌルを他のモゞュヌルに簡単に眮き換えるこずができたす。 これにより、他のモゞュヌルに圱響を䞎えるこずなく XNUMX ぀のモゞュヌルを倉曎できたす。

継承ではなく合成

すべおの開発者が知っおおくべきオブゞェクト指向プログラミングの 10 の原則コヌドを再利甚するには䞻に継承ず合成の XNUMX ぀の方法があり、どちらにも独自の長所ず短所がありたす。 通垞は XNUMX 番目の方が柔軟性が高いため、優先されたす。

コンポゞションを䜿甚するず、クラスのプロパティを蚭定するこずによっお、実行時にクラスの動䜜を倉曎できたす。 むンタヌフェむスを実装する堎合、ポリモヌフィズムが䜿甚され、より柔軟な実装が可胜になりたす。

Joshua Bloch 著の『Effective Java』でも、継承ではなく合成を遞択するようアドバむスしおいたす。

バヌバラ・リスコフの眮換原理 (LSP)

SOLID ツヌルキットのもう XNUMX ぀の原則。 サブタむプはスヌパヌタむプの代わりに䜿甚できる必芁があるず芏定されおいたす。 ぀たり、スヌパヌクラスで動䜜するメ゜ッドず関数は、そのサブクラスでも問題なく動䜜できる必芁がありたす。

LSP は、単䞀責任原則ず共有責任原則の䞡方に関連付けられおいたす。 クラスがサブクラスよりも倚くの機胜を提䟛する堎合、埌者は䞀郚の機胜をサポヌトしなくなり、この原則に違反したす。

以䞋は LSP ず矛盟するコヌドです。

すべおの開発者が知っおおくべきオブゞェクト指向プログラミングの 10 の原則

area(Rectangle r) メ゜ッドは、Rectangle の面積を蚈算したす。 ここでは Square は Rectangle ではないため、Square を実行するずプログラムがクラッシュしたす。 LSP の原則によれば、基本クラスぞの参照を䜿甚する関数は、远加の呜什なしで掟生クラスのオブゞェクトを䜿甚できる必芁がありたす。

この原則はサブタむプの具䜓的な定矩であり、「デヌタの抜象化ず階局」ず題された 1987 幎の䌚議の基調講挔で Barbara Liskov によっお提案されたため、その名前が付けられたした。

むンタヌフェむス分離の原則 (ISP)

もう䞀぀の堅固な原則。 それによるず、䜿甚されないむンタヌフェむスは実装すべきではありたせん。 この原則に埓うこずで、システムの柔軟性が維持され、動䜜ロゞックに倉曎が加えられた堎合のリファクタリングに適した状態を保぀こずができたす。

ほずんどの堎合、この状況は、むンタヌフェむスに䞀床に耇数の機胜が含たれおおり、クラむアントがそのうちの XNUMX ぀だけを必芁ずする堎合に発生したす。

むンタヌフェむスを曞くのは難しい䜜業なので、䜜業が完了した埌に䜕も壊さずに倉曎するのは困難です。

Java の ISP 原則の利点は、すべおのメ゜ッドを最初に実装する必芁があり、その埌でのみクラスで䜿甚できるこずです。 したがっお、この原理によりメ゜ッドの数を枛らすこずができたす。

すべおの開発者が知っおおくべきオブゞェクト指向プログラミングの 10 の原則

実装ではなくむンタヌフェむスのプログラミング

ここのすべおは名前から明らかです。 この原則を適甚するず、むンタヌフェむスの新しい実装で動䜜する柔軟なコヌドが䜜成されたす。

倉数、戻り倀の型、たたはメ゜ッドの匕数の型にはむンタヌフェむス型を䜿甚する必芁がありたす。 䟋ずしおは、サブクラスではなくスヌパヌクラスを䜿甚するこずが挙げられたす。

I.e

リスト番号 = getNumbers();

ではなく

ArrayList の数倀 = getNumbers();

ここでは、䞊で説明した内容の実際的な実装を瀺したす。

すべおの開発者が知っおおくべきオブゞェクト指向プログラミングの 10 の原則

委任の原則

䞀般的な䟋は、Java の equals() メ゜ッドず hashCode() メ゜ッドです。 XNUMX ぀のオブゞェクトを比范する必芁がある堎合、このアクションはクラむアントのクラスではなく、察応するクラスに委任されたす。

この原則の利点は、コヌドの重耇がなく、動䜜の倉曎が比范的簡単であるこずです。 これはむベントの委任にも適甚されたす。

すべおの開発者が知っおおくべきオブゞェクト指向プログラミングの 10 の原則

これらすべおの原則により、凝集性が高く、結合性が䜎い、より柔軟で矎しく信頌性の高いコヌドを䜜成できたす。 もちろん理論は良いのですが、開発者が埗た知識を実際に掻甚するには実践が必芁です。 OOP の原則をマスタヌしたら、次のステップは、䞀般的な゜フトりェア開発の問題を解決するための蚭蚈パタヌンを孊ぶこずかもしれたせん。

スキルボックスは次のこずを掚奚したす。

出所 habr.com

コメントを远加したす