読者です 読者をやめる 読者になる 読者になる

Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

簡単なデザインパターン例

独習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書くの辛いから規約作ってメタプログラミングを駆使した(アノテーションのようなもんだと勝手に理解してる)フレームワーク(SAStrutsRails)が命名規約をベースに空気呼んで初期化すればいいんだよって話になって、今に至るのかな。

インスタンス生成の部分のコードでは結局ifやswitchがあるじゃん」っていうお悩みに対して、どう考えればよいのだろう?

よろしい、ならばidコールだ。id:daisuke-mを召還する・・・!

あわせてよみたい

ポリモーフィズムの例をもうちっと実用的に書いてみた。 - 都元ダイスケ IT-PRESS

DIのお話を書いてみる。 - 都元ダイスケ IT-PRESS