これ僕.com:行動分析学マニアがおくる行動戦略

意図と行動のギャップから生じる「不自由さ」への挑戦。果たして僕たちに自由はあるのか?

OOPの使いどころ

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
だと思っています。
また、それは目の前のプロジェクトだけではなくて、
システムのライフサイクル全体を視野に入れた上で考えることだ、と。

*1:既存のコードに影響を与えずに、振る舞いを追加できる状態

*2:[http://www.metabolics.co.jp/XP/AgilePrinciples.html:title=Agile Alliance]より