私は一時変数を避け、より流動的なコーディングスタイルを使用できる条件付きの過剰使用を回避しようとする段階を経ています。返品する必要のある価値を手に入れたい場所で使用するのがとても好き#tap
ですが、返品する前に何かをしてください。
def fluid_method
something_complicated(a, b, c).tap do |obj|
obj.update(:x => y)
end
end
対 手順:
def non_fluid_method
obj = something_complicated(a, b, c)
obj.update(:x => y)
obj # <= I don't like this, if it's avoidable
end
明らかに上記の例は単純ですが、それでもこれはルビーコミュニティではかなり一般的なコーディングスタイルです。#inject
オブジェクトを一連のフィルターに通すためにも使用することがあります。
things.inject(whatever) do |obj, thing|
thing.filter(obj)
end
対 手順:
obj = whatever
things.each do |thing|
obj = thing.filter(obj)
end
obj
今、私は次のような条件の繰り返しの使用に直面しており、それを処理するためのより流動的なアプローチを探しています。
def not_nice_method
obj = something_complex(a, b, c)
if a_predicate_check?
obj.one_more_method_call
else
obj
end
end
(わずかに)よりクリーンな解決策は、重複を犠牲にして一時変数を回避することです。
def not_nice_method
if a_predicate_check?
something_complex(a, b, c).one_more_method_call
else
something_complex(a, b, c)
end
end
でも、ここのようなものを使いたいという気持ちを感じずにはいられません#tap
。
ここで他にどのようなパターンに従うことができますか。これはすべて一部の人にとっては無意味な砂糖であり、もっと興味深い問題に移るべきだと思いますが、もっと機能的なスタイルで書くことを学ぼうとしているので、長期的なルビイストが何を決定したのか興味がありますこのような状況に取り組む良い方法であるために。これらの例は非常に単純化されています。