私はおそらくOOPを知っおいたす。 オブゞェクト指向プログラミングおよび蚭蚈の経隓。 答えは「OOPを知らない」です。

「 OOPがわからない 」などの蚘事が掲茉された埌、「衚玙を匕き裂く」、「真実の底にたどり着く」ずいう明確な願望がありたす。



オブゞェクトの向きの原則



通垞、4぀の「オブゞェクト指向プログラミングの原則」は区別されたすむンタビュヌむンタビュヌ䞭抜象化、カプセル化、継承、およびポリモヌフィズム。



私の意芋では抜象化ずポリモヌフィズムは継承のサブセクションに簡単に起因する可胜性があるこずは蚀うたでもありたせん、 ここでの原則は䞀般に、デヌタベヌスを蚭蚈するずきず同じです オブゞェクトの圢ですべおを衚珟したす-プロパティを持぀䜕か 。 通垞、セットは固定され、オブゞェクトのクラスに぀いお話したす。クラスの抂念がなくおも、特定の名前のプロパティの存圚はプログラムロゞックによっお暗瀺されたす。 特定の最小限のプロパティセットの圢匏のクラスのようなものがただ存圚しおいたす。 䞀般に、ビュヌは長幎のC-shnoy / Pascalデヌタ型struct / recordに戻りたす。 次に、関数型プログラミングの意味での少しの「機胜」を远加したした。プロパティの倀は、さらに、構造/レコヌド自䜓ぞのアクセス暩を持぀関数、プロパティの倀のいずれかです。 この珟象は、ドむツ語のラテン語を話すネヌミングの最良の䌝統オプションが「オプション」ず呌ばれ、数の皋床が「効力」ず呌ばれる堎合で、「 方法 」ず呌ばれおいたした。 Pascalの「レコヌド」のような各サブゞェクトの衚瀺ず組み合わせお、コヌドを再利甚したいずいう願望は、「 継承 」の抂念に぀ながりたした。



「メ゜ッド」の出珟により、機胜の線成に関しお別の楜しい瞬間が浮かび䞊がりたした。名前の前半ず埌半が重耇する900個の関数を䜜成する代わりにWordBasicを思い出しおください、それぞれに30個のメ゜ッドを持぀30個のクラスを䜜成できたす。



たた、 厳密な静的型付けを䜿甚しお蚀語を䜜成できるようになりたした。これにより、倚くの゚ラヌを怜出する時間をプログラム実行段階からコンパむル段階に移すこずができたした。 たた、 厳密な静的型付けの堎合、子孫でのみ実装されおいるずいう事実にもかかわらず、メ゜ッドが宣蚀されおいるクラスを䜜成するこずが必芁になる堎合がありたした。 そのため、 玔粋に仮想的なメ゜ッドず抜象クラスの抂念が登堎したした 。



たた、カプセル化、継承、抜象化、およびポリモヌフィズムは、「原則」ではなく、オブゞェクト指向プログラミングの「ガむドラむン」です。 特に、カプセル化により、プロキシが可胜になりたす。 ガむドラむンは、「プログラミング」のプロセスであり、「蚭蚈」や「アプロヌチ」ではなく、倚くの堎合誀解を招く可胜性があるこずに泚意しおください。



批刀。 継承 むンタヌフェヌスの誕生



継承の抂念が開発されたこずで、オブゞェクトを耇数のクラスに同時に属するこずができるようになりたした。これらのクラスは、盞互に関連する芪および子孫ではありたせん。 これは、倚重継承の可胜性を導入するこずで実行できたす。 しかし、刀明したように、真の倚重継承は通垞「 菱圢継承 」の問題を匕き起こしたす。同じクラスの2぀の子孫から継承する堎合、同じメンバヌフィヌルド、プロパティ、メ゜ッドの倚重継承を解決する方法は明確ではありたせん。



この問題は、「 むンタヌフェヌス 」の発明によっお完党に解決されたした。぀たり、玔粋に仮想的なクラスのみがメンバヌずしお蚱可される完党に抜象的なクラスです。 抜象メ゜ッド。 「静的実装を挿入する堎所」䞀般的に、厳密に型指定された蚀語のクラスメ゜ッドは、䜕かの倀ず考えるず静的です。この「倀」-メ゜ッドの定矩-はクラスのすべおのむンスタンスで同じです-唯䞀のものこれらのメ゜ッドで蚱可されおいたものは、定矩䞊、「菱圢継承」の問題を匕き起こすこずはできたせんでした。 さらに、カプセル化の普及により、メ゜ッドのみが「突き出おいる」堎合、これは異垞なものずしお認識されたせん。



別のむンタヌフェむスは、非機胜蚀語の機胜パラダむムをほが実装し、実際に䞀連のアルゎリズムを匕数ずしお枡すこずができるずいう点で優れおいたす。



批刀。 「実際の」クラスがそれほど少ないのはなぜですか。 耇数のディスパッチ。 「マネヌゞャヌ」の誕生ずドメむンオブゞェクトからの分離。 シングルトン





クラスは䞀連のプロパティず「動䜜」であるず考えられおいたす。 1998幎にVisualBasic 5のヘルプから読んだ蚀葉を思い出したす。次のようなものです。 むベントはオブゞェクトがあなたにそれが行われたず䌝えるものです 。 " それで、「振る舞い」に぀いおはただ疑問がありたす-方法か䜕かです。



蚭蚈䞊の問題は、「動䜜」に2぀以䞊のクラスが含たれるずきに始たりたす。 解説のずおり-「身長、䜓重、幎霢-プロパティ。 歩くには、cnpが行動です。「ここでは、文字「p」で行動をモデル化する堎合、More ThanずWhereおよび「walk」も-Whereもありたすがありたす。 䞀般に、耇数の非プリミティブクラスがアクションに関䞎しおいる堎合、オブゞェクトモデルを開発するずきに、2、3、4などのどれかずいう疑問が生じたす。 クラス—この堎合、「who」、「by」、たたは「where」-このアクションをモデル化するメ゜ッドは属したすか いずれにせよ、これはおそらく密結合であり、システムをさらに構築する過皋でそしお、絶え間ない完了、拡匵、改善は、䟋倖的な状況ではなく、定期的なものず芋なされるべきです



この問題は、特別な゚ンティティ「 マネヌゞャヌ 」を匷調衚瀺するこずで解決されたす。 その結果、「銀行口座」タむプのオブゞェクトにはtransfer_onaccount、amountのメ゜ッドがありたせんが、代わりに「account manager」タむプのオブゞェクトにはtransfer_s_nas_account、to_account、amountのメ゜ッドがありたす。



「マネヌゞャヌ」ではないが、実䞖界のオブゞェクト ドメむンオブゞェクトクラスを反映するクラス自䜓は、この傟向を続けおおり、通垞、カプセル化の原則を保蚌するために必芁なメ゜ッド最も原始的なアクセサヌずミュヌテヌタヌ以倖はありたせん。 そしお、それは兞型的です。耇数のディスパッチ問題が即座に根本的に解決されるオブゞェクトシステムでは-CLOSでは-そのようなメ゜ッドはありたせんが、システム党䜓に属する異なるタむプの匕数を持぀同じ名前の特別な関数がありたす。



興味深いこずに、䞀般的なケヌスでは、 transfer_s_ons_account、to_account、amountのメ゜ッドがあるこずを陀いお、「アカりントマネヌゞャヌ」のタむプに぀いお䜕も知る必芁はありたせん。 ぀たり これは兞型的な実装む​​ンタヌフェヌスです。 デヌタの敎合性を確保するためのメカニズムを倉曎する必芁がある堎合トランザクションから手動ロック、たたはその逆、「アカりント」などのコヌドを曞き換える必芁はありたせん。たた、䜕も曞き換える必芁はありたせんそれぞれ叀いものを再テストする必芁はありたせんむンタヌフェむスの新しい実装を䜜成したす。



そのような方法が参加者の䞀人に残されるこずになった同じ堎所で、ビゞタヌの「デザむンパタヌン」タむプのugさを䜿甚する必芁がありたす。機胜が実際に「倖偎」に匕き出され、「内偎」が「内偎」のたたであるかのように匕っ匵られる堎合



問題は、クラスに珟実のオブゞェクトモデルの芳点から䞍可欠なプロパティがない堎合、物理オブゞェクトをモデル化しない堎合、そのコピヌがいく぀存圚する必芁があるかずいうこずです。 十分ではないでしょうか 䞀般に、むンスタンスの数が少ないほど効果的であり、その数は技術的な理由たずえば、プヌルからの接続ごずに1぀によっお決たりたす。 特に瞮退した堎合、1぀のむンスタンスで十分です。特にその䜜成が非垞にリ゜ヌスを消費する堎合は。 これは、デザむンパタヌン「 シングルトン 」-「ロンナヌ」ず呌ばれたす。 このクラスは、静的メ゜ッドを介しお取埗できるむンスタンスが1぀だけになるように蚘述されおいたす。



今日の時代では、サヌビスクラスのむンスタンス化の問題がさたざたな䟝存関係むンゞェクタヌに委ねられおいるため、むンスタンスの厳密な手動制埡の䟋ずしおのシングルトンパタヌンの実装は、䞀皮の密結合であり、したがっお蚭蚈原則の違反であり、非垞に非コミットです。



批刀。 「再定矩されたコンストラクタが必芁です。」 工堎



耇雑な動䜜を䌎うコンストラクタヌの䜿甚、および継承の集䞭的な䜿甚は、䞀般に、密結合フィヌルドずむンタヌフェヌス、heheの䟋であり、これに関連しお、悪いマナヌです。 䞋䜍クラスのコンストラクタヌを呌び出すずき、すべおの祖先クラスのデザむナヌが最初に呌び出されたす。これは䞀般に、倚くの堎合、必芁ではなく、䞀般的にリ゜ヌスを消費し、単に有害です。 クラスむンスタンスロゞックを別のサヌビスクラスに集䞭し、すべおの「販売前の準備」を同時に実行するこずをお勧めしたす。 サヌビスクラスは、すでに説明したすべおのストップを備えたむンタヌフェむスなどずしお蚭蚈できたす。 「 ファクトリヌ 」が刀明したす。



ファクトリにはさらにいく぀かの利点がありたす。1nullを返すこずができ、2同じオブゞェクトを䜕床も返すこずができたす。



批刀。 プリミティブおよびその他のValueオブゞェクト。 免疫。 内郚化。





「すべおがオブゞェクトである」ずいう原則は、もちろん、その䞀貫性によっお匕き付けられたす。 最初は、オブゞェクト自䜓のプロパティ倀はオブゞェクトではないず想定されおいたす。 そしお、䞀般的に、クラスシステムは最終的に「実」ぞの出力を持぀必芁があり、「実」は垞にFoxProタむプのいずれかのタむプのデヌタです数倀、文字列、日時、たたはyes / no。 したがっお、過床の柔軟性が必芁でない堎合は、オブゞェクトを䜿甚しおすべおを実行せず、䞀郚の非オブゞェクトデヌタ型を残すこずをお勧めしたす。



この考え方は、特に高レベルの蚀語オブゞェクトがそれらぞの参照によっお排他的に衚される自動ガベヌゞコレクションのある蚀語で特に重芁になりたす。 パフォヌマンスを高速化するには、すべおのデヌタ型を参照する必芁はありたせん。



Valueオブゞェクトのデザむン境界のC プリミティブ 。 これらは、特別なメ゜ッドを持たないオブゞェクトであり、プリミティブたたはValueオブゞェクトの倀を持぀プロパティのセットを持ち、物理的な同䞀性それらぞの同じ参照ではなく、プロパティ倀に基づいお同等性がチェックされたす。



倚くの堎合、むしろ、原則ずしおValueオブゞェクトは䞍倉になりたす。 䞍倉です。 むミュニティを䜿甚するず、耇雑な倀オブゞェクトをキヌずしお倧胆に䜿甚でき、通垞、远加の「グッズ」を提䟛したす。特に、「バック」ロゞックのない䞍倉のスク゚ア猶は、䞍倉の長方圢の継承者ずなりたす。



免疫の抂念の隣には、 内郚化の抂念がありたす。぀たり、特定のクラスのすべおの等しいプロパティ倀に関しおオブゞェクトは物理的に等しい、぀たり 同じオブゞェクトでした。 これは、このクラスのこれたでに䜿甚されたすべおのむンスタンスを静的たたは異なる「シグルトン」セットセットに保存し、理想的には、䞀意性をチェックしおすべおの「補品」を「枡す」「工堎䞀意のコピヌのみを配垃したす。 䜜成フェヌズでは、これは非垞に遅くなりたすが、䜿甚は䜕床も加速されたす。



IRLクラス。 批刀。 「䞀郚のクラスは他のクラスよりも同等です」



「平等」のクラスのピラミッドの頂点近くで、クラスの等䟡性が䟵害されおいたす。 特に、「オブゞェクト指向の」ランタむム環境自䜓にラップしたい堎合。



Javaでは、すべおのクラスのルヌトクラスはObjectクラスです。 ただし、Objectクラスには、Class型のオブゞェクトを返すgetClassメ゜ッドず、String型のオブゞェクトを返すtoStringメ゜ッドがありたす。 CloneNotSupportedException、InterruptedException、IllegalArgumentException、Throwableをスロヌするメ゜ッドもありたす。 同時に、Classクラス、Throwableクラス、およびStringクラスはObjectクラスの盎接の子孫であり、CloneNotSupportedException、InterruptedException、およびIllegalArgumentExceptionは間接的なもの以䞊です。 䞀般に、メ゜ッドの半分ず、悪名高い子孫ぞのリンク倚くの堎合間接的を持぀クラスは、埪環䟝存関係のように悪い蚭蚈ですが、「できなくおも本圓に必芁な堎合は、䞀床できたす」。 たた、䟋倖ず゚ラヌのルヌトクラスThrowableには、その間接的な子孫ぞの参照も含たれおいたす。IllegalStateExceptionずIllegalArgumentExceptionです。



ただし、StringクラスずClassクラスはfinalです。 子孫を持぀こずはできたせん。これにより、Objectクラスでの䜿甚の「犯眪性」が軜枛されたす。



IRLクラス。 圌らは最終的に䜕をした



Java蚀語では、クラスは䞻にオブゞェクトのラベルになりたした。 メ゜ッドのオヌバヌロヌドが頻繁に䜿甚される状況では、倧郚分はメ゜ッド名の䞀郚にもなりたす。 時間の経過に䌎う匷力なタむピングは、予想倖のプラスの圹割を果たしたした。Java蚀語がリファクタリングに最も適しおいるこずが刀明したした。



継承、およびドメむンオブゞェクトのクラスぞのアルゎリズムの添付は、密結合および悪い習慣ずしお認識されおおり、厳密に甚量に適甚されたす。 特に、さたざたな゜ヌシャルネットワヌクで動䜜するプログラムに「゜ヌシャルアカりント」゚ンティティを実装する奜たしい方法は、FBAccount、VKAccount、TwitterAccountの子孫を持぀抜象SocialAccountクラスを䜜成するのではなく、デヌタから通垞のSocialAccountドメむンクラスずファクトリコンバヌタヌを䜜成するこずですさたざたな゜ヌシャルネットワヌクから、おそらくJSON-to-SocialAccount-convertersからも。 ORMを思い出させたすか だから玄10幎前にすべおが戻っおきたしたデヌタベヌスの読み取り/曞き蟌みロゞックが氞続クラス自䜓のメ゜ッドに含たれるDB氞続プラットフォヌムが配垃されたした。そのため、DBExternalizableObjectのような特別なクラスから継承する必芁がありたした。 その埌、「ご存知のずおり」圌らはそれを拒吊したした。



さらに、実際には、実際、ほずんどの堎合、メロンデヌタベヌステヌブル内のレコヌドの「レむダヌ」であり、最初はDBMSたたはDBMS蚭蚈ツヌルで蚭蚈されたす。



たた、プロパティ、メ゜ッド、および継承を備えた「通垞」、「クラシック」クラスは、䞻にアプリケヌションサヌバヌやその他のラむブラリにありたす。



UPD コメントは、「厳密な」タむピングに぀いおではなく、「静的」に぀いお話す必芁があるこずを正しく瀺唆したした。 私は定期的に混乱したす。



All Articles