ゆるおたノート

Tomorrow is another day.

オブジェクト指向って、なんだ?

数ヶ月掛けてちょこっとずつ、読み進めている本(後述)がありまして、その中でオブジェクト指向について説明があります。

正直まだ「ちょっと何言ってるかよく分からない」状態の部分だらけではあるのですが、現時点で本を読んで分かっていること・私の解釈を、整理しながらここに記録しておくことにします。

オブジェクト指向とは?

手続き型プログラミングと、その問題

現代のプログラム界では、以下3つのパラダイム(スタイル、手法)がある。


  1. 手続き型プログラミング
  2. 関数型プログラミング
  3. オブジェクト指向プログラミング

手続き型プログラミングは、「アレをやって、次はコレをやって…」という連続した手続きを行うことで、順番にほしい結果に導く。
これはこれで、小さいプログラムには有効な手段。

しかし、手続き型プログラミングには「グローバル」なスコープ*1の問題がある

大きいプログラムになると、「複数の手続き(≒関数)にまたがって同じデータを扱う」必要が出てくることがあり、そんな時にグローバルな変数は役に立つ。

ところが、機能を追加するにつれてプログラムが複雑化し、グローバル変数も増える。
やがて、いくつもの関数がグローバル変数を読み書きするようになると、変数のコントロールが難しくなっていく。

一方ではインクリメントに使っているのに、他方ではデクリメントに使っていたりなど、1つのグローバル変数に対し複数の関数が操作することで、制作者の意図しない動作が発生してしまったりする。

このように、手続き型プログラミングでは、グローバルな変数の扱いが難しくなることがある。

グローバル変数の多用を避けることでエラーを減らすことも出来るが、関数型プログラミング」や「オブジェクト指向プログラミング」では、「処理や変数をローカルに閉じ込める」アプローチを取ることで、この問題の解決を目指す。

今回は、後者の「オブジェクト指向プログラミング」を扱う。

オブジェクト指向の目的

オブジェクト指向プログラミング」は、「オブジェクト」に状態(=変数の値)を持たせることで、グローバルなステートメントを排除する*2

「状態」はオブジェクトの内部で操作することにして、オブジェクトの外(メインの処理など)からは操作させない。

コレを基本とする。

これによるメリット・デメリットは、本書より引用する。

オブジェクト指向プログラミングの利点は、コードの再利用が促進されて、開発や保守にかかるトータルの時間が短縮されることです。さらに、解決したい問題を分割して扱うことが推奨されるため、保守しやすいコードになります。オブジェクト指向プログラミングの欠点は、プログラムを書く前の計画や設計などに、より多くの労力をかける必要があることです。

出典:http://a.co/1sj1P6I


将来的に効率化出来る代わりに、前もってじっくりしっかり設計しておく必要がある、と。

オブジェクトは「クラス」で表現する

「オブジェクト」について定義・分類する仕組みのことを「クラス」、クラスを呼び出す側のプログラムを「クライアント」と呼ぶ。

共通した特徴(=属性、プロパティ)を、クラスを使って定義し、属性の値の違いで個々のインスタンス、すなわちオブジェクトを作成する。

また、クラスの内部で定義し、そのクラスから生成したオブジェクトを通して呼び出す関数(のようなもの)は「メソッド」という。

メソッドは関数とほとんど同じ構文で定義するが、関数とは2つの違いがある。


  • クラスのスイート部分に定義すること
class [クラス名]:
    [スイート] # ← ここ
[クラス名].prototype.メソッド名 = function() {
  // ここ
}
'クラスモジュール(オブジェクト名に[クラス名]を設定する)
Public Sub メソッド名()
    ' ここ
End Sub


  • (特別な場合を除いて)引数を少なくとも1つ(※)定義すること
    Pythonの場合はselfJavaScriptならthisVBAならMe
    それぞれ自動で渡されるので、引数として明示的に書く必要は無い。
class [クラス名]:
    def メソッド名(self)
        処理
[クラス名].prototype.メソッド名 = function(this) {
  処理
}
'クラスモジュール(オブジェクト名に[クラス名]を設定する)
Public Sub メソッド名(Me)
    処理
End Sub

オブジェクト指向の4大要素

オブジェクト指向は、下記4つの要素から成り立っている。


  1. カプセル化
  2. 抽象化
  3. ポリモーフィズム多態性
  4. 継承

PythonJavaRubyのように、これらの4大要素すべてを提供してこそ*3オブジェクト指向プログラミング言語と言えます。

出典:http://a.co/g77Ar66


…ふ、ふむふむ。何やら聞いたことない熟語や横文字が…

続きは、また次回。

参考文献

注釈

*1: VBAのスコープについては、手前味噌ですがこちらをご参照下さい。 yuru-wota.hateblo.jp

*2: 関数型では、「引数」として状態を「関数」に渡して処理する。
次の関数に渡して処理、その次の関数に渡して処理、…これを繰り返すことでほしい結果に導く。

難易度が高いらしいですね…?

*3: VBAも、頑張れば出来ないことはないようだけど、このあたりが「モダンな言語」プログラマーから距離を置かれる要因なのかな。