Ruby ブロック付きメソッドの活用
普通は、スクリプトを読みながら、どういう順序・条件で処理が進むのかを調べる。
それがつらい。処理の詳細を見ないと、実行順や分岐の条件が分からないのがつらい。
だから、実行順や分岐の条件を、処理の詳細から分離する。
OOPのTemplateパターンやStateパターンを使えば、実現できる。だが、他に良い方法は無いだろうか。
if group == '乃木坂46' func1 func2 func3 elsif group == '欅坂46' func1 func3 func4 end
上記のように書けば、実行順と分岐が分離できたことになる。
うーん、でも何と言うか…。メソッド間の結合が弱いというか。
func1 と func2 の順番を逆にすることもできるし、間に処理をスッと挟むことも出来る。簡単に改変できるのが気持ちが悪い。
そこで、以下のような形を考えた。
def f1 p 1 yield end def f2 p 2 yield end def f3 p 3 end f1 do f2 do f3 end end # 1 # 2 # 3
ブロック渡しをする。PHPやJavaScriptだと、無名関数でネストさせることになる。
副次的なメリットとして、次のメソッドに渡したい引数を、返り値に含める必要がない。
# 返り値経由で渡す result = func1 func2 result[:arg1] # 返り値に含める必要がない def func1 arg1 = 'foo' yield arg1 end func1 do |arg1| func2 arg1 end
うーん、イマイチかなぁ…。