読者です 読者をやめる 読者になる 読者になる

オブジェクト指向と、言語の進化を辿るということ

オブジェクト指向とは、属性と振る舞いを持つオブジェクトを作るための「型」を作ることを意識しながらプログラムを書くこと。

と言われても理解は深まらないので、オブジェクト指向ではない指向とはどんなものかを理解して、比較をすることで、理解を深めよう。比較対象はプロセス指向である。

 

処理にデータを渡し、値を得ることをプロセス指向と呼ぶ。プロセス指向とは、プログラムはデータと処理からできており、プログラム内でデータは変数処理は関数として表される。データは処理の対象であり、処理にデータを渡して値を求める。

 

オブジェクト指向とは、プログラムはオブジェクトとメッセージからできており、プログラム内でオブジェクトは「属性(パラメータ)」と「振る舞い(クラスメソッドインスタンスメソッド)」を持ち、メッセージは振る舞いを呼び出す「処理」として表される。プログラムは複数のオブジェクトで構成され、オブジェクトは処理能力を持つデータである。オブジェクト(データ)にメッセージ(処理)を渡すことで値を求める。

 

 

 プロセス指向であるC言語と、オブジェクト指向プログラミングができるJavaの文法を比較する

C言語で文字列の長さを求める】

strlen(s)

処理strlen()にデータsを渡している。

 

Javaで文字列の長さを求める】

s.strlen()

自身の長さを求める処理を持つデータsに、処理を呼び出すメッセージstrlen()を渡している。

JavaのクラスライブラリにはMath.sqrt(3)のように属性のないクラスメソッドが存在する。Javaは純粋なオブジェクト指向ではなく、開発者の志向によって、プロセス指向で書かれたり、オブジェクト指向で書かれたりする。

 

 

 オブジェクト指向プログラミング(OOP: Object Oriented Programming)について

現在普及しているOOP言語にはC++/Java/C# がある。次にOOPで使われる言葉の定義をいくつか記す。この定義は上記の3言語で共通の意味を持つ。

クラス:データと処理をまとめたモジュール、複数の型のパラメータを持つ複合データ型。

クラスのインスタンス:クラスをデータ型とした変数、メモリにロードされたもの。

オブジェクト:クラスインスタンスの別名。

 

クラスがあることによって使える機能に、カプセル化多態性がある。

カプセル化(encapsulation):システムを独立した小さなプログラムの集合体として管理できる。モジュール間のつながりは関数呼び出しのみであり、変更に強い。不必要な機能は非公開にし、プログラムをシンプルに保つ。

多態性(polymorphism):クラス型が異なっても、同じ機能には同じ名前がつけられるので、人間の感覚では同じ関数が対象となるオブジェクトの型によって異なる手続きを行っているように見える。

 

Gofデザインパターンとは

OOPに役立つ、23種類の設計パターンのアイデア集のこと。生成・振る舞い・構造のパターンに分類できる。

 

言語の進化を辿るということ

ちょうど1年前にC言語の勉強を始めた頃、それまでRubyしか触れたことのなかった私は、ポリモーフィズムが素晴らしいアイデアなのだと知った。最近はSmalltalkが純粋なOOP言語であることを知り、言語の進化の歴史を知ることができた。Smalltalkは発明当時では画期的なアイデアであるOOPを採用したが、制御構造もデータ型も演算子もなく、すべてをメッセージとして実行するという欠点があった。

例えば、Smalltalkで下記を実行すると16を返す。

3+5*2

メッセージに優先順位がなく、左から順に実行されるからだ。これでは数学の演算ルールと異なるので、JavaC言語に慣れた多くの人は使いにくいと感じるだろう。現在では、プログラミング言語は数学の演算法則に従うことが当たり前だからだ。

 

Rubyが影響を受けた言語を辿ると言語の進化を見ることができる。Rubyは「オブジェクト指向の動的型付け言語」と言われている。Rubyは強い動的型付けを行う。動的型付け言語とはプログラムの実行時に変数の型を決める柔軟な言語のことである。例えば、関数の実引数と仮引数の定義時にデータ型を定義せずに済み、シンプルなプログラムの記述が可能となる。Rubyに影響を与えたと言われる言語を遡ると、「プロセス指向静的型付け言語」から徐々に現在の形に進化を遂げていることがわかる。例えば、C言語は弱い静的型付け、C言語に影響を与えたALGOLは強い静的型付けだった。

言語の進化により、開発者はストレスなくプログラミングを楽しむことができるようになる。また、言語の歴史を知ることで、言語に親しみと感謝を持つようになるので、技術の歴史を学ぶことはやはり重要なのだと思う。