VB.NETを咥えてWindows.Formsをつつく5-継承2。継承の甘い罠にご注意♪
ドリィちゃん「それを言われると・・・説明し辛いわねぇ。貴方が微妙なもの作るからεπιστημηさんも中の人も困っていたじゃない。こういった間違いは現場でも起こるんだけど一番厄介ねぇ・・・」
ちゃんと動いているんだからいいじゃん♪ボクこの逃走ボタンをバージョンアップして、次はキー入力も受け付けないようにしようと思っているんだ♪今のままだとキー入力で押下されるからね♪
ドリィちゃん「どういったらいいんだろう・・・そうだ!実装する際に使う場面考えた?どういう局面で逃走ボタンは使うの?」
えっ?・・・・・いやぁ、面白いと思って、コンパイルしたらちゃんと動いていたから・・・えっと、使う場面は後で考えるピヨォ・・・
ドリィちゃん「それは継承の甘い罠❤に嵌っているわ。確かに継承は便利な機能で、覚えたての頃は誰でも使いたくなるけど、もともとプログラム言語は何のためにあるのかしら?」
それは・・・誰かの仕事を助けて社会の役に立つためピヨ。
ドリィちゃん「?!貴方の口からそんな真面目な答えが帰ってくるとは思わなかった。ちょっと驚いたたわ。それはさて置き。その答えは正解よ。という事は、目的があって使うものよね?」
あっそうか!ボクはプログラムやコンパイラの機能だけを考えて作ったから、手段が目的になっていたんだね。
ドリィちゃん「そうよ。わかればよろしい❤遊びの時はいいんだけど、その調子で設計を考えたらプロジェクトは破綻するわよ。だから、プログラミングを学ぶ時は文法を機械的に覚えたり、使いたい機能を設計に反映したりせず、常に目的を意識して機能を選択しないと駄目よ。とくに継承は生産性が高いから、逆に広い意味でのバグも効率的に生産できてしまうわけよ。」
わかったよドリィちゃん。継承の文法じゃなくて、実務を意識した使い方を追求していくピヨ♪
ドリィちゃん「じゃあね、今回は特別に継承の整合性を判断するための項目を教えてあげる❤」
【5つの継承チェック項目】
- 継承の元となるクラスと、そのクラスの定義を継承するクラスの目的は一致していますか?
- コードの行数だけで「面倒だから派生しよう」と脊髄反応的に継承の機能を使っていませんか?現在は同じコードが多くとも、クラスの定義が違えば共通するコードは将来減ります。
- 意味的に正しい継承関係ですか?多くの人が納得できる継承関係じゃないとコードの保守性が下がります。
- そのクラスが持つメソッドは本当に同じ意味ですか?継承の元となるクラスとこれから作ろうとしているクラスのメソッドは同じ意味ですか?メソッドは動詞で命名する事が多いので、偶然同じ名前になっていることがあります。その様な場合はインターフェースを検討するのがいいでしょう。
- そのクラスの使うべき局面を詳細に説明できますか?
ドリィちゃん「大まかなチェックはこれでいいと思うわ。この5つの項目をパスできない場合継承以外の手段も検討してね❤コツはコードベースで物事を考えないで、現実的に考える事よぉ。あと、クラスの階層はあまり深いと駄目よ!普通は2,3を目安にしてね。」
う~~~ん。ドリィちゃんボクこれじゃあ分からないよ。コードもないしね・・・ボク具体例がないと分からないピヨォ。
ドリィちゃん「そっか。仕方ないわね。次回以降サンプルコードを交えて具体的に説明するわ。」
わーい♪そうこなくっちゃ♪
ドリィちゃん「次回へ続く。」