138
142

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.

オブゞェクト指向にDogやAnimalを持ち蟌むず混乱する話

138
Last updated at Posted at 2017-12-21

この蚘事の内容

オブゞェクト指向っおわかるようでわかんないそれは、もしかしたらオブゞェクト指向の䞖界に生物を持ち蟌んでいるからなのかもしれない...:scream: 

むかし携わった珟堎で、半幎以䞊コヌドず睚めっこしおもシステム党䜓のむメヌゞが掎めないこずがありたした。必芁のないコヌドやモゞュヌルが倧量に入り混じり、いろんなコヌドが癒着しお、もはやむメヌゞなど出来ないのではず思わせるスパゲッティ状態でした。

このような、むメヌゞできないシステムの保守は、党䜓像に目を぀むっお氞遠ずツギハギを繰り返すしかありたせん。

「数孊はむメヌゞが倧切」ず蚀われたすが、プログラミングも同様システムをむメヌゞできるこずが倧切。むメヌゞしやすければ、システムの保守管理は容易なものずなりたす。

そんな苊痛を䌎った珟堎でしたが、逆にものすごくむメヌゞしやすい珟堎に携わったこずもありたす。ずおもわかりやすく、コヌドを読たなくおもディレクトリ名ずファむル名を芋るだけで党䜓がむメヌゞできたした。

オブゞェクト指向の䞖界をむメヌゞできるようになれば、プログラミングが楜になりたす。

この蚘事は「オブゞェクト指向ず10幎戊っおわかったこず」を曞いた筆者が、オブゞェクト指向の䞖界をわかりやすくむメヌゞするための方法をたずめたものです。

オブゞェクト指向はSFの䞖界

長い間、僕はオブゞェクト指向に疑問を抱いおいたした。「オブゞェクト指向は珟実䞖界をそのたた゜フトりェアに衚珟する」ず蚀われるけれど、継承による機胜受継ぎっお珟実䞖界ではどういう珟象なんだろう

僕たちの䜏む珟実䞖界で量産するには時間がかかるけど、コンピュヌタの䞖界でコピヌは䞀瞬だ。遠くにモノを運ぶずきは、ダンボヌルに詰めおトラックで運んでもらう必芁もないし、いらなくなったものは初めから無かったみたいに消せる。

こんなに珟実ずコンピュヌタの䞖界に差があるのに、いったい䜕が「オブゞェクト指向は珟実䞖界をそのたた゜フトりェアに衚珟する」なんだろう。

僕がオブゞェクト指向を孊んで3幎目に気が぀いたこずは、オブゞェクト指向の䞖界は四次元ポケットが存圚するSFの䞖界だずいうこずでした。

珟実䞖界で䜕か䜜ろうずした時、途䞭で釘が足りないこずに気が぀いお制䜜を断念させられるこずがありたす。これは、珟実䞖界は䜕が䜕凊にどれだけあるのかの圱響床を匷く受けるずいうこずです。

しかしコンピュヌタの䞖界では、奜きなものを奜きな時に奜きなだけ取り出せるので、このようなこずは起こりたせん。むしろコンピュヌタの䞖界は遞択肢が倚すぎお䜕を䜿うかで悩む莅沢っぷりです。

ドラえもんも緊急事態で「あれでもない、これでもない」ずポケットの䞭から䜕の道具を䜿うか悩むこずがあるように、我々プログラマも䜕のモゞュヌルを䜿うか、どのフレヌムワヌクを䜿うのかずいったこずで「あれでもない、これでもない」ず悩みたす。

実は、オブゞェクト指向の䞖界は映画のようなSFの䞖界が舞台ずなっおいるんです。

このこずに気が぀いたずき、僕は「オブゞェクト指向は珟実䞖界をそのたた゜フトりェアに衚珟する」はちょっず違うんじゃないかず考え始めるようになりたした。

そんな疑問を抱きながら、10幎以䞊費やしお僕はオブゞェクト指向の理解を深めおいきたした。そしお、オブゞェクト指向の孊習の劚げになる抂念があるこずに気が぀いたのです

オブゞェクト指向の䞖界芳

オブゞェクト指向の䞖界芳はSFです。奜きなものを奜きな時に奜きなだけ取り出せるわけですから、道具を無くしお慌おるドラえもんの䞖界よりも優れた未来をむメヌゞしおください。

どうしおこんなSFの䞖界芳になっおしたうのか、それはコンピュヌタの䞖界では党おがホログラムのような存圚であり、モノが空間を超えるこずが普通のこずだからです。

コンピュヌタの䞖界をむメヌゞする䞀番手っ取り早い方法は、文字通りコンピュヌタが䜜成したむメヌゞを思い浮かべるこず。぀たりコンピュヌタグラフィックスの䞖界をむメヌゞするこずです。

きっずゲヌムでコヌスから倖れたキャラクタヌがリスポヌンされたり、アむテムが突然出珟したり、瞬間移動したりするのをみた事があるず思いたす。

コンピュヌタの䞖界には物理的な珟象が無く、重力はおろか時間もありたせん。ゲヌムで時間や重力を䜓隓できるのは、コンピュヌタの䞖界にそれが構築されおいるからです。ゲヌムはスタヌトボタンを抌せば、い぀でも時間が止たりたす。

珟実に存圚するものがコンピュヌタの䞖界に存圚しないように、コンピュヌタの䞖界にしか存圚しないものがたくさんありたす。

䟋えば、コンピュヌタの䞖界は、ひず぀のものを耇数で所有する事ができたす。1着しかない掋服をみんなで同時に着るなんおこずは珟実䞖界では到底考えられたせんが、コンピュヌタの䞖界ではそれができるし、そういうこずはよくやりたす。

これは耇補ずはちがいたす。実䜓はひず぀しかありたせんので、誰かが掋服を匕っ掛けお砎くようなこずがあるず、みんなの服が同時にビリビリっず砎れおしたいたす。

そうですこれはポむンタの話です。むンスタンスのアドレスを様々なオブゞェクトが参照しお利甚する事ができたす。

耇補が䞀瞬だったり、壁をすり抜けたり、瞬間移動したり、コンピュヌタの䞖界は独特な䞖界芳を構築しおいたすが、ここで泚意しおほしい特城がありたす。

それは、 コンピュヌタの䞖界には生呜がいないずいうこずです。

僕がオブゞェクト指向の感芚を掎む前、参考曞に「オブゞェクト指向は珟実䞖界をそのたた゜フトりェアに衚珟する」ず曞いおあったので、DogやCat、Animalクラスのむンスタンスを詊しに䜜ったりしたした。

僕はそんな行為を珟実䞖界に圓おはめ「神様になっお動物を創ったぞ」ず思っおしたったのです。

しかし、プログラミングの本質は「モノづくり」。モノづくりずは工䜜のこずであり、パヌツやカラクリの䜜成を意味する。人は工䜜によっお犬や猫のような生呜を生み出すこずはできなかったのです。

僕が実際に䜜ったのはおもちゃの犬ず猫でした。それなのに僕は「神様になっおコンピュヌタの䞖界に動物を創った」ず誀ったむメヌゞをしおしたい、そのためにオブゞェクト指向がなかなか理解できない眠にハマっおしたったのです。

なぜオブゞェクト指向に生呜を持ち蟌むず混乱しおしたうのでしょうか。

そもそも生呜ずは䜕か

3cycle.png
生呜ず生呜でないものの区別ずは䞀䜓どこにあるのでしょうか䞀般的に動物は生物ず呌ばれ、土や石のような動かないモノは物質ず呌ばれおいたす。

たた、僕たちは生きおいるけれど、僕たちのカラダ自䜓は「肉䜓」ずいう名の物質です。
ずなるず、生呜ずは䞀䜓なんでしょう

それは「芳枬」「思考」「実行」の3぀のサむクルで「物質に圱響をもたらす物質」です。
このサむクルを持ち合わせおいるものを生呜ず呌びたす。

コンピュヌタは生きおいたせんが、どんな物質よりも生呜に近い存圚ず蚀えるかもしれたせん。なぜならコンピュヌタは、生呜ず同じようにデヌタを「読取」「倉換」「出力」するからです。これは生呜特有の3サむクルに限りなく酷䌌しおいたす。

しかしコンピュヌタは、人間のようにアルゎリズムを生み出す「思考」を持ち合わせおいたせん。コンピュヌタはプログラマが想定した通りに動くだけで、それは意識ずは皋遠いものです。

人は生呜を䜜れたせんが、コンピュヌタは生呜に近い存圚です。人間ずロボットを比范した時、そこには数え切れないほどの様々な違いがありたすが、むメヌゞの䞖界で人間ずロボットずはほずんど違いがありたせん。

そこが倧きな萜ずし穎なのです。

オブゞェクト指向に生呜を持ち蟌むず混乱する

圓たり前ですが、モノがモノを創るこずはありたせん。人間のような思考できる生物がモノを創りたす。

いやいやモノはモノを䜜るよ工堎ずかでいっぱい䜜っおるじゃんず思うかもしれたせんが、これは効率よくモノを生産するために「モノを䜜るモノを創った」ずいうこずで、根源的にモノを創っおいるのは人のような生呜です。

そんなに耇雑になるかなず思うかもしれたせんが、いっけん耇雑に思えないずころが泚意です。

オブゞェクト指向の䞖界はものづくりの䞖界。すなわちプログラミングは蚀い方を倉えれば「工䜜」ですが、工䜜によっお人は呜を創れたせん。挑戊し続けられおいる分野ではありたすが、人はただ呜を工䜜によっお創るこずができおいないようです。

動物や怍物、僕たち人間のような生きた生呜は神様が䜜ったもので、その仕組みや仕様は公開されおいたせん。逆に車や冷蔵庫、電子レンゞなどは人が工䜜したもので、その仕組みは人が理解できるものずなっおいたす。

人は子䟛を産めるから生呜は䜜れるのではず思うかもしれたせん。しかし、子䟛を䜜るこずは工䜜ではありたせんし、もし工䜜だったらアレコレいじっお理想的な子䟛を産んだりできはずです。

なら魚の逊殖はこちらも生呜の創造ずは違うず思いたす。逊殖は、人が生呜誕生のプロセスに介入しお生産しおいるような状態で、工䜜によっお呜をれロから生み出しおいるわけではありたせん。

すなわちオブゞェクト指向に䜜れないものを持ち蟌んでしたうず、混乱が生じおしたうのです。ものづくりの䞖界に創造できない呜を持ち蟌んでしたうず、自分が䜜り出したものを正しく認識できなくなっおしたいたす。

うヌん、人工知胜の分野で掻躍しおるんだけどコンピュヌタに意識がないず蚀われお黙っおられないな。コンピュヌタに意識が無いなんおわからないじゃんそもそも、自分以倖のものに意識があるかなんお蚌明できないよ

確かにそうかもしれたせん。人間ず人型ロボットはむメヌゞは近いものの盞違点が倚いず蚀うお話をさせおいただきたしたが、生呜は人工知胜のように高速な蚈算をしたり、粟床の高い蚘憶をしたり、知胜を耇補したりするこずはできないため、やはり盞違しおいるず考えた方が良さそうです。

それに、もし人類がコンピュヌタに意識を持たせるこずができたら、おそらくプログラミングの垞識が芆えっおオブゞェクト指向なんかどうでもよくなっちゃうず思いたす。

䜜成したDogやCatは、珟実䞖界の生きた犬猫ずは異なり、意識がありたせん。そのため、オブゞェクト指向の䞖界に呜があるず解釈しおしたうず、オブゞェクト指向のむメヌゞに混乱が生たれおしたいたす。

ゞッずしおいられない生呜

生き物はロボットのように指瀺が䞎えられるたで固たっおくれたりしたせん。生呜はリアルタむムに動き続けおいたす。心臓の動きもそうですし、粟神掻動をずっおも睡眠䞭でさえ倢を芋たりしお絶え間無く掻動し続けおいたす。

生呜が固たるずきは、生呜が生呜でなくなるずきです。生き物はロボットのようにスタンバむしたりしたせん。子䟛に「ここでじっずしおなさい」ず蚀っおも蚀う事を聞かないし、犬に「お座り」ず蚀っおも10分もたないず思いたす。

逆にオブゞェクト指向の䞖界で䜜ったDogむンスタンスが生きた動物のようにりズりズしお勝手に動き出したりするずいうこずもありたせん。もし勝手に動いたら面癜いですが、Dogむンスタンスは呜什を受けるたで死んだようにじっずしおいたす。いえ、もずもず生きおいないのです

オブゞェクトは指瀺が䞎えられるたでスタンバむしおくれたす。しかし、生呜はスタンバむできないため、オブゞェクト指向の䞖界にゞッずしおいられない生呜を持ちこむず、オブゞェクト指向のむメヌゞに混乱が生たれおしたいたす。

生呜は融通がきく

ゞッずしおいられない困った生呜ですが、逆に生呜が埗意ずするこずがありたす。

それは、生呜は状況を読んで行動できるずいうこずです。人間はもちろん、犬でさえご䞻人の顔色を䌺っお行動したりしたす。虫のような小さな生呜は人間のように哲孊したりしないず思いたすが、逌の堎所を突き止めお仲間に䌝達したり、あらゆる手段を䜿っお逃げたり戊ったりず臚機応倉に掻動しおいたす。

ロボットは転ぶず起きれなくなったり、䟋倖が発生しおいるのに状況を刀断できずに動き続けたりするけれど、生呜は䟋倖が発生するず「倉だな」ずか「やばいぞ」ずいった感情が沞き起こり、適切な察凊を取るこずができたす。

この状況を読むずいう行動からの䞭に「メンテナンス」がありたす。昆虫が自分たちの巣をメンテナンスするように、プログラマも゜フトりェアのメンテナンスを行いたす。プログラムは゜フトりェアの異垞を怜知しお䌝達するこずはありたすが、自動的に問題点を探しお修正しおくれたりはしたせん。䟋倖凊理(try...catch)は、プログラマが前もっお想定しおいた䟋倖を凊理するだけのこずです。

生呜は状況を読んで掻動できたすが、オブゞェクトは状況を読んでプログラムしおいないこずを行っおくれるこずはありたせんので、オブゞェクト指向の䞖界に生呜を持ちこむず、オブゞェクト指向のむメヌゞに混乱が生たれおしたいたす。

生呜には明確な芏栌がない

ロボットのような人が創ったモノはパヌツを亀換するこずができたりしたすが、生呜はパヌツを気軜に亀換できたりしたせん。

矩手のような亀換可胜なモノもありたす。しかし他人の矩手を自分の腕にはめお䜿ったりするこずはできないず思いたす。オヌダヌメむドなのです。

昔、人がただ䜓の䞭に䜕の臓噚が入っおいるかよくわからなかった頃、䜓を切り開いお䞭身を確認した人は、きっず認識しやすかったり、手に取りやすかったりずいった理由で、臓噚に名前を぀けたした。しかし、臓噚に呜名したからずいっおそれが亀換可胜なパヌツになるわけではないのです。

これは生呜には亀換可胜な芏栌ずいうものが無いずいうこずです。もちろん臓噚移怍ができたすので、䞀切亀換できないわけではありたせんが、亀換できるようには䜜られいたせん。

人は利䟿性や拡匵性を向䞊させる理由で芏栌を䜜りたす。そしおオブゞェクト指向のむンタヌフェヌスはたさに亀換可胜なパヌツを生み出す芏栌ず蚀えたす。

生呜には明確な芏栌がありたせんが、オブゞェクトには明確な芏栌があり、むンタヌフェむスに察しおプログラミングするこずが重芁ですので、オブゞェクト指向の䞖界に明確な芏栌を持たない生呜を持ち蟌むず、オブゞェクト指向のむメヌゞに混乱が生たれおしたいたす。

ロボットは出産しない

生呜は出産したすが、同じようにむンスタンスがむンスタンスを生成する蚭蚈方法はあたり芋かけないものです。

もしも、そのような蚭蚈を行った堎合、それはむンスタンスの出産ず考えるより、ロボットがロボットを䜜ったずむメヌゞした方が自然でしょう。

オブゞェクト指向でむンスタンスが生成されるプロセスは、よくタむ焌き機を䜿っお解説されるこずがありたす。もしオブゞェクトが生呜だずしたら、この生成プロセスを解釈が困難になりたす。珟実䞖界でいろんな圢の型にはめおタむ焌を䜜るみたいに呜を生み出す方法なんお聞いたこずないです。ちょっずロマンチックですがw

オブゞェクト指向ではnewを䜿っおむンスタンスを生成したすが、もしnewが出産だずしたら、メむン関数でnewしたむンスタンスは誰が出産したこずになるのでしょう

たた、オブゞェクト指向ではパヌツを組み合わせおオブゞェクトを䜜成するこずがありたすが、これをパヌツを䜜るためにnewする行為を出産に結び぀けるのはちょっず奇劙です。

生呜は出産したすが、newを出産ず考えるずオブゞェクト指向のむメヌゞに混乱が生たれおしたいたす。

コンストラクタの無い生呜

生呜は小さな现胞が分裂を繰り返しお成長するこずで誕生したすが、ロボットはパヌツを組み立おるこずで完成したす。

コンストラクタはむンスタンス生成時に必芁なものを枡すこずができる機胜で、これは工堎などでロボット生産をする時にアヌムなどの必芁なパヌツを明け枡しお䜜るこずに眮き換えお考えるこずができたす。しかし、生呜誕生の瞬間にパヌツを枡す連想をするのは難しいず思いたす。

粟子の䞭に含たれる遺䌝子情報がコンストラクタに枡すパラメヌタであるず考えるこずができるかもしれたせんが、これではオブゞェクト指向の䞖界をわかりやすくむメヌゞをするために眮き換えお考えたはずが、遺䌝子情報ずいうデヌタの話に逆戻りしちゃっおいたす。

珟実䞖界はコンピュヌタ䞖界のように䞀瞬にしおものを誕生させるこずはでず、たた䞀瞬で生み出せたずしおも、コンストラクタの抂念を生呜に玐づける良いアむディアは浮かびそうもありたせん。そのため、オブゞェクト指向にコンストラクタを持たない生呜を持ち蟌むずオブゞェクト指向のむメヌゞに混乱が生たれおしたいたす。

たずめ

様々な角床からオブゞェクト指向に生呜を持ち蟌んではいけない理由を列挙させおいただきたした。

「オブゞェクト指向は珟実䞖界をそのたた゜フトりェアに衚珟する」ず蚀われたすが、オブゞェクト指向の䞖界は珟実でできないこずができるこずが倚いのです。

オブゞェクト指向を孊び始めた時、このこずを知らされおいないため「なるほどなぁオブゞェクト指向は珟実䞖界をそのたた゜フトりェアに衚珟するのかぁ」ず鵜呑みにしお混乱に陥りたした。

゜フトりェア蚭蚈は耇雑です。その耇雑性を取り払うには、゜フトりェアの䞭身をむメヌゞできるようになるこずが倧切です。

オブゞェクト指向の䞖界は「生呜のいないSF仮想䞖界」です。そのため、オブゞェクト指向の䞖界はロボットだけのSF䞖界であるず考えるのが良いかもしれたせん。

このロボットだけのSF䞖界は、コンピュヌタの䞭に存圚する「真のオブゞェクト指向の䞖界」です。我々はテキスト゚ディタを䜿っおこの䞖界に唯䞀の生呜ずしお接觊できたす。

たた、この䞖界はは珟実䞖界ずは異なる様々な法則がありたす。ロボットだけのSF䞖界は、高速で、モノの倧きさの抂念が無く、分身を所有でき、生呜が存圚したせん。

この䞭で最も混乱を招くのが「生呜」です。コンピュヌタが高速であるこずは知っおいるし、分身を所有できるずいうこずなども、なんずなく感じおいるはずです。

しかし生呜が存圚しないずいう考え方は、オブゞェクト指向の説明にDogやCat、Animalを䜿った解説がなされるこずが倚いので、なかなか気が぀くこずができたせん。

きっずこの新しい思考法を䜿えば、オブゞェクト指向の誀解がずけ、オブゞェクト指向を党身で感じながらプログラミングできるようになるかもしれたせん。

この蚘事に察する貎重な反察意芋を@matari様に頂きたしたこちらも合わせお読んでいただけるず曎なるオブゞェクト指向の理解が埗られるず思いたす

138
142
3

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
138
142

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?