Estoy pasando por una fase de tratar de evitar las variables temporales y el uso excesivo de condicional, donde puedo usar un estilo de codificación más fluido. Me gustó mucho usar #tap
en lugares donde deseo obtener el valor que necesito devolver, pero hago algo con él antes de devolverlo.Método combinatorio como tap, pero capaz de devolver un valor diferente?
def fluid_method
something_complicated(a, b, c).tap do |obj|
obj.update(:x => y)
end
end
Vs. el procedimiento:
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 los ejemplos anteriores son simples, pero esto es un estilo de programación bastante común en la comunidad de rubí, no obstante. A veces voy a utilizar #inject
pasar un objeto a través de una serie de filtros también:
things.inject(whatever) do |obj, thing|
thing.filter(obj)
end
vs. el procedimiento:
obj = whatever
things.each do |thing|
obj = thing.filter(obj)
end
obj
Ahora estoy frente a un uso repetido de una condición como la siguiente, y en busca de un enfoque más fluido a su manipulación:
def not_nice_method
obj = something_complex(a, b, c)
if a_predicate_check?
obj.one_more_method_call
else
obj
end
end
La solución (ligeramente) más limpio es evitar la variable temporal en el costo de la duplicación:
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
no puedo evitar sentir el deseo de usar algo casi como#tap
aquí sin embargo.
¿Qué otros patrones podría seguir aquí. Me doy cuenta de que todo esto no es más que un sinsentido de azúcar para algunas personas y que debería pasar a problemas más interesantes, pero estoy tratando de aprender a escribir con un estilo más funcional, así que solo tengo curiosidad por saber qué determinaron los rubyistas a largo plazo. ser una buena manera de abordar situaciones como esta. Estos ejemplos están enormemente simplificados.
Con el riesgo de ser pedante, parece que su uso del grifo para inducir efectos secundarios es antifuncional.Los programadores funcionales y los lenguajes evitan o previenen los efectos secundarios. El punto de toque es que no devolverá lo que se ejecuta en él. Por lo tanto, se puede usar de dos maneras: depuración y métodos que inducen efectos secundarios. La forma funcional es simplemente encadenar métodos juntos o componerlos. –
Sin riesgo, me gustaría hablar teoría, aunque me temo que este hilo se cerraría si no hay una pregunta directa, sin embargo, dado que '# update' devolvería un booleano, no el valor de' obj' (que está más allá mi control), ¿no soluciona la necesidad de una tercera expresión para devolver el valor original? Me gustaría entender más técnicas funcionales correctas :) – d11wtq
Ah, veo cómo podría cambiar eso: 'update (something_complex (a, b, c))', donde he definido 'update' para hacer' argument.update (: x => y) '... aunque esto se vuelve más detallado ya que los parámetros de actualización necesitan pasar. – d11wtq