いもづる オブジェクト指向

オブジェクト指向概要

(2006/07/22)

現在オブジェクト指向は必須の技術となっています。開発言語も次々とオブジェクト指向をサポートするようになってきています。 ここではそのオブジェクト指向の概要についての話をします。
オブジェクト指向そのものは決して難しくありません。むしろ難しいのは発想の転換、今までと思想の変えて考えることです。 一度頭の中を空っぽにして、軽い気持ちで読んでください。

▲このページのTOPへ

概要

オブジェクト指向はどのようなものなのでしょうか?よくある説明としては、

データを処理をひとまとめにしたクラスを定義し、クラスそれらを組合せることによりシステムを構築する

といった内容です。 決して間違いではないし、その通りではあります。しかし、それだからなんだというんだろう・・・。 今現在もオブジェクト指向言語でそういったことを気にせず従来通り普通にプログラムしている。 という方は多いのではないでしょうか。

オブジェクト指向は全てを現実世界にある物のような感覚で考えます。 オブジェクト指向と、それ以前(構造化)では作りに関するアプローチが異なります。 というより、考え方を変えた方がわかりやすいといった方がいいかもしれません。 それはどういうことかを説明していきます。

▲このページのTOPへ

データと処理をセットで

そもそも「データと処理をひとまとめ」にすることで何が変わるのでしょう。何かいいことがあるのでしょうか。 ここでまず大切なことがあります。それは「ひとまとめにすること」が目的ではないということです。 本来の目的があって、それを実現するためにひとまとめにするのです。

クラス化した図
処理をクラスにまとめたイメージ

オブジェクト指向以前では、散々としているデータと処理を駆使してシステムを構築していましたが、 関連するデータと処理をクラスという枠組みに入れることにより、非常に整理された形になります。

なるほど確かに整理ができる。。実際に効果があり、このような使用もします。 しかしこれだけでは、「それで・・・?」となりますよね。これだけの広まりをみせたオブジェクト指向ですからもっとすごいことがあるはず!

本来の目的とはなんでしょう。それはクラスに「自立して働いてもらう」ということです。 1つの処理を行うというのではなく、意味のあるかたまりで1つの機能であるクラスを構成し、 そこはそのクラスに責任をもって働いてもらいます。

それは会社やチームなどに似ています。個々が責任をもって役割を担い、全体として大きな事を実現します。 クラスもその中の一員です。

処理とデータを持つことで、クラスは自分のことは自分で動けるようになったのです。

▲このページのTOPへ

自立の時

自立して働いてもらう。と急にいわれても余計に・・・?これについて説明します。

ラジオという物
ラジオに対する操作

1つの機能をもつ例として、ラジオという物を例にあげます。 最も簡単なもので、電源があり、チューナーがあり、ボリュームがあるもので考えます。 電源は押すことでON/OFFができます。チューナーとボリュームは、高低、大小の調整ができ、その時点での値があります(Hz/dB)。 ラジオを動かすための操作は限られています。しかし、その限られた操作をすることでラジオはちゃんと機能します。 内部の構造がどうなっているのかは知る必要がありません。トランジスタラジオも、半導体のラジオも関係ありません。 外部からの限られた操作と調節で、ラジオは機能を責任をもって全うしています。 このかたまり。ラジオというものがクラスに例えられます。
外からの要求に対して、自分で対処していますね。

それでも何かだまされたような気がする。。そんな人のためにプログラムでの例を1つあげます。 .NET Framework の System.Stringクラス(以下Stringクラス)です。 Stringクラスは文字列というデータを持ちながら、他にも処理やデータを持つクラスです。 ここでは、"abcde" という文字列をデータとして持つStringクラスを考えてみます。(正確にはStringクラスのインスタンス)

string etc = "abcde"; ※stringはSystem.Stringの別名です

int length = etc.Length; // lengthには、5が代入されます
string ETC = etc.ToUpper(); // ETCには、"ABCDE"が代入されます
string aaa = etc.Replace("abc", "123"); // aaaには、"123de"が代入されます

このように、Stringクラス型変数etcに対していろんな呼びかけを行っています。 言葉で書くなら、  etcさん、文字列の長さを教えてください。  etcさん、あなたの文字を大文字にしたものをください。  etcさん、あなたの文字の中の"abc"を"123"に変えたものをください。 といった感じです。
ちなみにオブジェクト指向以前のプログラムでいくと次のようになります(関数は適当です...)

string etc = "abcde";

int length = Length(etc);
string ETC = Upper(etc);
string aaa = Replace(etc, "abc", "123");

etcは単なるデータなので自分で何かをすることはできません、なのでそれぞれの関数にetcを渡して処理をしてもらっています。

こうみると書き方だけが違うような気がしますが、大きな違いがあります。

構造化:Length

オブジェクト指向:Length

Length取得(構造化) Length取得(オブジェクト指向)

これを指示しているのがあなただとすると、 オブジェクト指向以前の場合、あなたは、etcというデータを抱えて、いろんな関数に放り投げる必要があります。 処理はあなたの範疇にあります(大変)
「文字列データ」を「文字列クラス」とすることで、あなたは楽になります。 オブジェクト指向の場合、あなたはetcさんにお願いすればあとはetcさんが動作をしてくれます。 処理はetcというStringクラス内で行われ、あなたは指示をしているだけです(スッキリ)。Stringクラスが自分(文字列)のことは自分でするのですから。

処理イメージ(構造化)

処理イメージ(オブジェクト指向)

構造化の処理イメージ オブジェクト指向の処理イメージ

「活きたクラス」を考える。これが目標です。

このように、自立したクラスを作ってそれを使う。クラスを作ってそれを使う。これを肝に銘じて推し進めると、 本格的なシステムに取り組んだときにものとても大きな差として現れてきます。

 

webmaster@e-ioo.net