ニコニコ大百科モバイル

7/2(月)よりスマホまたはPCでアクセスした場合、各デバイス向けのサイトへ自動で転送致します


オブジェクト指向


ヨミ: オブジェクトシコウ
掲示板をミル!
74カキコ!

オブジェクト指向(object oriented)とは、1980年代以降ずっと流を占めているプログラミングパラダイムである。


概要


オブジェクト指向とは、手続きをオブジェクト(対)を単位として考えることによって、「対を(が)〜する」という人間の思考に近い形でプログラミングしようとするプログラミングパラダイムである。

C言語を代表格とする手続き型言語の欠点を修正するような形で1980年代に普及した。C++はその普及のさきがけであるが元祖ではない。普及以降、関数型プログラミングからは異論があるかもしれないが、2021年現在においても流のプログラミングパラダイムである。


クラス


オブジェクト指向プログラミングで中核をなすの型理論に基づくクラス概念である。オブジェクト指向の三大要素とされるカプセル化・継承・多態性クラスの性質に関するものである。

クラスオブジェクトが保持するデータ構造とそれに対する操作をまとめたもので、共通する性質を持つオブジェクトをひとまとめにする働きがあるのだが、話すと長くなるので詳しく知りたい人向けには後述することにする。

細かいことを言えば、クラス構造をプログラム実行時に変更できない言(クラスベース)と、変更を行える言(プロトタイプベース)が存在するが、プログラミング初級者までは気にしなくてよい。中には、クラスというものを排除してオブジェクト指向を実現した言(SelfLENSなど)も存在するが、プログラミング言語マニアでもない限り忘れてよい


明確な定義はない?


オブジェクト指向は流かつ人気プログラミングパラダイムであり、大抵の実用的プログラミング言語で採用され、各種解説書で推奨されている。

しかし、実際にはオブジェクト指向はプログラミング言語毎、さらには解説者毎にアレンジを受けており、言・解説者によって意味するところは異なっている。つまり、オリジナルとされる定義や上記三大要素のように一定の支持を得ている定義もあるにはあるが、オブジェクト指向に決定的な定義はないとも言える。

だが確固とした定義がないがゆえに、「はっきりわからないけど、従えば万事うまくいくものがオブジェクト指向のはず」
といった逆転的論理によって、オブジェクト指向を格化してしまってはいないだろうか。

大きな傾向は一致していても詳細な定義が人それぞれである以上、うまく行く場合と行かない場合があるのは当然のことであり、「オブジェクト指向ならうまくいくはずだから、うまくいかないのは自分がオブジェクト指向を理解できていないせいだ」といった卑屈な思考にとらわれる必要はない。

あくまでうまくプログラミングするための手段なのだから、オブジェクト指向を的化せず、自分の信じるオブジェクト指向でうまく行かない時に、立ち止まって他の考え方に視野を広げればよいだけの話である。要は動けばいいのだ。


関連項目




もっと具体的に知りたい人向け


以下ではプログラミング未経験者でも読めるように、出来るだけ特定プログラミング言語依存しない記述を試みるが、長いので下記を参考に希望レベルまで読み進めること。


免責事項



詳細


あなた(プログラマー)が動物園の飼育員(コンピューター)の監督に就任したとしよう。あなたは飼育員に対して飼育マニュアル(プログラム)を通じて示することしか出来ず、自ら動物と触れ合うことは出来ない。

説明のための例示であり、実在動物園・飼育員・監督動物等及びその動作とは一切関係ない。異論は認めない


Before


この動物園にはA, B, Cという名前の3頭の虎がいる。

あなたは思考を放棄してすべての手順(手続き)を逐一書き出すことにした。


飼育員の業務


虎Aに対し10kgを用意する。
虎A用の10kgを1kgごとに切り分ける。
虎Aの檻に切り分けたを置いてくる。
虎Aは満になる。
虎Bに対し10kgを用意する。
虎B用の10kgを1kgごとに切り分ける。
虎Bの檻に切り分けたを置いてくる。
虎Bは満になる。
虎Cに対し10kgを用意する。
虎用の10kgを1kgごとに切り分ける。
虎Cの檻に切り分けたを置いてくる。
虎Cは満になる。

上記でもゲシュタルト崩壊して十分読みづらいが、さらに虎の数が増えた時に収拾がつかなくなるのは、想像に難くない。読みづらいと間違いにも気づきにくくなる。「虎C」と書くところを「虎」としてしまっていることに初見で気づいた人はどれくらいいただろうか。


After


オブジェクト指向を導入すると、上記のマニュアルは以下のようになる。



虎は空腹になったり満になったりする。


餌のやり方


虎に対し10kgを用意する。
虎用の10kgを1kgごとに切り分ける。
虎の檻に切り分けたを置いてくる。
虎は満になる。


飼育員の業務


虎A, B, Cに餌をやる。

なんということでしょう

業務内容をA, B, Cという対(object)を単位として整理するという方針に従えば(oriented)、A, B, Cは「虎」に分類(classify)されてひと括りに扱うことができるようになり、 飼育員のすることは変わっていないのにマニュアルの見通しが良くなったのである。

これなら虎の数が少々増えても読みづらくはならない。また、現実監督が飼育員に示する時もBeforeよりAfterのやり方になるであろうことから、より人間の考え方に近づいているということもおわかりいただけただろうか


用語解説


オブジェクトについて

オブジェクトには「対」以外に「物体」という訳もあるが、スレッドHTTP接続、果ては関数など形のないものまでオブジェクト(対)化できるので、オブジェクト = 物体 という考え方に囚われるとよろしくない。

さらに厳密に言うと、オブジェクトは対の状態を記録したプロパティを束ねたデータ集合体であり対そのものではない。冷静に考えれば虎「A, B, C」は、それぞれにつけられた名前であって虎そのものではないのだから当然なのであるが、これを忘れると後で虎が異次元間に消えたり、何もないところから突然現れたりすることになる。


利点



柔軟性


後から虎の餌用のを1kgではなく0.5kgごとに切り分けなければならないことが判明したとしよう。オブジェクト指向導入前であれば虎A, B, Cのそれぞれについて全3ヶ所の変更が必要であったが、オブジェクト指向導入後であれば「餌のやり方」の項を1ヶ所変更するだけで済む。

虎Dが増えたとしても、オブジェクト指向なら「虎A, B, C」を「虎A, B, C, D」とするだけである。

このようにオブジェクト指向が導入されれば状況の変更にも柔軟に対応できるようになるのである。


部品化


例えば上記の「虎」の章の部分の執筆を部下に任せることができる(部下がいるほど偉ければだが)

一旦任せてしまえば、たとえば先述のの切り分け単位が変わったケースでもあなた自身が対応をする必要はない。

また、任された部下が、虎のプロパティ空腹か満かを記録する代わりに、その日に食べたの量を記録して、10kgに満たなければ空腹であると判断するようにしても、あなた自身はそれを気にする必要はない。

このように、内部実装を外部から見えないようにする(見なくて良いようにする)ことを、クラスカプセルに見立ててカプセル化とか実装の隠蔽などと呼ぶ。

カプセル化により、あなた自身は「虎」の細かいことは気にせずに「飼育員の業務」の章の執筆に専念することができる。また、「虎」の章だけを部品のように「動物園」から持ち出して、「サーカス」や「アフリカ動物保護施設」のような別の施設で使ってマニュアル執筆の手間を大幅に省くこともではない。


共通化


虎DではなくサイE, Fが増えたとしよう。以下のような対応が可である。


動物


動物空腹になったり満になったりする。


餌のやり方


動物に対し餌を用意する。
動物の檻に用意した餌を置いてくる。
動物は満になる。



虎は動物である。


餌の用意


虎に対し10kgを用意する。
虎用の10kgを1kgごとに切り分ける。


サイ


サイ動物である。


餌の用意


サイに対しを10kg用意する。(切り分けなくて良い)


飼育員の業務


A, B, Cは虎である。
E, Fはサイである。

動物A, B, C, E, Fに餌をやる。

「虎」と「サイ」の共通点である「動物」という性質(分類)を記述することにより、虎とサイについては相違点である餌の用意方法だけを記述すれば済むようになっている。そして、餌をやる時も「虎」と「サイ」について別々に記述せず「動物」とひと括りにして餌をやることができるのだ。

「虎」と「サイ」よりも「動物」の方が抽的なので、抽化と呼ぶこともある。実際のプログラミングでは「動物」のような分類ではなく、「餌を食べるもの」「歩くもの」のような抽化を行うことも多い。


用語解説2


リスコフの置換原則

サブクラスインスタンスは必ずスーパークラスの性質を備えているべきであり、スーパークラスインスタンスと置き換えて使用することができるという「継承」の原則論。

上記でいうなら「動物X」と書かれているところがあれば、「虎A」や「サイF」で置き換えてもマニュアルとして意味不明や実施不可能にならないということ。

これを満たさない継承はおそらくまともに動作しないのでやってはならない。


難点


プログラミングミスの話をしよう。


次へ»
最終更新日: 21/05/04 18:02
タグ検索 パソコン版を見る


[0]TOP
ニコニコ動画モバイル
運営元:ドワンゴ