オブジェクト指向をはじめたばかりの頃は、何をオブジェクトとすればよいか悩むところです。 BERTRAND MEYER氏によれば、「オブジェクトはそこに転がっている」らしいですが、凡人の私にはそこに転がっている物が見えません。 オブジェクトを発見するための視点を以下のようにまとめてみました。
オブジェクトを発見するための視点たとえば、線を描くシステムを考えた場合、線はオブジェクト(クラス)でしょうか? 初期の段階ではオブジェクト候補と言えるかも知れません、でも実際に線を引くのは誰だろうと考えた場合、
class Line {
public void draw(int x, int y) {
// 線を引く処理
}
}
よりは、
class LineDrawer {
public void draw(int x, int y) {
// 線を引く処理
}
}
などとした方が、良いと私は感じます。
継承のお話しです。継承を正しく使いこなせるようになるとオブジェクト指向の9割を理解したと言っても過言ではありません。(うそ)
でも、継承を正しく使わないと、とんでもない物ができるのも事実です。
以下に汎化/特化を行う場合のポイントをまとめてみました。
そのまんまですね。(^_^;) スーパークラスとサブクラスの間でスーパークラス is a サブクラスの関係が成り立つかどうかです。
ちょっと難しいですねぇ。これは、人・従業員とあった場合に、従業員が人の特殊な種類なのか?特殊な種類ではなく、単なる役割なのではないか?と言うことです。
したがって、人<-従業員という継承関係はあまり良くないことになります。
これは、クラスとインスタンスの関係が理解できていれば何となく分かると思うのですが、人・子供・大人とあった場合に、「子供=みつき」は将来「大人=みつき」となるので、人<-子供や、人<-大人という継承関係は良くないということになります。
※「みつき」はうちの子の名前です。(^_^;
オブジェクト指向以前の開発手法では、何をどうやって行なうか?をモデリングしていましたが、オブジェクト指向 により、誰が何をどうやって行なうか?をモデリングできる(する?)ようになりました。
ここでは、オブジェクト指向の肝の一つとして、ある責任を誰(どのオブジェクト)が行うべきか?と言うことを説明します。
例えば、下記のようなクラス構造があったとしましょう。
ここで、社員が主任であるか、課長であるかを問い合わせるメソッドをどこかに定義したいと思います。
初心者にありがち(私も以前やってしまった)なのは、単純に社員クラスにisForeperson()(主任ですか?)やisChief()(課長ですか?)を追加してしまうことです。 これだと、部長が追加になったときに部長クラスの追加の他に社員クラスにも新たに問い合わせメソッドを追加することになり、あまりよろしくありません。
ここでは、主任クラス自体にhasRole(社員)と言ったメソッドを追加する方が良いでしょう。
+-------------+ +---------------+
| 社員 +---+ ロール |
+-------+-----+ +-------+-------+
|
+--------+---------+
| |
+------+------+ +------+------+
| 主任 | | 課長 |
+-------------+ +-------------+
あなたのご意見・感想をお送りください。
何かの理由でうまく送れない場合にはメール
でお願いします。