Rubyでストラテジー

送別会 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時。
皆さん良い週末を。

Comments are closed.