ここまではオブジェクト指向「プログラミング」について説明してきました。
ここで、もう一つの「オブジェクト指向○○」である、「オブジェクト指向分析設計」について見てみましょう。
クラスをどう作る?
これまで説明してきた内容は、「クラスをどう書くと、インスタンスはどう動くのか」というものでした。
でもそのまえに、「どういうクラスを作るのか」という問題があります。
たとえば、みかん農家の方が、家業をIT化したいとIT企業に依頼したとします。
みかん農家では、数品種のみかんを作っていたとします。各品種のみかんについてどの場所にどれだけ作付けするか、今どれだけ育っているか、といった栽培の管理や、みかんを販売する際に、どの品種をどこの卸にどれだけ販売したのか、また個人顧客への通販で誰にいつ何個売ったのか、そしてそれらの売上やコスト、利益を計算する――そういったことをIT化したいとします。
さて、このITシステムをプログラムで作る場合、どのようなクラスを作ればいいのでしょう。
たとえば品種名や個数といった情報をどのクラスのフィールドに持たせるのか、栽培行程と日付のチェックや利益計算といった処理をどのクラスのメソッドで行うのか――そういった「クラスの設計」が必要になります。
しかし、これは一筋縄ではいきません。それこそ、1つのクラスにpublic staticフィールドを作って全データをそこにぶち込む方法から、数百というクラスを作って細かく分ける方法まで、様々な方法があります。
そうして作られた「クラスの設計図」のできによって、実際にプログラムを作る段階で、作りやすかったり作りにくかったり、修正が容易だったり難しかったり、再利用がしやすかったりしにくかったり、と作りやすさが大きく変わってきます。
リアルに存在するものをITのシステムに置き換えるということは、かなり自由度の高いことなので、それだけ難しいということです。
オブジェクト指向分析設計
そこで出てきたのが「オブジェクト指向分析設計」という方法です。
オブジェクト指向分析設計は、現実社会の「仕事」や「情報」を抜き出し、それらを「オブジェクト」と見なし、それを元にクラスを設計するという方法です。
たとえばみかん農家の例で言えば、みかんの作付け管理や、財務計算、通販を行うといった「仕事」と、それらの仕事の間を行き交う、帳票や顧客伝票といった「情報」があります。
「仕事」は「行う人」ごとにまとめ、「情報」は「紙」などのメディア単位に分け、それらを「オブジェクト」とみなします。そうすると、「仕事」はメソッド(もしくはそれをまとめたインタフェース)、「情報」はフィールドになるというわけです。
そして、これらオブジェクト同士の関係でシステムを設計し、オブジェクトの元になるクラスの設計図を作る――それが「オブジェクト指向分析設計」です。
オブジェクト指向分析設計には様々なメリットがあります。
まず設計がしやすいというメリットがあります。
オブジェクト指向分析設計では、現実社会の「人」や「物」がそのまま「オブジェクト」になって、そこからその設計図となる「クラス」を作る――そうして自然にクラスを設計することができるため、設計が比較的簡単にできます。
次に、全体の構造が分かりやすいという点が上げられます。
現実社会の「仕事」や「情報」を元に作られているため、作られた図は現実社会に似ます。クラスが持つ機能やクラス間の関係を理解しやすくなり、全体を見通せるようになります。
また、オブジェクト指向プログラミングに向いているということも上げられます。
オブジェクト指向分析設計は、クラスやインタフェースを設計することになるため、そのままオブジェクト指向プログラミングで作ることができます。まさにオブジェクト指向プログラミングのための設計書と言えます。
これらのメリットがあるため、設計手法として非常によく使われています。
車とかタクシーとか
「オブジェクト指向」の本を読むと、「クラス」を「車」とか「タクシー」とかにたとえている場合が非常に多いです。
これはこの「オブジェクト指向分析設計」の考え方が含まれているからです。
オブジェクト指向分析設計の場合、現実の「物」が「オブジェクト」になりますから、オブジェクトの設計図になるクラスも、当然「物」を表現したものということになります。
また逆に言えば、Javaの機能でこの「物」を表現することができます。オブジェクトの「情報」をフィールドで表し、オブジェクトの「仕事」をメソッドで表すことで、現実に存在する「物」をプログラムで表現できるわけです。
また、この「物」的な考え方は、プログラミングからちょっと離れているため「わかりやすそう」という感じがあります。
いきなり「class なんたら~」から始まるよりは、「車やタクシーをそのままプログラムにしたものなんだよ」という方が口当たりがいい、ということもあって、オブジェクト指向プログラミングを学ぶ時にこういった例が出てくるのだと思われます。
ですが、このような「インスタンスは<物>の代わり」という考え方と、Java言語としての機能は別です。
確かに、フィールドやメソッドを使うことで「物」を表現することは可能です。でもそれは「手段として可能」というだけで、「インスタンスは物」ということではありません。
実際、現実には「クラスからインスタンスを作る」という概念や、継承やポリモーフィズムといった機能をそのまま当てはめられる現象はあまりありません。Javaの機能を使って擬似的に現実を模倣することは可能ですが、それは「物」そのものではなく、またその部分にこだわるとJavaの機能を無駄にしてしまう可能性があります。
なので、「オブジェクト指向分析設計」と「オブジェクト指向プログラミング」は分けて考えた方がいいでしょう。
このコンテンツで紹介してきたJavaの機能は「オブジェクト指向プログラミング」です。
クラスからインスタンスを作り、インスタンスはフィールドとメソッドを持ち、継承して拡張し、オーバーライドしてひも付けし、アップキャストでポリモーフィズムし、インタフェースで実装と分ける――こういった機能を皆さんはもう使いこなせるはずです。
それと「オブジェクトは車とかタクシーを表したもの」という考え方はまったく別。
この考え方は「オブジェクト指向分析設計」で、いかに現実社会をクラスに置き換えるか、そういう設計技法であって、それを実際に実現するのが「オブジェクト指向プログラミング」ということになります。