数ヶ月掛けてちょこっとずつ、読み進めている本(後述)がありまして、その中で「オブジェクト指向」について説明があります。
正直まだ「ちょっと何言ってるかよく分からない」状態の部分だらけではあるのですが、現時点で本を読んで分かっていること・私の解釈を、整理しながらここに記録しておくことにします。
オブジェクト指向とは?
手続き型プログラミングと、その問題
現代のプログラム界では、以下3つのパラダイム(スタイル、手法)がある。
- 手続き型プログラミング
- 関数型プログラミング
- オブジェクト指向プログラミング
手続き型プログラミングは、「アレをやって、次はコレをやって…」という連続した手続きを行うことで、順番にほしい結果に導く。
これはこれで、小さいプログラムには有効な手段。
しかし、手続き型プログラミングには「グローバル」なスコープ*1の問題がある。
大きいプログラムになると、「複数の手続き(≒関数)にまたがって同じデータを扱う」必要が出てくることがあり、そんな時にグローバルな変数は役に立つ。
ところが、機能を追加するにつれてプログラムが複雑化し、グローバル変数も増える。
やがて、いくつもの関数がグローバル変数を読み書きするようになると、変数のコントロールが難しくなっていく。
一方ではインクリメントに使っているのに、他方ではデクリメントに使っていたりなど、1つのグローバル変数に対し複数の関数が操作することで、制作者の意図しない動作が発生してしまったりする。
このように、手続き型プログラミングでは、グローバルな変数の扱いが難しくなることがある。
グローバル変数の多用を避けることでエラーを減らすことも出来るが、「関数型プログラミング」や「オブジェクト指向プログラミング」では、「処理や変数をローカルに閉じ込める」アプローチを取ることで、この問題の解決を目指す。
今回は、後者の「オブジェクト指向プログラミング」を扱う。
オブジェクト指向の目的
「オブジェクト指向プログラミング」は、「オブジェクト」に状態(=変数の値)を持たせることで、グローバルなステートメントを排除する*2。
「状態」はオブジェクトの内部で操作することにして、オブジェクトの外(メインの処理など)からは操作させない。
コレを基本とする。
これによるメリット・デメリットは、本書より引用する。
オブジェクト指向プログラミングの利点は、コードの再利用が促進されて、開発や保守にかかるトータルの時間が短縮されることです。さらに、解決したい問題を分割して扱うことが推奨されるため、保守しやすいコードになります。オブジェクト指向プログラミングの欠点は、プログラムを書く前の計画や設計などに、より多くの労力をかける必要があることです。
出典:http://a.co/1sj1P6I
将来的に効率化出来る代わりに、前もってじっくりしっかり設計しておく必要がある、と。
オブジェクトは「クラス」で表現する
「オブジェクト」について定義・分類する仕組みのことを「クラス」、クラスを呼び出す側のプログラムを「クライアント」と呼ぶ。
共通した特徴(=属性、プロパティ)を、クラスを使って定義し、属性の値の違いで個々のインスタンス、すなわちオブジェクトを作成する。
また、クラスの内部で定義し、そのクラスから生成したオブジェクトを通して呼び出す関数(のようなもの)は「メソッド」という。
メソッドは関数とほとんど同じ構文で定義するが、関数とは2つの違いがある。
- クラスのスイート部分に定義すること
class [クラス名]: [スイート] # ← ここ
[クラス名].prototype.メソッド名 = function() { // ここ }
'クラスモジュール(オブジェクト名に[クラス名]を設定する) Public Sub メソッド名() ' ここ End Sub
- (特別な場合を除いて)引数を少なくとも1つ(※)定義すること
※Pythonの場合はself
、JavaScriptならthis
、VBAならMe
。
それぞれ自動で渡されるので、引数として明示的に書く必要は無い。
class [クラス名]: def メソッド名(self) 処理
[クラス名].prototype.メソッド名 = function(this) { 処理 }
'クラスモジュール(オブジェクト名に[クラス名]を設定する) Public Sub メソッド名(Me) 処理 End Sub
オブジェクト指向の4大要素
オブジェクト指向は、下記4つの要素から成り立っている。
PythonやJava、Rubyのように、これらの4大要素すべてを提供してこそ*3、オブジェクト指向プログラミング言語と言えます。
出典:http://a.co/g77Ar66
…ふ、ふむふむ。何やら聞いたことない熟語や横文字が…
続きは、また次回。