システム開発をする上で必要となるのが「物事を抽象的にとらえる力」だと思っています。現時点の関心事に対して、それ以外の要素や項目の関連性を分析していく必要があります。そしてそれらを「表現」することが必要不可欠になります。
その際に、オブジェクトの関連性を見極めるためによく利用されるのが「is-a関係」と「has-a関係」という考え方です。
これは2つのオブジェクトがどのような関係性を持っているのか、を考える有用なフレームワークになります。まったくもって関係のない物事は関係性を持つことはありません。しかしながら、比較対象や関連性が疑われる場合において、それらのオブジェクトは上記の関係性で表されることが多々あります。
そのため、システム開発、特に設計業務に携わる人は絶対に知っておくべき概念ともいえるかもれません。実際の案件において、オブジェクトをとらえる際のキーワードとして理解し、考え方を活用してもらえればと思っています。
is-a関係は「継承」
「is-a 関係」は「分類」に相当します。英語で is を直訳すると「~であること」や「~である」という意味になります。例えば「人間は動物である」や「バスは車である」というような言い方ができます。「A は B である」「A は B の一種である」という考え方は、「A は B と同等である、もしくは、 A は B に含まれている」ということです。
この言い回しは特定の対象が「どの分類に属するか」を言い表していることがわかります。いわゆる「親クラス」や「スーパークラス」というような感じです。この特性をオブジェクト指向の三大原則に当てはめてみると「継承」に相当するのです。
プログラミングにおいて「分類」は複数のオブジェクトの特性を受け継ぐものではなく、「特定のオブジェクトの直系」として、親を含んで作られるものに該当するわけです。「分類」はオブジェクトの所属先を示す言葉であり、様々なオブジェクトが群を成して一つの「グループ」として語られるときに使われます。
こうした「分類」によってオブジェクトをとらえることは、特手のオブジェクトを起点として「~の一種である」という「一種のくくり」に分けていくため、たくさんのオブジェクトをグルーピングするのに役に立つ考え方になります。
has-a 関係は「コンポジション」
オブジェクト指向において「is-a 関係」と並んでよく出てくるのが「has-a関係」というものです。has は英語で直訳すると「~を持っている」と訳されますが、オブジェクト指向における「has」が意味するのは「機能」です。
たとえば「A has B」といった構文は「A は B を持っている」と訳せるように、A は B を「機能の一部」として宿していることになります。そのため、「has-a 関係」は「どんな特性(機能)を持っているか」を示すことになるのです。かなり雑になりますが、例えば「人間は歩く、走る、掴むなどの機能を持っている」という感じです。
「has-a関係」において重要となるのは、「継承」と異なり、複数を一つの機能に持つことができるということです。「is-a」は「オブジェクト自身」が属するモノを指していますが、「has-a」は「オブジェクトが何を持っているか」という「オブジェクトの中身」もしくは「オブジェクトの機能」を示しています。
先ほどの例であれば、人間というクラスに対して「走る」「歩く」「掴む」といった機能があり、それらは決して一つではありません。複数の機能を持っていて、それらによって「人間」というオブジェクトのアクションが定義されていることになります。このような関係性を「コンポジション」や「包含(含んでいる)」と言い、オブジェクトの「構成」を示すのが「has-a関係」になるのです。
is-a 関係と has-a 関係の違い
オブジェクト指向において頻出である「is-a」と「has-a」の関係性について解説しました。結論からまとめてしまうと以下のようにいうことができるでしょう。
- 「is-a」は「継承」でありオブジェクトの「分類」を示す
- 「has-a」は「コンポジション」としてオブジェクトの「構成関係」を示す
システム開発は様々なオブジェクトがお互いに干渉しあい、一つの目的のために動作をつみかさねていきます。そうしたオブジェクトたちがどのような関係性を構築しているかを考えるのに、is-a や has-a といったフレームワークを利用してグルーピングしていくことが有用になります。
オブジェクトの関係性に着目し、それらがどのように関係しているかを観察し、分析するために必要な考え方になります。この考え方を必ず使用する必要はないのかもしれませんが、「is-a や has-a の関係性が成り立つ可能性がある」を念頭にして設計を行っていくと整理がつきやすいと考えます。