簡単なデザインパターン例
独習Rubyに乗ってたパターンをメモ代わりに書いておく。
Template Methodパターン
一番単純で分かりやすいパターン。フレームワークでよく使われる。YOUたちこのメソッドオーバーライドして実装したらいいよっていうもの。
class CellPhone def call end def receive end def sendMail puts "send love mail!" end end class Docomo < CellPhone def call puts "xperia絶好調ですね" end def receive puts "ドコモ2.0はなんだったの?" end end class Au < CellPhone def call puts "はやくiPhoneに機種変したい" end def receive puts "着うたが流行った頃はよかったのに" end end phone = Docomo.new phone.call #=> xperia絶好調ですね phone = Au.new phone.call #=> はやくiPhoneに機種変したい
とてもわかりやすい。
Stateパターン
状態をオブジェクトして保有することで、その状態にあったプロパティとメソッドを実行させることが出来る。業務アプリで使えそうなパターン。
//クライアント class Aircon attr_accssor:operation_mode def initilize(mode) self.operation_mode = mode self.operation_mode.start end end //状態定義 class OperationMode def start end end class CoolMode < OperationMode def start puts "冷房" end end class HotMode < OpertaionMode def start puts "暖房" end end class BlowMode < OperationMode def start puts "送風" end end class DryMode < OperationMode def start puts "ドライ" end end aircon = Aircon.new(DryMode.new) # => ドライ aircon = Aircon.new(CoolMode.new) # => 冷房
みたいな。
インターフェイスが必要なくて共通するメソッドを勝手に抽象化してくれるRubyの言語仕様のおかげで、とてもわかりやすいなぁと思うのは気のせいか。Javaだとインターフェイス→抽象クラス→具象クラスって感じで直感的に分かりにくい。
デザインパターンに(恐らく)共通するのは、機能の追加や修正に対して今あるコードに手を入れるのではなく状態やふるまいを追加することで対応する、っていうポリシーだなぁ。堅牢なコードってのはこういうのを言うんだぜっていう先人のメッセージを感じた。
だけど、ココ理解不足なんだけど、いくらデザインパターンを適用しても公開したインターフェイスを叩く場合は、どのインスタンスなのかを明確にする必要がある気がして、そこなんとかなんねーのって思ってた。
まさにこれ。ここで俺のプログラマとしての進化は止まった。なぜならその後スーツになったからw
ファクトリーでもステートでも何でも良いんだけど、自分が欲しい具象クラスのオブジェクトを得る所の条件分岐は不可避じゃないかな、と。ステートが1個増えたらif/elseが一個増える。で、そこでif/else増やしたくないから、そこも外に追い出してオブジェクト化するのかなー。
多分そこでYOUたちDIすればいいじゃんってことで依存性の注入は全部外部に出してパターン化すればif/else不要になって引数渡せば全部オッケーイという流れになって、でもXML書くの辛いから規約作ってメタプログラミングを駆使した(アノテーションのようなもんだと勝手に理解してる)フレームワーク(SAStrutsやRails)が命名規約をベースに空気呼んで初期化すればいいんだよって話になって、今に至るのかな。
「インスタンス生成の部分のコードでは結局ifやswitchがあるじゃん」っていうお悩みに対して、どう考えればよいのだろう?
よろしい、ならばidコールだ。id:daisuke-mを召還する・・・!