オブジェクト指向設計

Team CHAO


  ここでは、「オブジェクト指向入門」の補足解説を、なるべく実際のプログラミングに近い形で行っていきたいと思います。プログラミング言語は、原則としてJavaを想定しています。

オブジェクト指向とは

  プログラマの視点から言うと、オブジェクト指向とは、データと操作(ファンクション)の集まりであるクラスによって独自の型を作成し、それらのインスタンス(実体)である”オブジェクト”の相互作用システムの集まりとしてシステムを構成することです。データはプロパティー(属性)データメンバと呼ばれることもあります。そして操作部分はメソッドメンバ関数と呼ばれます。メソッドは、手続き型言語でいうサブルーチンや、関数と呼ばれるものと基本的には同じものです。従来の手続き型プログラミングでは、データとファンクションを一体として新しい型をつくることは出来ませんでした。また、オブジェクト指向では、階層構造と継承というシステムを持っているので、全てを記述しなくても異なる部分だけをコーディングすれば良いという、差分コーディングが可能になります。

また、オブジェクト指向プログラミングにおいては、抽象化によって一度に知っているべきことが少なくなり、カプセル化という考え方に従って、隠すべきデータの部分にはアクセスさせないというアクセス制御が可能になります。基本的なアクセス制御の考え方では、クラスのプロパティーの部分はユーザから見せないようにして、そのデータにはメソッドを使用してアクセスします。これによって、データの正当性をメソッドを使用して検査することが出来ます。オブジェクトの型を明確に指定せずにオブジェクトを操作できるというポリモーフィズム(多態性)という考え方もオブジェクト指向言語では使用することができます。

オブジェクト指向プログラミングの基本としては、「一度に考えなければならないことをなるべく少なく」するという抽象化の考え方の上に、継承による再利用可能性とアクセス制御によるデータの安全性の確保を加えたものということができると思います。

オブジェクト指向とは、データ構造と振る舞いが一体となった”オブジェクト”の集まりの相互作用システムとしてソフトウェアを設計する手法です。オブジェクト指向のアプローチによってプログラマは、近代プログラミングにおける重要な考え方をソフトウェア設計に組み込むことができます。それらは、抽象化、カプセル化、クラス階層などの考え方です。

オブジェクトとは

オブジェクトとは、対象物をある視点から見た「実体」です。オブジェクトは振る舞い(操作)とデータ(属性)を含みます。

ちょうどあなたの家のテレビがあなたのものと認識できるように、そしてあなたの銀行口座が他の人のだれのでもなくあなたのものであると認識できるように、全てのオブジェクトはそれぞれ一つの「もの」として認識され、他のもの(例えばあなたの友達の銀行口座)と明確に区別できます。

オブジェクトとは、物の型であるクラスによって生成されたインスタンス(実体)のことです。

次の例では、Date型のオブジェクトであるdを宣言しています。

Date d = new Date();

全てのオブジェクトはそれぞれ一つの「もの」として認識され、他のものと明確に区別できます。例えば、次の例の、オブジェクト"myDate""yourDate"はまったく別のものとして認識されます。

Date myDate = new Date();
Date yourDate = new Date();

例えばあなたの友達の”田中君”という人が何人あなたの周りにいようと彼らを区別して認識できるように、同じ型から生成されていてもオブジェクトは他のものと明確に区別することが出来ます。例えば次のように、あなたのテレビと私のテレビを同時にチャンネル変更しても混乱を引き起こしません。

TV myTV = new TV(); //私のテレビを生成
TV yourTV = new TV(); //あなたのテレビを生成

myTV.changeChannel(); //私のテレビのチャンネルを変更
yourTV.changeChannel(); //あなたのテレビのチャンネルを変更

また次のように、同一クラス内でメソッドの名前が同じであっても、引数を基準として区別し使用することが可能です。

TV myTV = new TV();
myTV.changeChannel(); //適当にチャンネルを変える
myTV.changeChannel(1); //1チャンネルに変更する

抽象化

例えばあなたの家のテレビのチャンネルを変えたいときに、テレビの内部構造を知らなくても、(ブラウン管やチューナー、トランジスタなどのことを考えなくても)、ボタンを押せばすぐにチャンネルが変えられるのと同じように、抽象化によって詳細にこだわることなく特性に集中することが出来ます。 

カプセル化

”カプセル化”は、抽象化をサポートしたり強化するためにクラス内部の動作を隠す方法です。 完全にカプセル化されたクラスとは、そのデータを関数で隠し、ユーザが関数を呼び出すことでしかそのデータにアクセスできないようにすることです。そのことによってクラスのデータに対する安全性が増します。

階層と継承

オブジェクト指向のアプローチでは、似たような形式を持つクラスの類似性や差異を定義するために、「継承」という方法を使います。例えば、フルタイム従業員とパートタイム従業員の場合、いずれの従業員もほとんど同じデータが適応されますが、一部だけが異なります。この場合、「パートタイム従業員」と「フルタイム従業員」はどちらも、「従業員一般」からわずかに異なるものとして定義されます。 

継承を利用することによって、異なる部分だけをコーディングするという差分コーディングが可能になります。

ポリモーフィズム

”ポリモーフィズム”は、オブジェクトの型を明確に指定しないでそのオブジェクトのメンバ関数を呼び出す機能です。この言葉は、”多くの形体を仮定する能力”を意味していて、これが転じて同じ構文のステートメントが多くの異なる関数を呼び出す機能を指します。 

オブジェクトとクラス

クラスはオブジェクト製造装置と考えられます。クラスとはいわばスタンプのようなもので、インクをつけて紙に押せばいくらでもオブジェクトを作り出せるという感じです。このとき、オブジェクトは紙の上の消印の方です。クラスは静的な存在であり、オブジェクトは実行時の動的な存在で、「クラスは変数型であり、オブジェクトは変数である」というふうにも言います。 

いつオブジェクト指向設計を使用するか

オブジェクト指向設計の中心は、データとデータへの操作の集合であるモジュールを設計することにあるので、ルーチンとデータが結合しているシステムの場合に適しています。また最近のイベント駆動型システムやオブジェクト指向データベース、そしてGUIを使用したインタラクティブ性の高いプログラムに適しています。そして一般に、構造化設計より高いレベルの抽象化を行うため、より複雑なレベルのプログラムに適しています。特に、機能性よりデータに変更の可能性のある場合に適しています。 

オブジェクト指向言語の欠点

  オブジェクト指向の欠点は、それが「オブジェクト指向」であるという点です。つまり、全てをオブジェクト化してしまい、結果として理解が困難になるということです。  また、現在のオブジェクト指向の世界では、様々な用語がさまざまな意味で使われ、用語の定義があいまいな状態になっています。特にプロジェクトを一緒に進める上では用語の統一が欠かせません。そして、一般的なオブジェクト指向言語に共通して言えることは、クラスライブラリの習得が面倒だということです。成熟したオブジェクト指向言語ほど、まず最初に覚えるべきクラスライブラリの習得に時間がかかります。

まとめ

 オブジェクト指向のアプローチを採用することによってプログラマは、抽象化、カプセル化、継承などのような、近代プログラミングにおける重要な考え方をソフトウェア設計に組み込むことができます。一般にオブジェクト指向によるプログラミングは、従来の構造化プログラミングよりも高い抽象化を行うのでプログラムが保守しやすくなり、データの安全性が増し、再利用が容易になります。


Editor : Kota Iguchi ( kota@sysportcore.com )