なぜオブジェクト指向で設計・プログラミングするのか、そのメリットと基本的な考え方を説明しようと思います。
今回は、オブジェクト指向の基本から知りたい方に3つの原則から解き明かし利点を説明します。
実際僕は、オブジェクト指向を数十年前に日本に広めようというプロジェクトにもかかわっていたので、その経験も踏まえて知っていることを伝えたいと思っております。
オブジェクト指向の本質から知りたい方は、ぜひお読みください。
オブジェクト指向の基礎
オブジェクト指向とは
オブジェクト指向は、もともとシュミレーション用につくられたSimula という言語が発端といわれており、現実世界をプログラムの世界で抽象化するように設計していきます。
抽象化すぎるので簡単に1例だけあげます。オブジェクト指向の説明ではよくある例ですが、猫が鳴くことをプログラミングイメージで書いてみます。
【構造化設計】
プログラム: 猫が鳴く()
結果: >にゃー
【オブジェクト指向設計】
プログラム: 猫 ← 鳴く
結果: >にゃー
猫が鳴くその動作そのものをプログラムにするか、いろいろな機能をかね備えた猫というものを作り出して、その猫に鳴いてねと指示するか。
その違いが、構造化設計とオブジェクト指向設計の違いです。
オブジェクト指向の3つの原則
上記を実現するために、オブジェクト指向は基本的な3つの原則(これがあればオブジェクト指向ができる)というものをもっています。
この3つの原則を考慮してシステムを設計・開発していくのが、オブジェクト指向設計であり、オブジェクト指向プログラミングになります。
その3つを以下に示します。
・カプセル化
・継承
・多態性(ポリモフィズム)
それぞれについて説明します。
・カプセル化
カプセル化とは、それがもつ機能、属性、データをひとくくりに塊としてまとめてしまうことです。
実際の内部のデータで外部に公開する必要がない情報は、その塊の中に隠ぺいされることになります。
プログラムとしては、クラスとして実装され、利用の際にはインスタンス(オブジェクト)を生成してつかいます。
(クラス定義)
>クラス 猫
>・鳴く「ニャー」
(プログラムで猫を動かす)
>猫 ミーちゃん
>
>ミーちゃん←鳴く
(結果)
>ニャー
ここで、猫がクラスで、ミーちゃんが実在するインスタンスとなります。
現実世界の猫が鳴く部分だけをシュミレートしてますね。
・継承
継承とは、親子関係のことです。親がもつ属性や性質を子供に引き継いでつかうことができます。
クラスとインスタンスだけで現実世界を切り取ることはできますが、それだとすべてのものは個々に独立していて、何かをつくろうとすると常にゼロから作り出すことになります。それでは大変ですよね。
現実世界でも、例えば人間は長年かけて進化してきており、その中には犬や猫といった、動物の要素ももちあわせています。
今度は、猫だけではなくて、犬もつくってみます。
(クラス定義)
>クラス 動物
>・鳴く「」
>・歩く「てくてく」
>
>クラス 猫:動物を継承
>・鳴く「ニャー」
>
>クラス 犬:動物を継承
>・鳴く「ワン」
>
(プログラム)
>猫 ミーちゃん
>ミーちゃん←鳴く
>ミーちゃん←歩く
>
>犬 コロちゃん
>コロちゃん←鳴く
>コロちゃん←歩く
(結果)
>ニャー
>てくてく
>
>ワン
>てくてく
動物という親のクラスに歩くことを実装しておけば、猫も犬もあるいてくれますね。
・多態性(ポリモフィズム)
次は、多態性(ポリモフィズム)です。日本語では、多様性、多相性などとも訳されています。
ポリモフィズムとは、あるオブジェクト(型・クラス)が、読んで字のごとしで様々な性質を示す、ということです。
つまり、先ほどの例だと、動物が、猫ならニャーと鳴いて、犬ならワンと鳴く、ということです。
1つの例で、動物の一日というプログラムを作ってみます。
「起きて、鳴いて、食べて、寝る」ってだけのプログラムです。
これを、猫と犬で作ろうとすると。
猫の一日、犬の一日というプログラムをつくる必要がでてきます。
猫の一日「猫←起きる、猫←鳴く、猫←食べる、猫←寝る」
同じことを犬でもつくる場合、2倍の労力がかかります。
これを、動物の一日としたらどうでしょうか?
動物の一日「動物←起きる、動物←鳴く、動物←食べる、動物←寝る」
プログラムとしてはこれだけつくって、動物は「猫」とか、動物は「犬」と指定できるとすれば
猫なら猫、犬なら犬としての動作をさせることが可能になります。
このように、動物という親のクラスが実際のオブジェクト(インスタンス)として多用な形態をとることができる、というのがポリモフィズム(多態・多様、多相)になります。
(クラス定義)
>クラス 動物
>・起きる「」
>・鳴く「」
>・食べる「もぐもぐ」
>・寝る「ぐーぐー」
>
>クラス 猫
>・鳴く「ニャー」
>・寝る「すやすや」
>
>クラス 犬
>・鳴く「ワン」
>
(プログラム)
>動物の一日(動物)
>動物 動物さん
>
>動物さん←起きる
>動物さん←鳴く
>動物さん←食べる
>動物さん←寝る
>
>
>猫 ミーちゃん
>犬 コロちゃん
>
>動物の一日(ミーちゃん)
>動物の一日(コロちゃん)
>
動物の一日にミーちゃんを指定した場合は、猫としての動きをするし、コロちゃんを指定すれば犬としての動きをします。
このように、システム(今回は動物の一日というシステム)全体を定義してしまい、犬や猫それぞれで動作が異なる部分だけを作りこめばシステムを動かすことができるようになります。
オブジェクト指向のメリット(なぜオブジェクト指向か)
ここからは、オブジェクト指向のメリットを説明します。
オブジェクト指向のメリット
・部品化が容易
メリットのひとつが、部品化が簡単にできるという点です。
犬、猫という例ではわかりずらかったかもしれませんが、実際のシステムだと、例えば、画面とか帳票というクラスを作成して、いろいろな種類の帳票があるとしたら、親となる帳票クラスを継承して、個別のMy帳票1、My帳票2、とかで個別の印刷レイアウトを定義するというように使います。
このように、帳票なら帳票というかたまりをクラスとして扱うことができること、クラスはその中だけで使う情報はきちんと隠ぺいされていることから、部品としての扱いが容易になります。
・フレームワーク化ができる
さらにシステムの動作そのものを定義することができるというのが、おおきなメリットになります。
オブジェクト指向プログラミングの世界では、これをフレームワークといいます。
先ほどの「動物の一日」の例がその例ですが、帳票でかんがえれば、帳票クラスの中に印刷という流れをつくってしまうとします。
例えば、「帳票←プリンタ接続確認、帳票←プレビュー確認、OKの場合は、帳票←印刷処理」
ここに、My帳票1をいれれば、帳票1が、My帳票2を設定すれば帳票2が印刷される、ということになります。
このように、継承とポリモフィズムの原理により、動作そのものをフレームワークとして定義してしまうこと、それがシステム開発でいうフレームワークというものになります。
システム企画・開発について
これまでの自分の経験をもとに、オブジェクト指向はもとより、システムの企画・開発、プロジェクトマネジメント、各種問題解決に対するコンサル、ご支援を実施しております。
ご興味がわいたときは、一度ご相談ください。下記にリンクも貼っておきます。