オブジェクト指向とは何かを整理する

オブジェクト指向とは何かを整理する

アーキテクチャ

よくわからないことで有名なオブジェクト指向をイメージできるまで理解するためにまとめました。

オブジェクト指向とは

オブジェクト指向は「ある役割を持ったモノ」ごとにクラスを分割し、モノとモノとの関係性を定義していくことでシステムを作り上げようとするシステム構成の考え方です。

そのため、オブジェクト指向はソフトウェアの保守や再利用をしやすくすることを目的とし、個々の部品により強く着目し、部品の独立性を高め、それらを組み上げてシステム全体の機能を実現するという考え方に基づいています。

ざっくりいうと、難しいソフトウェア開発を楽に行うための総合技術というイメージかと思います。

 

なぜオブジェクト指向で書くのか?

システムが変更に対して柔軟に対応できるようにするためです。

例えば小売店の商品を管理するシステム開発をすることになったとして、オブジェクト指向では商品をクラスとして抽出して設計します。

そうすることで、今後商品が増えたり、変更された場合でも柔軟に対応することができます。

 

オブジェクト指向の難しい点

クラス設計することで柔軟に対応することができる一方、どこまでを抽象化して設計するかがオブジェクト指向の難しい点なのではないかと思います。

先ほどの例でいくと、システム開発した小売店は、今後ネット販売や郵便物の受け取りに対応するかもしれないなどキリがありません。このように変更可能性が低いモノまでをクラス化して設計していくとシステムが複雑化していく原因になります。

なのでどこまでを抽象化するかを設計段階でしっかり行うことが大事になっていきます。

 

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

オブジェクト指向には「継承」、「カプセル化」、「ポリモーフィズム」の3大要素があります。

継承

継承とは、クラスの共通点と相違点を体系的に整理する仕組みです。

オブジェクト指向では全体集合をスーパークラス、部分集合をサブクラスと呼び、このサブクラスは親クラスであるサーパークラスの機能を受け継ぎます。

継承の例として、動物クラスで考えてみます。

動物クラスには「食べる」というメソッドが定義されているとし、動物クラスを継承して「飛ぶ」というメソッドが追加された鳥クラスを作成します。

この鳥クラスは動物クラスから継承されているため、鳥クラスに「食べる」というメソッドを明記しなくても所持しているため、「食べる」と「飛ぶ」の2つのメソッドを持っていることになります。

カプセル化

カプセル化とは、クラス内の公開情報を制限することをいいます。

車を例にカプセル化を考えてみます。

車はアクセルを踏むと加速し、ブレーキを踏むと減速します。

実際にはアクセルやブレーキを踏むことで車の内部では様々な処理が走り、その結果として車の加速や減速になっているわけです。運転者としては車内部がどのように動いているかを知らなくてもアクセルを踏めば加速するということさえ知っていれば問題なく使うことができます。

このように、他のクラスが知る必要のない情報は隠すことをカプセル化といいます。

ポリモーフィズム(多態性)

ポリモーフィズムとは、クラスによって同一のメソッドで異なる振る舞いをすることをいいます。

ポリモーフィズムの例として、動物クラスで考えてみます。

動物クラスには「鳴く」というメソッドが定義されているとし、サブクラスに「犬」と「猫」クラスを作ります。

それぞれのクラスの「鳴く」メソッドを実行した時に、犬であれば「ワンワン」、猫であれば「ニャー」と、同じ「鳴く」というメソッドでも異なる振る舞いをしています。

このように実行する側がどのクラスかを指定しなくても、同じメソッドの実行で異なる振る舞いをすることをポリモーフィズムといいます。

 

クラスとインスタンス

オブジェクト指向では、クラスは種類で、インスタンスは具体的なモノとして解釈できます。

一つ一つのクラスを役割を持ったモノとして扱い、クラスはモノの設計図にあたります。

車を例にすると、車クラスは車を作る元となる設計図になります。
クラスと対になる要素としてインスタンスがあり、クラスとインスタンスはセットで理解するとよいでしょう。

インスタンスは、設計図であるクラスから作成した実体を表します。
先程の車を例にすると、車クラスが車の設計図だとしたら、インスタンスはその設計図から作成された車の実体になります。

 

オブジェクト指向と現実は似ているが別物

オブジェクト指向では、インスタンスを作るための仕組みとしてクラスがあり、インスタンスが帰属するクラスは一つだけです。しかし、現実世界では具体的なモノ(インスタンス)が先にあり、それを見る立場や状況など様々な基準によって分類されます。

例えば、鶏は「動物」でありますが、人間に飼われているのであれば「ペット」でもあり、食用として飼育されているのであれば「家畜」にもなります。

また、インスタンスは唯一のクラスに帰属すると決まっているため、時間の経過とともにクラスの入れ替えをすることができません。

「ひよこ」クラスで作られたインスタンスは、いくら時間が経っても鶏に成長することができません。

このようにオブジェクト指向と現実とでは一見似ているが、実際は別物であることを認識しておく必要があります。

 

参考: