孤独プログラマー譚

孤独死が近い。

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

ブロック渡しをする。PHPJavaScriptだと、無名関数でネストさせることになる。

副次的なメリットとして、次のメソッドに渡したい引数を、返り値に含める必要がない。

# 返り値経由で渡す
result = func1
func2 result[:arg1]

# 返り値に含める必要がない
def func1
    arg1 = 'foo'
    yield arg1
end

func1 do |arg1|
    func2 arg1
end


うーん、イマイチかなぁ…。