今更ながらオブジェクト指向について書いてみた。|オブジェクト指向|歴史|アプローチ
私が書いたプログラミングの関連記事です。
まず、オブジェクト指向が脚光を浴びるようになった背景とはなにか。
プログラミングの歴史として非構造型プログラミング➝手続型プログラミング➝オブジェクト指向プログラミングと変遷してきた。
このようにプログラミングの手法が変遷したことにより、 ・コンピュータ自体の性能の向上 ・高性能コンピュータを複数組み合わせた分散処理に代表される処理形態の変化 ・定型的な処理のみならず非定型的な処理の増大 ・単純な処理の繰り返しから意思決定支援などへ複雑な処理の要求
これらのコンピュータを取り巻く環境の変化によって、現在のソフトウェア開発に様々な問題が発生してきた。
・ソフトウェアへの高機能変化要求による大規模化/複雑化 ・ユーザの要求を正確にシステムに反映できない ・既存のソフトウェアの仕様変更要求に速やかに対応できない
以上のことからわかることは、現実世界にあることをコンピュータ上で表現しよう(モデリング)とした際失敗してしまったことに起因していることが大きい。 ユーザが本当に望むものをコンピュータ上で再現しきれなかった結果である。
ここで、今後のソフトウェア業界はユーザの要求を汲み取り正確に短時間でコンピュータ上で再現する作業が重要であると言える。
この重要な作業としてオブジェクト指向が向いている。
技術力の進歩とユーザの要求の高度化がオブジェクト指向へ脚光を浴びる必然的なことであったのである。
オブジェクト指向概要
そもそもオブジェクト指向の意味とは?
オブジェクトが"もの"、指向が"~へ向けた、向いた、目指した"となる。*1
そして、データでも手続くでもなく、オブジェクトを中心に「分析/設計/製造」を行う発想である。
現実世界には様々なものが存在し、そのもの達は、それぞれ独立して機能し、互いに連携しながら別の機能を生み出している。
この独立したもの同士の関係をコンピュータ内で再現しようというのがオブジェクト指向のアプローチであるのだ。
それでは具体的に従来のアプローチの手法との違いを考えてみる。
手続型指向
これは名前が示すように、ある機能をどうやるかを中心にアプローチしていくものだ。 一つの機能を入力し別データとして出力するという流れで考えていくものである。
これを表す手段としてフローチャートが一般的であり、実現手段としてはCなどのプログラミング言語がそうである。
データ指向
これは手続き指向とは逆にシステムに必要なデータを中心にアプローチしていくものである。 このアプローチの売初めにデータがありきである。「データがありどのように変化してくのか」または「どのように仕事で使われているのか」を定義し、システムの全体像をとらえようとするものだ。
表現手段としてはデータアローダイヤグラムが一般的であり、実現手段としてはリレーショナル型データベース+COBOLが一般的だ。
オブジェクト指向
この指向は簡単に言うと手続きとデータのどちらも重要視したアプローチである。
オブジェクト指向はモデリングを行う際に、その対象となるシステムをものの集まりとして定義する。
人と人が助け合いながら生活している私たちの生活スタイルそのもである。
オブジェクト指向の特徴
オブジェクト指向を構成しているトピックを説明していく。
オブジェクト
オブジェクトとはシステムを構成する要素であり各オブジェクトは一つ以上の機能を持つ
このオブジェクトの定義はそれぞれのある視点によるのものである。
「ある人からみてオブジェクトじゃないよね」ということもあるのである。
例えばコンビニの店員は商品の陳列をするがコンビニ利用者にとって陳列はまた違った視点からみるためオブジェクトじゃなかったりする。 コンビニの利用者なのに商品の陳列をコンビニ店員の視点からする人なんかいないはず笑
クラスとインスタンス
クラスとは「個々のオブジェクトに共通な性質をまとめたもの」である。 キャラ弁に使う型がクラスだと思ってもらって問題はない。
またクラスとクラスとの関係もある。 クラス⇒オブジェクトもあり、クラス⇒クラスがあるということだ。 くれぐれもクラス⇒オブジェクトだけだと思ってほしくない。
ここで考え方として、クラス(スーパークラス)⇒クラス(サブクラス)である。
スーパークラスは基底クラスとも呼び、サブクラスは導出クラスと呼ぶ。
ちなみにオブジェクト⇒オブジェクトはない。オブジェクトはシステムの要素であり、実体である。したがって概念の上に概念が存在しても実体の下の実態は存在しないことが言える。
このことからオブジェクトはクラスを基に作成された実体であることがわかり、この実体のことをインスタンスとも呼ぶ。
継承
継承とは親の機能を引き継いで子を生成し、さらに子には独自の機能を追加することができる仕組みと表現できる。
例えばだが、固定電話と携帯電話がある。
ここで固定電話と携帯電話には共通して通話という行動がある。
電話を通話するものと定義し、その電話の機能にそれぞれ独自の機能を追加して固定電話と携帯電話を定義したことになる。
つまり、電話(親)をベースにし、固定電話と携帯電話(子)を定義するのである。このことを特化と呼ぶ。 逆に子から性質を抜き出し親として定義することを汎化と呼ぶ。
補足として親と子の差を見つけプログラミングしていくことを差分プログラミングと呼ぶ。
集約
集約とはあるオブジェクトの構成要素の一部分に他のオブジェクトを含む関係を表す概念である。
例えば学校には教室、講師、学生という要素があり、教室には机、椅子、黒板がある。
また集約は関連性の強弱により、2種類に分類される。
関連性が強いほうを合成集約やコンポジションと呼び。弱い方を集約やアグリゲーションと呼ぶ。
多態性
多態性とは同じ形式の指示で異なるふるまいを発生させる仕組みといえる。
身近な例えにすると、北海道人ならゴミ投げてというと捨てるんだなとわかる。関東の人になるとそのままゴミを投げだす。
言っていることは同じだが伝わり方違う。
カプセル化
オブジェクトはデータと手続きをもっているが、カプセル化はデータと手続きを一つの単位としてまとめた構造である。
メリットとして、入力と出力だけがわかり、中身の動作はわからない。セキュアな仕様にでき、責任の所在を明確にできる。
日常の中での例えとして、薬用カプセルがある。カプセルなため、中身の味わわからない。だが、実際に服用すると消化され効果がでてくる。
部品化
部品とはクラス群のことであり、そのそれぞれのクラスを組み合わせてプログラムは完成する。
部品化により、プログラムの品質の向上、生産性の向上が図れる。
より効率的なプログラミングを図りたいのなら部品化意識しないということはない。
深く意識しプログラミングする必要がある。
オブジェクト指向の学びにおすすめの教材
- サイトだが参考になる
新人プログラマに知っておいてもらいたい人類がオブジェクト指向を手に入れるまでの軌跡 - Qiita
- わかりやすく図解などでオブジェクト指向を理解できる
- オブジェクト指向で作る理由等を知りたいあなたへ
まとめ
オブジェクト指向については以上である。
改めて考え方をまとめると、復習や頭の中の整理になる。
尚、プログラミング教育従事者の皆様には以上のことを少しでも意識して教えていただきたい。
※1ここではモデリング作業がものを目指している。