Método combinatório como toque, mas capaz de retornar um valor diferente?

Estou passando por uma fase de tentativa de evitar variáveis temporárias e uso excessivo de condicionais, onde posso usar um estilo de codificação mais fluido. Gostei muito de usar#tap nos locais em que quero obter o valor necessário para retornar, mas faça algo antes de devolvê-l

def fluid_method
  something_complicated(a, b, c).tap do |obj|
    obj.update(:x => y)
  end
end

Vs. o procedimento:

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

Obviamente, os exemplos acima são simples, mas esse é um estilo de codificação bastante comum na comunidade ruby. Às vezes eu vou usar#inject para passar um objeto por uma série de filtros também:

things.inject(whatever) do |obj, thing|
  thing.filter(obj)
end

Vs. o procedimento:

obj = whatever
things.each do |thing|
  obj = thing.filter(obj)
end
obj

gora, estou enfrentando o uso repetido de uma condição como a seguinte e procurando uma abordagem mais fluida para lidar com ela:

def not_nice_method
  obj = something_complex(a, b, c)
  if a_predicate_check?
    obj.one_more_method_call
  else
    obj
  end
end

solução (ligeiramente) mais limpa é evitar a variável temporária ao custo da duplicaçã

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

Não posso deixar de sentir o desejo de usar algoquas gostar#tap aqui embor

Que outros padrões devo seguir aqui. Sei que tudo isso é apenas açúcar sem sentido para algumas pessoas e que eu deveria passar para problemas mais interessantes, mas estou tentando aprender a escrever com um estilo mais funcional, por isso estou curioso para saber o que os rubiistas de longo prazo determinaram ser boas maneiras de lidar com situações como essa. Esses exemplos são extremamente simplificados.

questionAnswers(5)

yourAnswerToTheQuestion