暴いておやりよOOバッキー[2]
筆者が非オブジェクトな時代から今まで経験した、オブジェクト指向での自らの失敗を取り上げてOOバッキ-に断罪させるコーナーです。
登場人物
OOバッキー: 性格が悪い子猫。オブジェクト指向の勘違いを指摘していじめるのが何より好き。 U君: OOバッキーの飼い主。いつもOOバッキーにいじめられている。気が弱い。オブジェクト指向の初心者。
- OOバッキー:
- ニャー!俺OOバッキー。オブジェクト指向の勘違いを探しにやってきた子猫なんだ。勘違い野郎はどこにいるのかニャー。
- OOバッキー:
- ニャー。なんじゃこりゃ。これを書いたのはご主人様なのかニャー?
- U君:
- え、なんなの?僕のソースなんかおかしかったかなぁ。
public class JuchuMeisai { private String strProductCode; // 商品コード private String strProductName; // 商品名 private int iTanka; // 単価 private int iSuryou; // 数量 private int iKakaku; // 価格 /** * 価格取得の関数 **/ public int getKakaku(int tanka, int suryou) { iKakaku = tanka * suryou; return iKakaku; } :
- OOバッキー:
- ニャー。やっぱりご主人様だったのかニャー。芸術的な非オブジェクトだニャー!
- U君:
- えぇ~。がんばって作ったのに。何がいけないのさ。
- OOバッキー:
人間、結果が全てだニャー。突込みどころ満載だから整理するニャー。
- 属性とローカル変数の違い
- カプセル化
- 接頭句
まず、1.だニャー。getKakaku()の中で価格は数量と単価で求められているから、private int iKakakuはまったく不要だニャー。 たまにクラスの属性を変数の定義みたいにして使っている人がいるけど、まさにご主人様だニャー!
- U君:
- え~。クラスの最初の変数って、Cをやってるときは最初に定義したよ?
- OOバッキー:
ダサダサだニャー。オブジェクトはデータとロジックをもっているが、クラスが持っているデータを属性というのだニャー。 それを表しているのが、メソッドの外に書いている定義(private String ...など)なんだニャー。 メソッドの中で使用する変数だからじゃないんだニャー。
次に2.だニャー。価格を取得するメソッドgetKakaku()だニャー。
- U君:
- えへん。たとえば受注明細に関するロジックは受注明細クラスに書くんだろ。だからこう書いたんだ。文句あるの?
- OOバッキー:
- だから素人は困るんだニャー。ママに電話でもしたほうがいいんじゃないかニャー。
- U君:
- (涙)僕は猫以下なんかなぁ。
- OOバッキー:
そのとおりだニャー。
これだと、たとえば引数の数が変わったら、このメソッドを使っているクラスは全て変更だニャー。 変化ヲ抱擁セズで、変化ニ法要サルという感じだニャー。南無阿弥陀仏。
- U君:
- じゃどうするんだよ。
- OOバッキー:
- こうだニャー!
public int getKakaku() { return getTanka() * getSuryou(); }
- OOバッキー:
- 受注明細のクラスはすでに単価と数量を持っているんだから、それで計算すればいいので、引数なんていらないニャ。ご主人様のコードだと引数で、単価と数量を渡しているので、逆に属性がなんの意味もないんだニャ。これだと、内部の計算ロジックが変わっても、getKakaku()を使っているクラスでは変更がないんだニャ。こんなのカプセル化の基礎だニャ。
- U君:
- なるほど。確かに便利そうだね。
- OOバッキー:
最後に3.だニャー。
属性とかにいちいちintのiだとかStringのstrとかつけるのはJavaとかじゃやらないニャー。接頭句をつけるのは、たとえばだらだらとした長いコードを書くときに、変数の型がわからなくなるからで、Javaでまともにコーディングすると、そんな長いメソッドができることはないから、そんなのつけるだけ、重複なんじゃないかニャー。意味のある名前を付けるほうがよっぽど重要だニャー。
- U君:
- でもJavaでも長くなることもあるよ。
- OOバッキー:
- それはクラスがちゃんと設計されていないんだニャー。逆に長くなったら、怪しい設計だと思うほうが健康なんだニャー。最後に俺様だったらこう書くってコードを見せてやるニャー。ローマ字を英語に変えているけど、そこはあまり重要じゃないニャ。俺様の趣味だニャ。コメントを取っているのも俺様のスタイルだニャ。コメントを書かないといけないようなところは、名前の付け方や複雑なロジックがあるようなケースが多いから、Javadocで必要なところと、どうしても説明できない部分にぐらいしか書かないニャ。
public class OrderLine { private String productCode; private String productName; private int unitPrice; private int quantity; /** * 価格を取得する * @return 価格 **/ public int getPrice() { return getUnitPrice() * getQuantity(); } :
こうしてU君が一生懸命作ったコードが今日もバッキーによって葬り去られたのでした。
暴いておやり、ねぇ子猫。僕の育てたOOバッキー。おなかつつけば語りだす真実を・・・。
- OOバッキーその2
- OOバッキーその3