👻

オブジェクト指向とは

2023/04/16に公開

はじめに

Pythonを勉強するにあたって"クラス"という概念の理解に苦しんだので「オブジェクト指向とは」というところから少しずつ紐解いていく。

「オブジェクト指向」がなぜ必要になったのか

時代的背景

1970年代から1980年代にかけて、高精密ディスプレイやサウンドの実装などPCというものの利用形態も大きく変遷してきた。そんな中で使用されるプログラミング言語も大きく飛躍した違う性格のものにならなければならない、と考えられた。
また、ネットワーク環境の大きな変化により、ムービーやサウンド機能がネットワーク経由で配信され始めたことも大きく、こういった新たな機器をコンピュータで扱う場合には、個々のハードウェアやソフトウェアを意識することなく、「オブジェクト」として統一することでより扱いやすいものとなっていく。
このような考え方から「オブジェクト指向」という考え方が提案され始めたのである。

従来の言語とどう違うのか

例を挙げて考えてみる。
ディスプレイを「オブジェクト」として捉えた場合、
ビット解像度というプロパティ(属性値)、サイズ変更というメソッド(操作)が付随する。(それらだけではないが...)
これを従来の言語で考えたとき、プロパティが変数や定数、メソッドが関数に対応するとよく表現される。
しかし、オブジェクト指向の異なる点として、それぞれが必ず具体的なオブジェクトに関連づけられているのである。つまり、従来では変数や関数はどんな事柄にも使えるものであったが、オブジェクト指向においては必ず"個別のディスプレイ"というオブジェクトに関連づけられた値、操作としてプロパティやメソッドが扱われる。

オブジェクト指向言語を記述するにあたって

オブジェクト指向の考え方と記述について

オブジェクト指向での書式を一般化すると下のような形で表現される。

オブジェクト.メソッド(引数)

この書式を 1+2という演算処理を行うにあたって、「1」というオブジェクトを中心に考えて上の書式に当てはめると、

1.add(2)

というような表現となる。"1"というオブジェクトを中心に、addというメソッドを引数"2"に適用している。...正直かなり分かりにくい。
これくらいの基本演算ならまだしも、条件判断や繰り返し文までもオブジェクト指向に当てはめて記述されていたら可読性がかなり落ちる。
そのため「オブジェクト指向言語」といっても、コードのすべてがオブジェクト指向形式で記述されているわけではないのだ。(正直これがかなりややこしい。)

言語ごとのオブジェクト指向適用の幅

どの程度までオブジェクト指向を徹底するかには言語によって違う。例えばRubyなんかはかなりオブジェクト指向の書式を取り入れられているが、Pythonなんかではあまりオブジェクト指向を感じさせないような設計になっている。
(私は先にC言語を学習していたのでPythonの方が親しみやすかった。が、逆に言えば関数型言語とオブジェクト指向言語の違いを感じられなくて、オブジェクトの理解には時間がかかってしまった。)

2023年4月22日 追記

上の説明だと若干語弊があるので補足。
Pythonにおいては基本演算において、オブジェクト指向の書式が取り入れられてないというのは正しいが、オブジェクト指向自体が取り入れられていないわけではない。
実際にはPython側が基本演算に関するメソッドを隠しているだけで、それが組み込まれているかというだけの違いである。
そのために私たちは、基本演算において可読性が高く理解しやすいコードの記述ができているのだ。

オブジェクト指向の利点

オブジェクト指向はよく「メッセージ交換」としてのイメージが用いられる。
1.add(2)では、1というオブジェクトに対してadd(2)というメッセージを送り、その結果を返事してくれるという構図である。あくまでオブジェクトはメッセージの受け手なのである。
上の例では1というただの数値が受け手であったが、具体的なモノやプログラムを受け手(オブジェクト)として扱えばそれでも成り立つ。例えばDisplayをオブジェクトにしてwidthメソッドを適用したメッセージを送れば、Displayオブジェクトがメッセージに対応した内部処理を行い返信してくれる。
つまりオブジェクト指向では、対象となるものが単なる数値、具体的なもの、あるいはプログラムであっても、処理形式を抽象化し統一的な書式として記述できるのである。これがオブジェクト指向を記述する上での大きな利点と言える。

おわりに

イメージしにくい「オブジェクト指向」に対してかなり捉え方を整理することが出来た。次の記事では概論的な話ではなく、より実用的なクラスやインスタンスについて掘り下げたいと思う。

Discussion