id:den2snさんが「オブジェクト指向汚染」という
なかなか刺激的なタイトルのエントリを書いておられます。
手段(オブジェクト指向やデザパタ)を目的にしないように気をつけましょう、
という内容だと理解。
ということで私は最近アンチオブジェクト指向目線で
ほんとにそのパターン導入は有効なのか、過度に複雑に
なっていないかを考えるようにしています。案外オブジェクト指向で設計するよりも
if文を使った方がスマートになる場合があります。シンプル イズ ベストということで。
とても大事なことですね。
役に立つ道具も、使い所を間違えては逆効果、
といったところですか。
私はオブジェクト指向積極利用派ですが、
それ故に、その恩恵を最大限に受けられるようにしたいと思っとります。
で、以下のことを考えることが多いです。
- 自然な思考で理解できること
- 抽象データ型
- OCP(Open-Closed Principle)
自然な思考
自然な思考でコードや設計を理解できることが重要だと思ってます。
私も通常、第1選択はif文ですが、
それはアンチオブジェクト指向の目線というよりは、
それが自然に頭に浮かんできた選択だからです。
その後、複数個所に同じif文が出てくるようであれば、
「何かアヤシイな〜」と別案(ポリモーフィズムやデザパタ)を考え始めます。
逆に自然に頭に浮かんで来たのが、
オブジェクト指向っぽいコードや設計であれば、
それを第1選択にします。
抽象データ型
Lowレベルのデータ型(intやStringみたいなの)が剥き出しなのは、
あまり好きじゃないです。
で、それらを隠蔽すべく
- まとめて
- 抽象化(名前付け)
します。
例えば、レンタル会員の会員番号が「店舗の番号」+「連番」だとすると
hoge(int storeNo, int serialNo);
とするよりも
hoge(MemberCode memberCode);
とした方が分かりやすい。
ループカウンタとかローカル変数であれば、どうでもいいんですが、
オブジェクトのインターフェースレベルに影響を与えている場合は、
かなーり不吉な匂いを感じてしまいます。
このインターフェースは、意味を正しく表現しているのか、と。
この辺りが上手くいっていないと、
インタフェースが安定せず、
変更が色んなとこに波及してしまうような、
脆い設計になっていることが多い気がします。
OCP(Open-Closed Principle)
OCPを満たしている状態*1が、
オブジェクト指向を最高に活用できてる状態だと思ってます。
振る舞いのバリエーションが多いところや、
振る舞いが変更されやすいところ、
あるいは振る舞いの変更が発生したところ等に、
OCPを満たすような設計を導入します。
で、OCPを満たす手段としてデザパタがある、と。
シンプルであること
シンプル イズ ベストということで。
全く同意です。
私は、シンプルであるということは、
「作業せずに済む量を最大限に引き上げること*2」
だと思っています。
また、それは目の前のプロジェクトだけではなくて、
システムのライフサイクル全体を視野に入れた上で考えることだ、と。