オブジェクト指向設計の概要知識を整理してみた
オブジェクト指向とは
1970年代より提唱されている、ものの考え方、「概念」である。コーディング数が増え、プログラミングが複雑化したことを背景に、解決策として打ち出された。「プログラミングをモノ(オブジェクト)として捉えよう」という考え方である。現在でも大規模開発時に適した考え方とされている。
では、このプログラミングの中のモノとは何か。
家での大掃除を例にする。家の中には、「扉」「廊下」「階段」「リビング」など色々なモノがある。これらを「扉」「廊下」「階段」の掃除はパパで、「リビング」はママね、、、と役割分担することも多いだろう。この「モノ」で考え、プログラミングにも名前をつけていくのがオブジェクト指向の考え方である。
これによりもたらされる代表的なメリットは下記である。
<オブジェクト指向のメリット>
・全体像を把握しやすい
・役割分担がしやすい
・修正がしやすい
・再利用がしやすく、開発の効率化に繋がる
オブジェクト指向の決まりごと
オブジェクト
オブジェクトとは、処理対象のデータとデータを操作する手続きを一体化(カプセル化)したものである。ここでのデータを「属性」、手続きを「メソッド」と呼ぶ。
例えば、銀行口座というオブジェクトは下記のようなイメージだ。
支店名、口座番号、名義が属性であり、入金、出金、振込がメソッドである。
カプセル化(情報隠蔽)
上記の図のように、属性とメソッドをひとまとめにオブジェクト内にいれこむことを、「カプセル化」と言う。カプセルという言葉を聞くと、包みこむイメージを思い浮かべるがその通りであり、カプセル化によりオブジェクト内のデータは外部から直接アクセスできなくなり、決まった外部インターフェースでのみ可能である。カプセル化により、1つ1つのオブジェクトの独立性は高まり、部品化が進む。また、変更時の影響範囲も限られ保守が容易になる。
クラスとインスタンス
クラスとは、オブジェクトを生成する時の雛形であり、共通する性質をまとめたものである。クラスから生成されたオブジェクトの実体をインスタンスと呼ぶ。クラスはジェネラル、インスタンスは具体的な値を持つものとなる。
メッセージパッシング
メッセージとは、オブジェクトが別のオブジェクトに対して処理を要求する際に使う、単位である。オブジェクト指向では個々のオブジェクトはカプセル化されているので、メッセージが唯一の連絡手段である。オブジェクト同士は互いにメッセージをやりとりしながら機能を補完し合い、処理を進めるが、これをメッセージパッシングと呼ぶ。
オブジェクト間の関係性
インヘリタンス(継承)
上位のクラス(スーパークラス)で定義された機能を、下位のクラス(サブクラス)が共通機能として引き継ぐことを指す。これにより、サブクラスではスーパークラスが持たない機能のみを定義すれば良いので、開発効率化につながり、後続の変更容易性も高まる。
下記は一例。まず乗り物の属性(データ)とメソッド(処理)を定義し、それを引継ぎ車と飛行機のサブクラスを作成する。
※上記スーパークラスのメソッド「運ぶ」は、サブクラス上にて各々「道路を走る」「空を飛ぶ」に書き換えられている。このように同一のメッセージでクラス毎に異なる処理が行われることを、ポリモーフィズム(多様性)と呼ぶ。
is-a 関係(凡化-特化)
サブクラスがスーパークラスの一種であるということを表す。サブクラスからスーパークラスを作成することを「凡化」、スーパークラスからサブクラスを作成することを「特化」という。
part-of関係(分解-集約)
あるクラスは他のクラスの一部であるということを表す。全体を表す部分を表すクラスへ展開することを分解、部分を表すクラスを1つのクラスにまとめることを集約と呼ぶ。
関連と依存関係
あるクラスと別のクラスに何らかの繋がりがある場合を関連。あるクラスから一時的に別のクラスを利用する関係を依存関係、と呼ぶ。また、矢印は矢印の方向にメッセージを送ることを表し、これを誘導可能性と呼ぶ。
TBD...