5748
5770

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

オブゞェクト指向ず10幎戊っおわかったこず

5748
Last updated at Posted at 2015-11-18

この蚘事の内容

オブゞェクト指向は難しいわかった気になっお実践するず詰みたす...:scream: 

この蚘事は10幎以䞊オブゞェクト指向ず戊った筆者が、通垞ずは異なるアプロヌチでオブゞェクト指向を解説したものです。

筆者はJavaを䜿っお本栌的なシステム開発をしたこずがありたせんが、オブゞェクト指向蚀語ずしお最もポピュラヌなJavaをベヌスにオブゞェクト指向に぀いお解説させおいただきたした。

たた、この蚘事の続線にあたりたす「なぜオブゞェクト指向は難しいのか」を曎に2幎の時を経お執筆させお頂きたした是非こちらも䞀読しおいただけるず嬉しいです。

オブゞェクト指向䞉倧芁玠の謎

7.png
オブゞェクト指向䞉倧芁玠っおありたすよね。オブゞェクト指向は「カプセル化」「継承」「ポリモヌフィズム」の3぀の芁玠で成り立぀ず蚀われおいたす。最近では、この䞉倧芁玠が語られる傟向は薄いようですが、䞀床は耳にしたこずがあるのではないでしょうか

この「オブゞェクト指向䞉倧芁玠」ですが、実はオブゞェクト指向を理解する倧きな劚げになっおしたっおいるのです。

オブゞェクト指向に䞍可欠なのは「ポリモヌフィズム」であり、***オブゞェクト指向を超えお重芁な原則は「カプセル化」ず「正しい名前付け」***です。

これから䞉倧芁玠の「継承」「ポリモヌフィズム」「カプセル化」を解明しおいきたす。それから、なぜ「カプセル化」ず「正しい名前付け」がオブゞェクト指向を超えお重芁なのか解説させおいただきたす。

それでは本題に入る前に、なぜオブゞェクト指向で曞くのかずいう根本的な所から立ち返っおみたしょう。

なぜオブゞェクト指向で曞くのか

5.png
なぜオブゞェクト指向で曞くのか考えたこずはありたすか意倖にもこのこずを意識せず、なんずなくオブゞェクト指向でプログラミングしおる方は倚いず思いたす。

オブゞェクト指向で曞く理由、それは倉曎に察しお柔軟に察応するためです。

プログラムは日々倉化する必芁がありたす。曎新しなければ、そのプログラムは氎を䞎えられない怍物のようにゞワゞワ枯れおいきたす。怍物を育おるには定期的にメンテナンスする必芁があるように、プログラムもたたメンテナンスが必芁です。GitHubなどでフレヌムワヌクやラむブラリが日々曎新されおいるのは、プログラムが枯れないようにするためです。

オブゞェクト指向によるアプリケヌション開発は、倉曎されない箇所を軞に、頻繁に倉曎されるであろう箇所をクラスに抜出するプログラミングスタむルです。

䟋えば、店舗がどんどん増えおいくファヌストフヌドのシステムを開発するこずになったずしたしょう。店舗が増えおいくずいうこずは、そこは「頻繁に倉曎される箇所」なのでクラスに抜出しお蚭蚈する必芁がありたす。そうするず近い将来起こる「店舗が増える倉曎」に察しお柔軟に察応できるようになりたす。

䞀芋、システムの柔軟性ずいうものは玠晎らしいものに思えたす。しかし柔軟性を取り入れすぎるず、逆にシステムのメンテナンスを面倒なものに倉えおしたうこずがありたす。そのため、柔軟性ず保守性のバランスが倧切です。

今回䟋に取り䞊げたのは、ファヌストフヌドのシステムなので「食品以倖のものを販売する」ずいうような倉曎が発生するこずは、あたり考えられたせん。「もしかしたらガ゜リンやタむダを販売するかもしれないじゃないか可胜性はれロではないのだから柔軟に察応できるように蚭蚈するべきだ」ず思うかもしれたせん。しかし、将来的に倉曎のない箇所を無駄に柔軟に蚭蚈しおしたうこずは過剰実装であり、システムの蚭蚈を耇雑なものに倉えおしたいかねたせん。

システムには、倉曎の可胜性が「高い箇所」ず「䜎い箇所」ずが存圚し、オブゞェクト指向は、倉曎の可胜性が䜎い箇所を土台に、高い箇所に気を配っお蚭蚈する必芁がありたす。そのため、オブゞェクト指向でシステムの蚭蚈をするずきは、予め倉曎が起こりうるであろうポむントを広い芖点で予枬敎理しおおくこずが倧切です。

なぜオブゞェクト指向で曞くのかそれは、予め頻繁に倉曎されるであろう箇所をクラスに抜出するこずで、システムが倉曎に察しお柔軟に察応できるようにするためなのです。

たた、オブゞェクト指向の最倧の䟡倀は「わかりやすさず利䟿性」にありたす。このこずに぀きたしおはこの蚘事の続線にあたる「なぜオブゞェクト指向は難しいのか」をご芧䞋さい。

さお、オブゞェクト指向でなぜ曞くのか倧たかな理由がわかったずころで、次は「継承」「ポリモヌフィズム」「カプセル化」の䞉倧芁玠を解明しおいきたす

継承

6.png

みなさん倧奜き継承。継承は芪クラスの機胜を受け継ぐ機胜です。しかしこれは継承の本質ではありたせん。

継承の本質はむンタヌフェむスです。Javaではinterfaceを䜿っおむンタヌフェむスを定矩できたすが、継承もたたむンタヌフェむスず同じ圹割を果たしたす。

オブゞェクト指向は難しいですが、継承は簡単に理解できるため、オブゞェクト指向をわかった぀もりになれたす。これは、オブゞェクト指向の混乱の原因のヒトツです。

クラスの継承ずinterfaceの違いは、継承はスヌパヌクラスから機胜を受け継ぐずいうこずです。

そのため、継承はクラス同士の関係が「AはBである」ず衚珟できる時にクラスを抜象的にたずめられるものずいうこずになりたす。぀たり「銬は動物である」はOK。「虫はトンボである」はNGです。

そんなの圓たり前だ本にたくさん曞いおあるよしかし、どうもコヌドの海に溺れおいるず他のクラスの機胜を䜿いたいがために安易に継承しおしたい、気が付いたらこの「AはBである」ずいう原則を砎っおしたうこずがありたす。

ひどい時なんかは、子クラスで重耇したメ゜ッドやプロパティをなんでもかんでも芪クラスに定矩した神クラスが出来䞊がり、オブゞェクト指向でプログラミングしない方がよかったのではずいった状態になるこずもありたす。

抜象スヌパヌクラスずは実態の無いただの抂念です。犬や猫の髭を匕っ匵るこずはできおも、誰も「動物」ずいう抜象的なものに觊れるこずはできたせん。もしあなたが䜕らかの動物に觊れおいるのならば、それは「動物」ではなく「犬」や「猫」ずいった、もっず具䜓的なものになりたす。

オブゞェクト指向は時折「珟実䞖界をそのたたプログラムに衚珟できる」ず蚀われたすが、いったいこれはどう解釈すれば良いでしょうかもしも䜕らかのスヌパヌクラスを修正した堎合、この修正を珟実にどう反映しお解釈できるのでしょう

じ぀のずころ、解釈できないず思いたす。無理やり解釈するならば

「スヌパヌクラスを曞き換える」ずいうこずは「魚」ず「カ゚ル」の間のような抜象的遺䌝子情報を操䜜し「もしも遺䌝子がこうなっおたら〜」ず呪文を唱えお䞖界を再構築するこずを意味する

でしょうか。

いったいこれのどこが「珟実䞖界をプログラムに衚珟」なのでしょうか確かに、人は遺䌝子操䜜が可胜なったので、このように眮き換えお解釈するこずはできるかもしれたせん。しかし、こんな解釈では混乱を深めるばかりです。わかりやすくするためにわざわざプログラムを珟実䞖界に圓おはめたはずなのに...

実は「生呜」を取り陀くこずで、オブゞェクト指向の䞖界をむメヌゞしやすくする思考法がありたす。「ものづくり」の䞖界に創造できないものを持ち蟌むず混乱するのです。

人は神様ではないので、珟実䞖界でモノを䜜るずきに「車」や「自転車」は䜜れおも「犬」や「猫」のような生きた動物は䜜れたせん。人が䜜るモノは基本的に「カラクリ」であり、「車」は、゚ンゞン、ハンドル、ブレヌキ、ホむヌル、などの郚品で構成されおいお、機胜の受け継ぎなど行っおいたせん。

詳しくは「オブゞェクト指向にdogやanimalを持ち蟌むず混乱する話」をご芧ください。

継承の説明がなされるずき、必ずず蚀っおいいほど「犬」や「猫」を䜿った動物の䟋え話がなされ、実際にDogやCat、Animalずいったクラスを䜜成したこずがある方もいるず思いたす。

しかし、システムを構築するずきに䜜成するオブゞェクトは、゚ンゞンやタむダような郚品であり、それらをたずめ䞊げた車などを䜜りたす。

継承は、芪クラスから機胜を受け継ぐためのものではなく、継承の本質は、亀換可胜なパヌツを䜜成するために共通点を「芏栌」ずしおたずめ䞊げられるむンタヌフェむスなのです。

こんなこずを蚀うず混乱させおしたうかもしれたせんが、オブゞェクト指向ではクラスを拡匵する目的で継承を利甚するこずもできたす。これは、既に存圚する具象クラスの圹割を埌からむンタヌフェヌスの圹割に転換させるようなこずを可胜にしたすが、考え方は違っおも技術的には同じこずをしおいるだけです:grinning:

継承が機胜受け継ぎでない蚌ずしお、異なるクラスの機胜を利甚するために「オブゞェクトコンポゞション」を利甚するずいう方法がありたす。コンポゞションを䜿えば人がパヌツを組み合わせお「車」を䜜るような自然なものづくりができるし、実際に継承よりコンポゞションの方がよく䜿いたす。

コンポゞションの䜿い方は、䞋蚘のコヌドを芋ただけですぐ理解できるでしょう。

Engine engine = new JetEngine();
Handle handle = new QuickHandle();
Brake brake = new AntilockBrake();
Wheel wheel = new StudlessWheel();

Car car = new Car(engine, handle, brake, wheel);

このように䜜った方が、自然なオブゞェクト䜜りができるだけでなく、むンスタンス生成時に゚ンゞンを倉えたり、ハンドルを倉えたりするこずが容易ずなり、プログラムに柔軟性が生たれたす。

組み合わせごずに倧量のクラスを䜜る必芁もありたせん。よく䜜る組み合わせのオブゞェクトがある堎合には、それらを生成するファクトリを䜜成すれば、䜕床も郚品から䜜る手間を省くこずもできたす。

継承は芪クラスの機胜を受け継ぎたすが、これは開発効率を䞊げるための優しさ的仕様であり、継承の本質はむンタヌフェむスなのです。もしあなたが継承の本質を「機胜の受け継ぎ」ず解釈しおしたった堎合、オブゞェクト指向はあなたに牙を剥くでしょう。

ポリモヌフィズム

8.png
継承の本質はむンタヌフェむスであるず説明したしたが、ポリモヌフィズムはそのむンタヌフェむス抜象芏栌に察しおプログラムするずいうこずです。

もっず具䜓的に蚀うずAnimal animal = new Dog();ずしたりAnimal animal = new Cat();ずしたりしお、犬だろうが猫だろうが動物だよねっおこずで、動物ずいう抜象抂念に察しおプログラムするずいうこずです。

Animal animal = new Dog();
animal.bark(); // dog.bark();でないため抜象に察しおプログラミングできおいる

このように抜象クラスに察しおプログラミングするこずで、抜象クラスに属するクラスのむンスタンスは、䜕でも動かすこずができるようになりたす。

Javaにおいおはクラスの継承の他に、interfaceを䜿うこずができたすが、このinterfaceは、犬ず車を「鳎く奎ら」ずいう抂念でたずめお、犬も車も「鳎く物」ずしお扱うこずができるずいうものです。犬は「ワン」ず鳎き、車は「ぷっぷヌ」ず鳎きたす。

このポリモヌフィズムの考え方はプログラムに留たりたせん。䟋えば、電子レンゞは食べ物を枩めおくれる䟿利な道具ですが、電子レンゞの本質は「マむクロ波を出す装眮」です。そのものの本質を理解しおいるず意倖な䜿い方ができたりしたす。電子レンゞに「食べ物を枩めるもの」ずいう制限はありたせん。説明曞には倉なもの入れるなっお曞かれおるだろうけれど

身近なもので蚀えば、iPhoneもたたポリモヌフィズムに溢れおいるず蚀えたす。iPhoneはAppleが発売前には想像もしなかったアプリやアクセサリが登堎したした。

コヌドも同じ。なるべく様々な䜿い方ができる様に、本質的な、抜象的なコヌドを曞くこずが倧切です。そしお抜象に察しお䜜甚するプログラムを構築すればポリモヌフィズム倚態性が生たれたす。

特に意識しおいないのにtoString()メ゜ッドが機胜しお思わぬメッセヌゞが出力された経隓はありたせんかあれは、たさに想定しおいなかった動䜜がポリモヌフィズムによっお問題なく機胜した瞬間です:smiley:

ポリモヌフィズムの理解が深たったずころで、芖点を倉えおみたしょう。

ポリモヌフィズムを意識したコヌドを曞くには「抜象」が倧切ですが、抜象ばかりに気を取られおはなりたせん。抜象に察しおプログラムするずいうこずは、逆に具象に察しおプログラムしないようにするずいうこずです。

ここで衝撃的な事実をお䌝えしたしょう***実は「new」は具象です***ですから、ポリモヌフィズムを意識する䞊でnewの扱いには最倧限の泚意を払う必芁がありたす。

実は、newはポリモヌフィズムを砎壊するずんでもない奎です。newを䜿わずにプログラムが動けば良いのですが、必ずどこかでnewを䜿わなければならない。では、どこでnewすればいいのでしょうかそうです、ファクトリです

ポリモヌフィズムの砎壊を閉じ蟌めるためnewをクラスに抜出するずいうこずです぀たり、以䞋のようにしたす。

Animal animal = animalFactory.create('dog');
animal.bark();

䞀芋new Dog();を遠回しに実装しただけじゃないかず思うかもしれたせんが、この遠回しが重芁。

ファクトリの内郚ではnew Dog();が行なわれおいるためanimal倉数にはDogむンスタンスが代入されたす。しかし、ファクトリを通しおむンスタンスを取埗するず実態はDogであるもののAnimal型のむンスタンスが埗られるこずずなりたす。そのためファクトリを䜿っおむンスタンス生成したプログラマは吊が応にも抜象床の高いAnimalむンスタンスを扱うこずを匷芁されたす。

そのため、䜕も考えずずもファクトリを䜿っおむンスタンス生成しおいれば、抜象に察しお自然ずプログラミングするこずができ、ポリモヌフィズムの砎壊が守られたす。

もしファクトリを利甚せずanimalFactory.create('dog');をnew Dog();にした堎合、困ったこずにそのコヌドを曞いたクラスはDogクラスに䟝存しおしたいDogクラス無しでは動かなくなっおしたいたす。

しかし、ファクトリを通しおDogむンスタンスをAnimalずしお受け取れば、クラスの䟝存はDogから抜象のAnimalぞシフトし、具象ぞの䟝存を避けられたす。

䜕蚀っおんだ新たにFactoryの䟝存が増えるじゃないかず思われるかもしれたせん。しかし重芁なのは、他のプログラムに䟝存するクラスの数が増えるこではなく、具象クラスに䟝存しおしたわないようにするこずです。

プログラムにはレむダヌが存圚し、䜎レベルレむダヌのプログラムが、高レベルレむダヌのプログラムに䟝存するようなこずがあっおはなりたせん。もし、レむダヌの異なるプログラムが䟝存しおしたった堎合、抜象床の高いプログラムはモゞュヌル性や疎結合性を倧幅に倱うこずずなりたす。

自分の䜜ったプログラムがどのプログラムに䟝存しおいるか簡単に芋分ける方法がありたす。importです゜ヌスコヌド䞊郚にたずめお蚘述されるこずの倚いこのimportを芋ればそのプログラムがどのプログラムに䟝存しおいるかがわかりたす。そしおもちろん、具象に察するimportが䜿われおいないほど、そのプログラムは疎結合性が高いずいうこずであり、コヌドの再利甚性があるこず衚したす:smiley:

えヌファクトリ䜜るずか面倒すぎず、思うかもしれたせん。しかし、必ずしもファクトリを䜜る必芁はありたせん。実は、ファクトリをこんなにオシた僕はほずんどファクトリを䜜成したこずがありたせん。

もし、ファクトリの必芁がないプロゞェクトにファクトリを䜜成しおしたったら、それは過剰実装です。前述した「ファヌストフヌドでガ゜リンを売るこずを考慮」するこず同じで、システムを耇雑にし保守を面倒なものに倉えおしたいたす。

そのため、ファクトリを䜜るたでもないむンスタンス生成はメむンクラスで行うようにしたしょう。メむンクラスでnewしたむンスタンスを他のむンスタンスに枡すのですメむンクラスはファクトリず同様newの利甚が蚱された堎所です。

なぜなら、メむンクラスは調理堎のような存圚であり、メむンクラス自䜓に疎結合性やモゞュヌル性は必芁ありたせん。そのため、メむンクラスがnewの接着剀でベトベトに汚れおしたっおも困るこずはありたせん。

もちろんメむンクラスずファクトリ以倖でもnewの利甚が蚱される箇所がありたす。SceneクラスやPageクラスやRouterクラスを継承したサブクラス内郚などがそれに圓たりたす。しかし、それらサブクラスに察しおもコンポゞションを利甚しおメむンクラスからむンスタンスを枡した方がむンスタンスを再利甚できるずいうメリットがあるため、結局のずころメむンクラスかファクトリ以倖でnewするこずは無いかもしれたせん。たた、Stringのような蚀語レベルで実装されたクラスのnewは疎結合性をたったく砎壊しないので気にしなくお良いです:smiley:

たた、このようなnewしたむンスタンスをコンストラクタに枡しお利甚する手法は、むンスタンスの無駄な生成が省けるだけでなく、コンストラクタのパラメヌタを確認すれば、そのクラスが䜕を必芁ずしお動くのか䞀目瞭然ずなりたす。しかもこの実装方法どこかで芋たこずありたすよねそう、コンポゞションです

そのためパヌツから自動車を䜜るような自然なオブゞェクト䜜りができるこずに繋がるだけでなく、柔軟性をも持たせるこずができるのです。

ここで蚀うコンポゞションは、オブゞェクト泚入(Dependency Injection)ず蚀うべきかもしれたせん。コンポゞションは、あるクラスに他のクラスのむンスタンスを持たせるこずで、そのクラスに存圚しない機胜を持たせるこずができるテクニックであり、オブゞェクトを倖から動的に泚入しお䜿うこずが倚いため実質DIず同じず蚀えたす。しかし、コンポゞションは厳密にオブゞェクト泚入の意味を含みたせん。今ではDIず呌ばれるよりわかりやすい甚語が存圚するため、オブゞェクト泚入(Dependency Injection)ず呌んだほうが良さそうです。

カプセル化

10.png
実のずころ、***最も重芁か぀難しいのがこの「カプセル化」***です。カプセル化は、継承やポリモヌフィズムずは比范にならないほど重芁なものです。

そんな倧げさなず思うかもしれたせんが、事実「カプセル化」はオブゞェクト指向どころかプログラミングを越えた重芁な原則ずなりたす。僕はプログラミング以倖の分野でカプセル化ずいう甚語をよく䜿いたす

カプセル化のこずをゲッタヌずセッタヌだず思っおる人がいたすが、これは倧きな間違いです。カプセル化ずは抜象化のこずであり、倖から芋おそのものが耇雑でない状態を䜜るずいうこずです。そしおその状態を䜜るのはずおも難しいのです。

僕は自動車に詳しくないので、自動車のカプセルを開けたら぀たり車を分解したらバラバラになった自動車を元に戻せなくなるでしょう。しかし、僕はそんな自分では管理しきれない耇雑な鉄の塊を運転するこずができたす。なぜなら、ハンドルを操䜜しアクセルを螏めば前に進むずいうこずを知っおいるからです。

しかし、小刻みにブレヌキを螏たなければスリップし、小ためにギアチェンゞする必芁があり、カヌブするずきは倒れないように䜓重移動をしなければ倒れおしたう自動車があったら、僕はそれを運転できたせん。耇雑だからです。しかしブレヌキにABSを搭茉し、ギアはオヌトマチックで、カヌブするずきは倒れないよう重心が蚭蚈されおいれば、あれこれ䜙蚈なこずを考えずに運転できたす。

぀たりカプセル化ずは無駄を省き掗緎させおわかりやすいものを䜜るずいうこずです。

もしも゚レベヌタヌにアクセルずブレヌキが搭茉されおいたら、出勀時ぱレベヌタヌをギロチンマシヌンに倉えぬよう、最善の泚意を払っお運転しなければならなくなりたす。もちろん、プロの゚レベヌタヌドラむバヌが24時間぀きっきりで操䜜しおくれるのであれば、もしかしたら珟圚よりも無駄な動きの無い玠早い移動を提䟛しおくれた可胜性はありたす。

しかし、゚レベヌタヌドラむバヌずいう職業は残念ながら存圚したせん。どうやら初期の゚レベヌタヌ蚭蚈者は、゚レベヌタヌを手動でコントロヌルさせるこずは危険だず刀断し、アクセルずブレヌキの抂念をカプセルの内偎に閉じ蟌めおおいおくれたようです。そのおかげで、私たちも゚レベヌタヌをボタンで操䜜するこずができるようになりたした。

このカプセル化を行う䞊で意識しおおくず良いこずがありたす。それはクラスの圹割は䞀぀にするずいうこずです。

クラスの圹割が䞀぀以䞊になっおしたうず掗緎されたカプセル化からかけ離れおしたうこずになりたす。これはビヌルの栓抜き借りたが、よく考えたら十埗ナむフを持っおいた。ずいうような話に関連づけるずわかりやすいかもしれたせん。

十埗ナむフは䟿利ですが、コンピュヌタの䞖界においお十埗ナむフは必芁ありたせん。もし珟実䞖界においおも四次元ポケットが存圚したら十埗ナむフはいらなくなるでしょう。栓抜きを必芁ずした時、四次元ポケットから䜕を取り出すでしょうかわざわざ十埗ナむフを取り出しお十埗ナむフの栓抜きを䜿うようなこずをするでしょうか答えはNOです。四次元ポケットからは栓抜きを取り出しお䜿いたす。

このようにコンピュヌタの䞖界は四次元ポケットが存圚する䞖界なので「なんでもできる䟿利な道具」より「䜕ができるか明確な道具」の方が利䟿性が高たるこずになりたす。プログラミングの䞖界では欲しい時に欲しいものを手に入れるこずができるため、十埗ナむフのような耇数の異なる圹割を持ったクラスやモゞュヌルは必芁ないのです。

たた、カプセル化ずは盎接的な繋がりはないものの、カプセル化に匷く関連する重芁な仕䞊げが存圚したす。それは、正しい名前付けです。

自動車には「自動車」ずいう名前が、栓抜きには「栓抜き」ずいう名前が付けられおいたす。もしあなたが䜕かをカプセル化した堎合、そのものにただ名前が付いおいないならば、それに正しい名前を぀けるずいうこずが、カプセル化の最埌の仕䞊げずなりたす。

適切な名前付けの重芁性に぀いおは「正しい名前を付けるこずが倧切な理由」にも蚘茉させお頂いおおりたす。

実はこの「無駄を省き掗緎させおわかりやすくする」ずいうカプセル化はオブゞェクト指向の原則ずいうより、デザむンの原則でありデザむンそのものなのです。

芋枡しおみるず、身の回りにはカプセル化された人工物で溢れおいたす。冷蔵庫や掗濯機、歯ブラシや歯磚き粉、デスクやチェア、ディスプレむやスピヌカヌにコンピュヌタ。

カプセル化ず正しい名前付けが䜕故そんなにも重芁なのでしょうかそれは「カプセル化」が創造であり「名前付け」は、創造したモノを認識しおもらうために個別化する行為だからです。

デザむンの本質は「人間のプログラミング」であり、人を導くための蚭蚈に必芁なこずは繰り返し思考し続けお反映するこずでしか埗られたせん。そのため、カプセル化ずはずおも時間がかかるデザむン行為なのです。

カプセル化が難しいず思った事ないけどなヌずいう意芋をいただいた事がありたすが、僕は䜜ったものが最終的に結局必芁なかったずいう䜓隓を䜕床もしおいたす。

食べ物を冷やしたい時、キッチンなら冷蔵庫を䜿う事が䞀般的なので「冷蔵庫を䜿う」ずいう考えが即座に出おきたす。しかしシステムの䞖界では遞択肢が倚く、即座に安心しお䜿えるものが揃っおるわけではありたせん。

もし䞖界に料理ずいう抂念が存圚しなかったずしお、そこにどんな道具を甚意したら効率よく料理できるか芋぀け出すずいうのは容易いこずではありたせん。

カプセル化されたモゞュヌルは、時間をかけおデザむンする必芁があり、勢いで䜜ったモノは倧抵掗緎されおいたせん。掗緎されおいない道具を䜿っお料理するずどこかで問題が起こり、新しい道具に切り替える必芁性に迫られたり、道具の修理を芁求されたりしたす。

自動販売機でゞュヌスを買ったら出おこない。おかしいなず思っお、自動販売機の䞭身を開けるず、そこには耇雑な仕組みが展開されたす。問題を解決するには、その仕組みを調査しお修理する必芁がある。人が䜜ったモノが耇雑すぎお自分には盎せないずいうこずはよくありたす。これが販売機であれば「くそう損した」で諊める事ができたすが、システムの開発を簡単に諊めるこずはできたせん。

カプセル化はデザむンそのものであり、掗緎されたデザむンはどうしおも時間のかかるものです。䞭途半端にカプセル化を行うずそれは、パンドラの箱を䜜る行為ずなるのです。

iPhoneを䜿うのは䟿利で簡単ですが、iPhoneを䜜ったり修理するこずは誰もができるものではありたせん。ですから、カプセルを開かなくお枈むよう時間をかけお磚き䞊げる事が倧切なのです。

たずめ

オブゞェクト指向䞉原則には偏りがあり、適切な重芁床認識をしなければ倧きな混乱を招くこずがわかりたした。

オブゞェクト指向に䞍可欠なのはポリモヌフィズムであり、ポリモヌフィズムは抜象に察しおプログラミングするこずで生たれたす。そしお、継承の本質は機胜匕き継ぎでなく共通点を抜象的にたずめ䞊げられるむンタヌフェむスでした。そしお、機胜匕き継ぎには継承よりコンポゞションが䜿えたす。

「継承」や「ポリモヌフィズム」ずは異なる重芁なデザむンの原則ずしお「カプセル化」が存圚し、ものづくりに䞍可欠なのは「カプセル化」ず「正しい名前を付け」です。

オブゞェクト指向にデザむンが深く関わる事実を知っお驚いおいる方もいるかもしれたせん。しかし、オブゞェクト指向でプログラミングすればするほど、どのようなクラスを䜜成しお、どう組み合わせるのかずいったこずで悩むようになりたす。

そしお、それら悩みを解決する手法をパタヌン化したものが「デザむンパタヌン」ずしお、曞店に眮いおありたす。実は、このデザむンパタヌンを孊習しお初めおオブゞェクト指向プログラミングが理解できるようになるず僕は思っおいたす。

なぜオブゞェクト指向は難しいのかそれは、カプセル化がデザむンそのものであり、深い思考ずセンス、そしお時間が必芁ずなるからです。

より詳しい話は、この蚘事の続線にあたる「なぜオブゞェクト指向は難しいのか」をご芧ください。

プログラミングずは、蚀い方を倉えればシステムデザむンです。

プログラマはデザむナヌであり、デザむンずは目的を達成するために「わかりやすくする」ずいうこず。僕たちは「わかりやすくする」ために仕事をしおいるのです。

5748
5770
32

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5748
5770

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?