暴いておやりよOOバッキー[3]
筆者が非オブジェクトな時代から今まで経験した、オブジェクト指向での自らの失敗を取り上げてOOバッキ-に断罪させるコーナーです。
登場人物
OOバッキー: 性格が悪い子猫。オブジェクト指向の勘違いを指摘していじめるのが何より好き。 U君: OOバッキーの飼い主。いつもOOバッキーにいじめられている。気が弱い。オブジェクト指向の初心者。
- OOバッキー:
- ニャー!俺OOバッキー。オブジェクト指向の勘違いを探しにやってきた子猫なんだ。勘違い野郎はどこにいるのかニャー。
- U君:
- OOバッキ-。今度僕が考えた構造でものっすごくコード量が減って、重複が少なくなったんだ。
public class CreateCatalogCommand { public void execute(){ : } protected Catalog doServiceMethod() throws ApException{ : SessionBeanのカタログ生成のサービスを呼ぶロジック : } } public class UpdateCatalogCommand extends CreateCatalogCommand { protected Catalog doServiceMethod() throws ApException { : SessionBeanのカタログ更新のサービスを呼ぶロジック : } }
- U君:
- 僕は気づいたんだけど、このカタログの更新と、新規作成でやってることは、SessionBeanの更新メソッドか、生成メソッドを使うかというだけで、画面からカタログの項目をとってきて、 カタログオブジェクトにセットすることや、サービスから帰ってきたカタログオブジェクトを再度画面に渡すこととか、他はみんないっしょなんだ。だから、更新はCreateCatalogCommandを 継承してdoServiceMethod()を上書きするだけで出来ちゃうんだよ。
- OOバッキー:
- にゃ~。(ため息)
- U君:
- え?
- OOバッキー:
- オブジェクト指向の3大基礎のうちのもっとも理解しやすい「継承」すら理解していないようだニャー。
- U君:
- どこが!継承使ってるじゃないバリバリに。重複もないよ。
- OOバッキー:
- じゃ継承ってどういうことだニャー?
- U君:
- 差分コーディングだろ?AクラスとBクラスがあって、Aクラスのメソッドと違う部分と追加部分だけBに書けばいいんでしょ?
- OOバッキー:
- にゃ~。(ため息)それだったら、継承は機能が同じだったら継承するのかにゃ?オブジェクト指向は「オブジェクト(もの)」 が同じだから継承するんだニャ。たとえば「商品」を継承した「一般商品」と「特売品」はどちらも「商品」だから「商品」を 継承している(性質を引き継いでいる)んだニャー。機能が同じだからじゃないんだニャ。ご主人様はここでも非オブジェクトだニャ。
- U君:
- ハイハイ。どうせ僕は非オブジェクトですよ。なんかよく意味わからんけど。
- OOバッキー:
最近は外国ではスクイークとやらで、子供でもオブジェクト指向やってるらしいニャー。ご主人様は、猫の俺様と子供以下だニャ~。
ご主人様の例では、図でいくとこうなるニャ。
- OOバッキー:
- この例ではたまたまやっていることが同じなだけであって、どう考えても「カタログの更新」は「カタログの登録」じゃないニャー。さっきの 商品の例だと「一般商品」も「特売品」も「商品」だニャ。だからやるとしてもせめてこんな風にするとまだましだニャ。
- OOバッキー:
これだったら「カタログを更新する命令」も「カタログを登録する命令」も「カタログを操作の命令」といえるので、継承として考えられん事もないニャ。
「機能が同じ」だから「継承」すると、スーパークラスがぶくぶくに膨れて、ほとんど共通関数の塊みたいな「何でもクラス」になって、 それを修正するととんでもなく影響範囲が大になったりするニャー。
Javaとかでコーディングするときは、頭の中や紙でモデルみたいなものがあってそれをJavaに置き換えるイメージでやったほうがいいんじゃないかニャー。
- U君:
- なるほど。僕もこんな感じで努力していたら、○ーチンファウラーみたいになれるかなぁ。
- OOバッキー:
- 努力じゃなくて、単なる無駄だニャ。今のままじゃ、180年以上はかかるんじゃないかニャー。(きっぱり)
こうして今夜もOOバッキーはオブジェクター志望U君を夢から現実に引き戻すのであった。
暴いておやり、ねぇ子猫。僕の育てたOOバッキー。おなかつつけば語りだす真実を・・・。
- OOバッキーその3