オブジェクト指向のクラス設計の正しさ概要
この記事では、オブジェクト指向プログラミングのクラス設計の正しさについて説明します。
ソフトウェア開発におけるオブジェクト指向プログラミングの基本である「クラス」に着目して、「オブジェクト指向で正しいクラスとは何?」ということを説明します。
この記事で分かること
- クラス設計の正しさには5つ「原則」があることが分かる
- 5つの原則のそれぞれの内容が理解できる
- 5つの原則をどのように使うかが分かる
クラス設計の正しさの関する5つの原則
「オブジェクト指向に基づいた正しいモデルとは何か?」
もちろん、私達はモデルをクラスという形で表すので、対象のモデルはクラスです。どのように正しくクラスを定義するか?という課題について、「5つの原理」があります。
【オブジェクト指向原則1】単一責務の原則
この原理は、クラスを修正する理由が1つ以上あってはいけないという意味です。この1つというのがどのような単位なのかが難しいところですが、そのクラスの性質と異なる変更理由が他に存在していないという意味で、基本的にクラスの責務にあった変更しかしてはいけないということを言っています。
例えば、数学の先生Aと物理の先生Bがいたとします。先生AとBは、それぞれ、数学や物理を教えるという「役割」を持っています。ところが、ここで、数学と物理の両方を教える、科学の先生Cが登場したとします。この時、先生Cの役割と先生A、Bの役割は重複しています。これを言葉の問題だと捉えると、「科学」という言葉が、「数学」「物理」を含んでいる意味になっているので、役割が被ってしまいます。「科学」という言葉と、「数学」「物理」という言葉ではレベル(抽象度)があっていないのです。
オブジェクト指向では、このような役割の重複にならないように、言葉のレベル(抽象度)を合わせた役割(或いはクラスの名前)にする必要があると言っているのが、「単一責務の原則」で言っていることです。
【オブジェクト指向原則2】インターフェース分離の原則
これは、「単一責務の原則」のインターフェース版です。「単一責務の原則」では、クラスの責務について言及しているのに対して、「インターフェース分離の原則」はクラスのインターフェースに言及している。
例えば、ホテル業務の例を考えてみましょう。もし予約を受け付けるような受付クラスと客室を掃除するような清掃クラスの責務が1つのクラスとして設計されている場合、それは「単一責務の原則」に違反するかもしれないです。なぜなら、掃除の責務は、受付という概念とは異なるからです。
一方で、受付クラスが予約を受け付けるというインターフェースと掃除機を使うというインターフェースの両方を持っている場合は、「インターフェース分離の原則」に違反するかもしれないです。「インターフェース分離の原則」は「「単一責務の原則」」と、クラスとインターフェースという点で異なりますが、同じ責務の違いに注目しているという点で同じであると言えそうです。
【オブジェクト指向原則3】依存関係逆転の原則
この原則は、「上位概念は下位概念に依存してはならない」ということを言っています。よく考えてみれば、これは単純な話です。例を挙げて説明しましょう。
例えば、「犬」の上位概念を「動物」としましょう。もし「犬」が「猫」に変わっても、依然として、「猫」の上位概念は「動物」で違和感がないです。ところが、「動物」の上位概念が、「犬」だった場合はどうでしょうか?この場合、「犬」というカテゴリに、すべての「動物」が分類されることになりますが、すべての動物が「犬」に分類されるわけではないので、おかしな関係と言えます。
仮に、「動物」の代わりに「猫」を設定すると、「猫」の上位概念が「犬」となり、やはり、何だかおかしなことになります。どこで間違ったのか?というと、初めの「動物の上位概念が、犬」というところで間違っています。「依存関係逆転の原則」では、例に挙げた、「犬」と「動物」の関係のどちらが上位概念で、どちらが下位概念であるかを考えようと言っています。
【オブジェクト指向原則4】オープンクローズドの原則
”オープン”とは、「何かするのが簡単」という意味です。一方、”クローズ”とは、「何かするのが難しい」という意味です。では、何に対して”オープン”なのか?ということですが、これは、「責務」に対する機能の拡張です。
例えば、「数学の先生」Aを定義した場合、「数学の先生」という責務に対しては、機能を拡張しやすくする必要があるということを言っています。
一方、”クローズ”は、責務外の変更に対するものです。例えば、「数学の先生」Aを定義した場合、Aに「物理の先生」という責務を追加しようとした場合に、機能を拡張しにくくなっている必要があるということを言っています。
つまり、責務に基づいてクラスの機能を拡張できるが、その変更はその他のクラスに影響しない。 ということを言っています。結局、この原理は、私達に責務という抽象的な観点でクラスの正らしさを尋ねています。
【オブジェクト指向原則5】リスコフの置換原則
この原則は、親クラスと子クラスの関係性のことを言っています。子クラスは親クラスと置き換え可能であることを言っているのですが、これは、子クラスは親の性質を引き継いているので、置き換え可能だととっています。
例えば、「動物」の下位概念に「犬」を定義したとしましょう。仮に、「動物」としての性質を、「意思をもって動く」とした場合、下位概念としての「犬」もこの「意思をもって動く」という性質をもっていなければならない ということを言っています。
つまり、私達は、親クラスの性質を引き継いだ子クラスを定義しなければなりませんが、この原理では、そのチェック方法として「置き換えてみる」という具体的なチェック方法を提示しています。
オブジェクト指向の5つの原則が言いたいこと
これら5つの原則は、簡単に言えば、全て、クラス定義の正しさについて言及しています。なので、これらの原則は、私達があるものをモデル化し、クラスを作った時に、そのクラスは
「正しく定義できているのだろうか?」
という確認する為のチェックシートとして使うことができます。
クラス設計を実施する
いかがだったでしょうか?
オブジェクト指向のクラス設計には、5つの原則があり、それらは、この世の中のあらゆる現象からシステム構築のために「どのようにモデル化するか?」ということを示してくれています。
しかし、原則を学んだだけでは、設計ができるようになりません。設計できるようになるためには、実施に手を動かす必要があります。
オブジェクト指向言語と呼ばれるものがあります。pythonは1つのオブジェクト指向型のプログラミング言語です。
下記の記事では、pythonプログラミングの初心者向けの記事を紹介しています。pythonプログラミングの初心者の方は、読んでください。
pythonに限らず、「プログラミングする環境をどのように整えればよいのか?」という声に答えるために、
ブログ用のレンタルサーバでプログラミングする方法を下記の記事で紹介しています。プログラミングする環境を整えたい方はこちらを読んでください。