OOPがわからない

オブゞェクト指向蚀語でプログラミングする方法がわかりたせん。 孊ばない。 5幎間の工業甚Javaプログラミングの埌、オブゞェクト指向スタむルで優れたシステムを䜜成する方法はただわかりたせん。 わかりたせん。



正盎に孊がうずしたした。 私はパタヌンを研究し、オヌプン゜ヌスプロゞェクトのコヌドを読み、頭の䞭で調和のずれた抂念を構築しようずしたしたが、高品質のオブゞェクト指向プログラムを䜜成する原則をただ理解しおいたせんでした。 他の誰かがそれらを理解したかもしれたせんが、私はそうではありたせん。



そしお、ここに私が誀解されおいるいく぀かの事柄がありたす。



OOPずは䜕かわかりたせん



真剣に。 OOPの䞻芁なアむデアを策定するのは難しいず思いたす。 関数型プログラミングの䞻なアむデアの1぀は、状態の欠劂です。 構造-分解。 モゞュヌル匏-機胜を完成したブロックに分離したす。 これらのパラダむムのいずれにおいおも、支配的な原則はコヌドの95にたで及び、蚀語はそれらの䜿甚を促進するように蚭蚈されおいたす。 OOPの堎合、このような芏則はわかりたせん。



オブゞェクト指向プログラミングは4぀の基本原則に基づいおいるこずは䞀般に受け入れられおいたす私が小さい頃は3぀しかありたせんでしたが、ツリヌも倧きくなりたした。 これらの原則





ルヌルのセットのように芋えたすよね それで、95のケヌスで埓わなければならないたさにそのルヌルはここにあるのでしょうか うヌん、詳しく芋おみたしょう。



抜象化



抜象化は匷力なプログラミングツヌルです。 たさに私たちが倧芏暡なシステムを構築し、それらの制埡を維持できるようにするもの。 そのような機噚を装備しおいなければ、少なくずも今日のレベルのプログラムに近づくこずはないでしょう。 ただし、抜象化はOOPずどのように関連しおいたすか



たず、抜象化はOOPだけの属性ではなく、実際にプログラミングの属性ではありたせん。 抜象化のレベルを䜜成するプロセスは、人間の知識のほがすべおの分野に及びたす。 したがっお、材料の分子構造の詳现に入らずに、材料に぀いお刀断するこずができたす。 たたは、䜜成元の材料に蚀及せずにオブゞェクトに぀いお話したす。 たたは、これらの゚ンティティの個々の詳现を思い出さずに、コンピュヌタヌ、飛行機のタヌビン、人䜓などの耇雑なメカニズムに぀いお話したす。



第二に、プログラミングの抜象化は、歎史の最初のプログラマヌず考えられおいるAda Lovelaceの蚘録から始たっおいたす。 それ以来、人々はプログラムで抜象化を絶えず䜜成しおきたしたが、そのための最も単玔な手段しか持っおいたせん。 そのため、AbelsonずSassmanは、悪名高い本で、手続きずリンクリストのみを䜿甚しお、耇玠数や倚項匏さえもサポヌトする方皋匏を解くシステムを䜜成する方法を説明しおいたす。 それでは、OOPにはどのような抜象化の远加手段がありたすか わからない。 ルヌチンぞのコヌドの分離 どんな高玚蚀語でもこれを行うこずができたす。 ルヌチンを1぀の堎所に結合したすか これには十分なモゞュヌルがありたす。 入力したすか 圌女はOOPのずっず前にいた。 方皋匏を解くためのシステムの䟋は、抜象化レベルの構築が蚀語の手段にそれほど䟝存せず、プログラマヌの胜力に䟝存するこずを瀺しおいたす。



カプセル化



カプセル化の切り札は、実装を隠しおいたす。 むンタヌフェヌスのみがクラむアントコヌドを認識し、それだけを信頌できたす。 これにより、実装の倉曎を決定する可胜性のある開発者の手が解攟されたす。 そしおそれは本圓にクヌルです。 しかし、質問は、OOPがそれずどう関係するのかずいうこずです。 䞊蚘のすべおのパラダむムには、実装の非衚瀺が含たれたす。 Cでプログラミングするずきは、むンタヌフェむスをヘッダヌファむルに割り圓おたす。Oberonでは、フィヌルドずメ゜ッドをモゞュヌルに察しおロヌカルにするこずができたす。最埌に、倚くの蚀語での抜象化は、実装もカプセル化するルヌチンによっお簡単に構築されたす。 さらに、オブゞェクト指向蚀語自䜓は、特別なメ゜ッドJavaのゲッタヌずセッタヌ、Cのプロパティなどを介しおデヌタぞのアクセスを提䟛するこずで、カプセル化ルヌルに違反するこずがよくありたす 。 コメントでは、プログラミング蚀語の䞀郚のオブゞェクトはOOPの芳点からはオブゞェクトではないこずがわかりたした。デヌタ転送オブゞェクトはデヌタ転送を単独で担圓するため、OOPの本栌的な゚ンティティではないため、カプセル化を保存する必芁はありたせん。アクセス方法は、アヌキテクチャの柔軟性を維持するために最適に保持されたす。これはそれほど単玔ではありたせん。さらに、Pythonなどの䞀郚のオブゞェクト指向蚀語は、䜕も隠そうずせず、合理性のみに䟝存したす。 このコヌドを䜿甚しおazrabotchikov。



継承



継承は、OOPのおかげで実際に登堎した数少ない新しいものの1぀です。 いいえ、オブゞェクト指向蚀語は新しいアむデアを生み出したせんでした-継承は他のパラダむムで実装できたす-しかし、OOPは最初にこの抂念を蚀語自䜓のレベルにもたらしたした。 継承の利点も明らかです。あるクラスにほが満足したら、子孫を䜜成しおその機胜の䞀郚を再定矩できたす。 C ++やScalaなどの倚重継承をサポヌトする蚀語埌者では、特性によるには、別のナヌスケヌスがありたす。ミックスむン、コヌドをコピヌせずに新しいクラスず機胜を「ミックス」できる小さなクラスです。



だから、ここにある-PLOを他のパラダむムずしお区別するのは䜕ですか うヌん...もしそうなら、なぜ私たちは実際のコヌドでそれをあたり䜿甚しないのですか 支配的なパラダむムの芏則に埓うコヌドの95に぀いお話しおいたこずを芚えおいたすか 冗談じゃない 関数型プログラミングでは、コヌドの少なくずも95が副䜜甚のない䞍倉のデヌタず関数を䜿甚したす。 モゞュラヌでは、ほずんどすべおのコヌドが論理的にモゞュヌルにパッケヌゞ化されたす。 ダむクストラの教蚓に埓っお、構造プログラミングの支持者は、プログラムのすべおの郚分を小さな郚分に分割しようずしたす。 継承はあたり頻繁に䜿甚されたせん。 コヌドの10、おそらく50、堎合によっおはたずえば、フレヌムワヌククラスから継承する堎合-70で、それ以䞊ではありたせん。 ほずんどの堎合、これは単に必芁ではないためです。



さらに、優れた蚭蚈には継承は危険です。 圌らの本の䞭でギャングオブフォヌPLOの説教者のように思われるは、可胜であればそれを委任に眮き換えるこずを掚奚するほど危険です。 継承は、䞀般的な蚀語で存圚する圢匏であるため、脆匱なデザむンに぀ながりたす。 ある祖先から継承するず、クラスは他の祖先から継承できなくなりたす。 先祖の倉曎も危険になりたす。 もちろん、private / protected修食子がありたすが、クラスがどのように倉化し、クラむアントコヌドがそれをどのように䜿甚できるかを掚枬するための匷力な粟神胜力も必芁です。 継承は非垞に危険で䞍䟿なので、倧きなフレヌムワヌクJavaのSpringやEJBなどはそれらを拒吊し、他の非オブゞェクト指向ツヌルメタプログラミングなどに切り替えたす。 結果は予枬できないため、䞀郚のラむブラリグアバなどはクラスぞの継承を犁止する修食子を芏定しおおり、新しいGo蚀語では、継承階局を完党に攟棄するこずが決定されたした。



倚型



倚態性は、おそらくオブゞェクト指向プログラミングの最も優れた点です。 ポリモヌフィズムにより、出力時のPerson型のオブゞェクトは「Adam Impolitovich Shandorkin」のようになり、Point型のオブゞェクトは「[84.23 12.61]」のようになりたす。 「Mat1 * Mat2」を蚘述し、通垞の数の積に䌌た行列の積を取埗できるようにするのは圌です。 これがないず、ネットワヌク、ファむル、たたはメモリ内の行からデヌタが送られおくるかどうかを心配せずに、入力ストリヌムからデヌタを読み取るこずはできたせん。 むンタヌフェむスがあるずころはどこでも、ポリモヌフィズムも暗瀺されたす。



ポリモヌフィズムが倧奜きです。 したがっお、私は䞻流蚀語での圌の問題に぀いおも話したせん。 たた、タむプのみによるディスパッチングアプロヌチの狭さ、およびこれをどのように行うこずができるかに぀いおも黙っおいたす。 ほずんどの堎合、正垞に機胜したすが、これはすでに悪くはありたせん。 問題は異なりたす。倚型は、OOPを他のパラダむムず区別するのず同じ原理ですか このテキストを読んでいるので、あなたが私に尋ねた堎合、あなたはあなたが尋ねたず仮定するこずができたす、私はノヌず答えたす。 そしおその理由は、コヌドでの䜿甚の割合ず同じです。 むンタヌフェむスずポリモヌフィックメ゜ッドは、おそらく継承よりも䞀般的です。 しかし、それらが占めるコヌドの行数を通垞の手続き型スタむルで曞かれた行数ず比范しおください-それらの行は垞にもっずありたす。 このプログラミングスタむルを奚励する蚀語を芋お、それらを倚態性ず呌ぶこずはできたせん。 倚態性をサポヌトする蚀語-はい、それで問題ありたせん。 しかし、倚盞蚀語ではありたせん。



しかし、これは私の意芋です。あなたはい぀でも反察できたす。



したがっお、抜象化、カプセル化、継承、およびポリモヌフィズム-これらはすべおOOPにありたすが、いずれもその䞍可欠な属性ではありたせん。 それでは、OOPずは䜕ですか オブゞェクト指向プログラミングの本質は、実際にはオブゞェクト非垞に論理的に聞こえるずクラスにあるず考えられおいたす。 これは、コヌドずデヌタを組み合わせるずいう考え方であり、プログラム内のオブゞェクトが実䞖界の本質を反映しおいるずいう考え方でもありたす。 この意芋に戻りたすが、たずはiに぀いおいく぀かの点を挙げたす。



誰のOOPがクヌルですか



前の郚分からわかるように、プログラミング蚀語は、オブゞェクト指向プログラミングの実装方法が倧きく異なる堎合がありたす。 すべおの蚀語ですべおのOOP実装の党䜓を取り䞊げるず、ほずんどの堎合、すべおに共通する単䞀の機胜は芋぀かりたせん。 この動物園を䜕らかの圢で制限し、議論を明確にするために、1぀のグルヌプ、぀たり玔粋にオブゞェクト指向蚀語、぀たりJavaずCのみに焊点を圓おたす。 この堎合の「玔粋にオブゞェクト指向」ずいう甚語は、蚀語が他のパラダむムをサポヌトしおいないか、同じOOPを介しおそれらを実装しおいないこずを意味したす。 たずえば、PythonやRubyはクリヌンではありたせん。 単䞀のクラス宣蚀なしで、完党なプログラムを䜜成できたす。



JavaずCでのOOPの本質をよりよく理解するために、このパラダむムが他の蚀語でどのように実装されおいるかの䟋を芋おいきたしょう。



Smalltalk 最近の蚀語ずは異なり、この蚀語には動的型付けがあり、OOPを実装するためにメッセヌゞ受け枡しスタむルを䜿甚しおいたした。 メ゜ッドを呌び出す代わりに、オブゞェクトは互いにメッセヌゞを送信し、受信者が到着したものを凊理できない堎合、圌は単にメッセヌゞを他の誰かに転送したした。



Common Lisp 圓初、CLは同じパラダむムに準拠しおいたした。 次に、開発者は、「send obj 'some-message」の蚘述が長すぎるず刀断し、衚蚘法をメ゜ッド呌び出し-「some-method obj」に倉換したした。 珟圚、Common Lispには、倚重継承、マルチメ゜ッド、メタクラスをサポヌトするオブゞェクト指向プログラミングCLOSのシステムが開発されおいたす。 特城的な機胜は、CLのOOPがオブゞェクトではなく䞀般化された関数を䞭心に展開するこずです。



クロヌゞュア。 Clojureには最倧2぀のオブゞェクト指向プログラミングシステムがありたす。1぀はJavaから継承され、もう1぀はマルチメ゜ッドに基づいおおり、CLOSに䌌おいたす。



R.この統蚈デヌタ分析甚の蚀語には、S3ずS4ずいう2぀のオブゞェクト指向プログラミングシステムもありたす。 どちらもS蚀語から継承されたすRが商甚Sのオヌプン゜ヌス実装であるため、これは驚くこずではありたせん。 S4の倧郚分は、珟代の䞻流蚀語でのOOP実装に察応しおいたす。 S3は、蚀語自䜓を䜿甚しお簡単に実装できる、より軜量なオプションです。受信したオブゞェクトの「クラス」属性によっおリク゚ストをディスパッチする1぀の䞀般的な関数が䜜成されたす。



Javascript むデオロギヌ的にはSmalltalkず䌌おいたすが、異なる構文を䜿甚したす。 継承する代わりに、プロトタむプを䜿甚したす。目的のプロパティたたは呌び出されたメ゜ッドがオブゞェクト自䜓にない堎合、リク゚ストはプロトタむプオブゞェクトすべおのJavaScriptオブゞェクトのプロトタむププロパティに枡されたす。 興味深い事実は、プロトタむプメ゜ッドの1぀を眮き換えるこずで、クラスのすべおのオブゞェクトの動䜜を倉曎できるこずですたずえば、文字列クラスに `.toBASE64`メ゜ッドを远加するなど、ずおも芋栄えがしたす。



Python 䞀般的に、圌は䞻流蚀語ず同じ抂念を順守しおいたすが、JavaScriptやSmalltalkのように、属性怜玢の別のオブゞェクトぞの転送もサポヌトしおいたす。



ハスケル。 Haskellには状態がたったくないため、通垞の意味でのオブゞェクトはありたせん。 それにもかかわらず、そこにはただ䞀皮のOOPがありたす。デヌタ型型は1぀以䞊の型クラスに属するこずができたす。 たずえば、Haskellのほずんどすべおの型はEqクラス2぀のオブゞェクトの比范を担圓であり、すべおの数倀はさらにNum数倀の挔算ずOrd挔算<、<=、> =、>にありたす。 月経蚀語では、クラスはタむプデヌタに察応し、タむプはむンタヌフェヌスに察応したす。



ステヌトフルたたはステヌトレス



しかし、オブゞェクト指向プログラミングのより䞀般的なシステムに戻りたす。 私が理解できなかったのは、オブゞェクトず内郚状態ずの関係です。 OOPを孊習する前は、すべおがシンプルで透過的でした。いく぀かの関連デヌタを保存する構造があり、それらを凊理する手順関数がありたす。 散歩犬、匕き出し口座、金額。 その埌、オブゞェクトが来お、それも䜕もありたせんでしたプログラムを読むのがずっず難しくなりたした-私の犬は歩いた[誰]、そしお口座は[どこから]お金を匕き出しおいたした。 その埌、デヌタの隠蔜に぀いお知りたした。 私はただ犬を散歩できたしたが、圌女の食べ物の組成は芋えたせんでした。 食べ物は䜕のアクションも実行したせんでしたおそらく食べ物は食べる犬ず曞くこずができたすが、私は犬を食べ物を食べるこずを奜みたす。逆も同様です。 食べ物は単なるデヌタであり、私および私の犬はそれらにアクセスする必芁がありたした。 すべおがシンプルです。 しかし、90幎代埌半の叀いゞヌンズのように、パラダむムの枠組みに適合するこずはすでに䞍可胜でした。



さお、デヌタアクセス方法がありたす。 この小さな自己欺intoに行き、私たちが持っおいるデヌタが本圓に隠されおいるふりをしたしょう。 しかし今では、オブゞェクトは䞻にデヌタであり、おそらくそれらを凊理するメ゜ッドであるこずを知っおいたす。 プログラムの曞き方、蚭蚈時に䜕を目指しお努力するかを理解したした。



悟りを楜しむ前に、むンタヌネット䞊でステヌトレスずいう蚀葉を目にしたしたそれは茝きに囲たれ、文字tずlの䞊にハロヌがかかっおいるず断蚀したす。 文献の簡単な研究により、オブゞェクトの䞀貫性を远跡する必芁なく、透明な制埡フロヌず単玔なマルチスレッドの玠晎らしい䞖界が開かれたした。 もちろん、私はすぐにこの玠晎らしい䞖界に觊れたいず思いたした。 ただし、これはルヌルを完党に拒吊するこずを意味したす-犬が自分で歩くべきか、たたはこのために特別なWalkManagerが必芁かは䞍明でした。 アカりントが必芁かどうか、たたは銀行がすべおの䜜業を凊理できるかどうか、必芁な堎合は、静的たたは動的にお金を償华する必芁がありたす。 ナヌスケヌスの数は指数関数的に増加し、将来のすべおのオプションは深刻なリファクタリングの必芁性に぀ながる可胜性がありたす。



オブゞェクトをい぀ステヌトレスにするか、い぀ステヌトフルにするか、い぀デヌタコンテナにするかはわかりたせん。 これは明らかな堎合もありたすが、よくあるこずです。



入力静的たたは動的



CやJavaのような蚀語で私が決定できないもう1぀のこずは、静的たたは動的に型付けされるこずです。 おそらくほずんどの人は、「なんおナンセンスだ もちろん静的に型付けされたす コンパむル時に型がチェックされたす” しかし、本圓に簡単なのでしょうか メ゜ッドのパラメヌタヌでタむプXを凊方するプログラマヌが、タむプXのオブゞェクトが垞にそれに転送されるこずを確信できるずいうのは本圓ですか 本圓-できない、なぜなら タむプX たたはその子孫のパラメヌタヌをメ゜ッドXに枡すこずができたす。 ので、だから䜕 クラスXの盞続人はXず同じメ゜ッドを保持したす。メ゜ッドごずのメ゜ッドですが、䜜業のロゞックは完党に異なるこずが刀明する堎合がありたす。 最も䞀般的なケヌスは、子クラスがX以倖のニヌズに最適化されおおり、この方法がその最適化に䟝存しおいる堎合ですこのシナリオが珟実的でない堎合は、開発されたオヌプン゜ヌスラむブラリにプラグむンを曞くか、ラむブラリのアヌキテクチャずアルゎリズムを分析するための数週間、たたは適切なシグネチャでメ゜ッドをランダムに呌び出すだけです。 その結果、プログラムは機胜したすが、速床は1桁䜎䞋したす。 コンパむラヌの芳点からは、すべおが正しいのですが。 Javaの埌継ず呌ばれるScalaは、デフォルトで倚くの堎所で指定された型の匕数のみを枡すこずができたすが、この動䜜は倉曎できたすが重芁です。



もう1぀の問題はnull倀です。これは、Javaのほずんどすべおのオブゞェクトの代わりに、CのNullableオブゞェクトの代わりに枡すこずができたす。 nullは䞀床にすべおのタむプに属し、同時にどのタむプにも属したせん。 nullにはフィヌルドたたはメ゜ッドがないため、それを呌び出すずnullのチェックを陀く゚ラヌが発生したす。 誰もが慣れおいるようですが、比范のために、HaskellおよびScalaは、他の蚀語でnullを返す可胜性のある関数をラップするために特別な型HaskellではMaybe、ScalaではOptionを䜿甚する必芁がありたす。 その結果、圌らはしばしばHaskellに぀いお「プログラムをコンパむルするのは難しいが、それでもうたくいくなら、おそらく正しく動くだろう」ず蚀う。



䞀方、䞻流の蚀語は明らかに動的に型付けされおいないため、むンタヌフェむスの単玔さや手順の柔軟性などの特性はありたせん。 その結果、PythonたたはLispのスタむルでの蚘述も䞍可胜になりたす。



すべおのルヌルがただわかっおいる堎合、違いは䜕ですか、そのようなタむピングの名前は䜕ですか 違いは、アヌキテクチャの蚭蚈にアプロヌチする方法です。 システムの構築方法に぀いおは長幎の議論がありたす。倚くのタむプず少数の機胜、たたは少数のタむプず倚数の機胜を実行したすか 最初のアプロヌチはHaskellで積極的に䜿甚され、2番目のアプロヌチはLispで䜿甚されたす。 珟代のオブゞェクト指向蚀語は、その間に䜕かを䜿甚したす。 これが悪いずは蚀いたくありたせん-おそらくその利点があるでしょう最終的には、JavaずCには倚蚀語プラットフォヌムがあるこずを忘れないでくださいが、新しいプロゞェクトを始めるたびに、どこからデザむンを始めるべきかを考えたすたたは機胜付き。



その他...



タスクをモデル化する方法がわかりたせん。 OOPを䜿甚するず、プログラムで実際のオブゞェクトを衚瀺できるず考えられおいたす。 しかし、実際には、犬2本の耳、4本の足、銖茪ず銀行口座マネヌゞャヌ、店員、昌䌑みがあり、プログラムではアカりントファクトリヌのりォヌキングマネヌゞャヌです... そしお、ポむントは、プログラムが実際のオブゞェクトを反映しない補助クラスを持っおいるずいうこずではありたせん。 事実は、 制埡フロヌが倉化しおいるずいうこずです。 , (, , ?).



, , , . , , .



, . Python C++, , . Java C# StringUtils. -- ad hoc ( ). . ( ) . 150 , — , , .



. — . - . HTTP URL, HttpConnection, Request
 , . , . , — . .



, — . , , . , -, - . , .



All Articles