Rubyでストラテジー
SONY ILCE-7 (35mm, f/4.5, 1/80 sec, ISO1600)
どもー。
やましもです。
今週からGMOペパボの福岡支社で働き始めました。
まだまだペパボのサービスに一切タッチしていないので
何がどうこうってわけじゃないんですが、
新しい環境で毎日刺激を受けて楽しく、
企業としての風土が素晴らしいな、なんて思う毎日です。
あと2週間位はトレーニングで養殖な環境なのでその間に
なるべく色々吸収します。
さて、今日は天神でぶらぶらしつつ、スタバでお茶してて暇だったので
rubyでストラテジーパターンを書いてみました。
なんでかわからないんですけど、いつも「ストテラジー」って言っちゃうんですよね。
なんなんでしょうねこれ。
ストラテジーパターンはアルゴリズムをまるっとクラス化して、
インターフェースは抽象クラスそのままに、
具象クラスを切り替えて使うようなパターンですね。
後々アルゴリズムが変わるようなときや、複数のフォーマットでの
ファイル出力が想定されるときなどに使えるパターンです。
ファクトリーとすごく親和性があるクラスだななんて思っています。
今回は2ファイルに分割してます。
GitHub デザインパターン
Converter.rb
[Ruby]
#インターフェースとなる抽象クラス
class AbsConverter
def output_line(arr)
raise “this method is abstract class method!!”
end
end
#具象クラス カンマ出力
class Comma_Converter < AbsConverter
def output_line(arr)
puts arr.join(',')
end
end
#具象クラス タブ出力
class Tab_Converter < AbsConverter
def output_line(arr)
puts arr.join("\t")
end
end
#切り替えクラス
class Context
def initialize(converter)
@converter = converter
end
def set_converter(converter)
@converter = converter
end
def output_line(arr)
@converter.output_line(arr)
end
end
[/Ruby]
AbsConverterがインターフェース相当の抽象クラス。
こやつを継承する形で、配列をカンマ区切りで出力するクラス、タブ区切りで出力するクラスを
定義しています。
Contextクラスは実際にConverterを振り分けるクラスで、コンストラクタでセットするか、
set_converterメソッドで自身のインスタンス変数にコンバーターをセットします。
Strategy.rb
[Ruby]
require ‘./Converter.rb’
arr = [‘ruby’,’rails’,’perl’,’psgi’]
converter = Context.new(Comma_Converter.new())
puts ‘1.カンマコンバーターの出力’
converter.output_line(arr)
puts “\n”
converter.set_converter(Tab_Converter.new())
puts ‘2.タブコンバーターの出力’
converter.output_line(arr)
[/Ruby]
実際の使用例がこちら。
arrという配列に[‘ruby’,’rails’,’perl’,’psgi’]を格納し、
それを各コンバーターから出力しています。
実行結果
[Shell]
~/learn_perl/DesignPettern/Strategy (master) % ruby Strategy.rb [15:05:13]
1.カンマコンバーターの出力
ruby,rails,perl,psgi
2.タブコンバーターの出力
ruby rails perl psgi
[/Shell]
あー、もう15時。
皆さん良い週末を。