Convención Ruby para encadenar llamadas a través de múltiples líneas


¿Cuáles son las convenciones para esto?

Utilizo el estilo siguiente, pero no estoy seguro de que sea el preferido, ya que si me pierdo un punto al final puedo encontrarme con muchos problemas sin darme cuenta.

query = reservations_scope.for_company(current_company).joins{property.development}.
  group{property.development.id}.
  group{property.development.name}.
  group{property.number}.
  group{created_at}.
  group{price}.
  group{reservation_path}.
  group{company_id}.
  group{user_id}.
  group{fee_paid_date}.
  group{contract_exchanged_date}.
  group{deposit_paid_date}.
  group{cancelled_date}.
  select_with_reserving_agent_name_for(current_company, [
                                       "developments.id as dev_id",
                                       "developments.name as dev_name",
                                       "properties.number as prop_number",
                                       "reservations.created_at",
                                       "reservations.price",
                                       "reservations.fee_paid_date",
                                       "reservations.contract_exchanged_date",
                                       "reservations.deposit_paid_date",
                                       "reservations.cancelled_date"
  ]).reorder("developments.name")
query.to_a # ....

Entonces, ¿cuáles son las convenciones para encadenar métodossobre múltiples líneas y cuál debería preferir?

NOTA: No pude encontrar un buen ejemplo de la guía de estilo de codificación de Ruby .

Author: Dmytrii Nagirniak, 2012-10-16

4 answers

En realidad hay una sección sobre eso en la guía de estilo de Ruby :

Adopte un estilo de encadenamiento de método multilínea consistente. Hay dos estilos populares en la comunidad Ruby, los cuales se consideran buena ventaja . (Opción A) y final . (Opción B).

  • (Opción A) Al continuar una invocación de método encadenado en otra línea mantenga el . en la segunda línea.

    # bad - need to consult first line to understand second line
    one.two.three.
      four
    
    # good - it's immediately clear what's going on the second line
    one.two.three
      .four
    
  • (Opción B) Al continuar una invocación de método encadenado en otra línea, incluir el . en la primera línea para indicar que el la expresión continúa.

    # bad - need to read ahead to the second line to know that the chain continues
    one.two.three
      .four
    
    # good - it's immediately clear that the expression continues beyond the first line
    one.two.three.
      four
    

Se puede encontrar una discusión sobre los méritos de ambos estilos alternativos aquí.

 44
Author: Bozhidar Batsov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-06 23:44:53

En Ruby 1.9 + es posible escribir así:

query = reservations_scope
  .for_company(current_company)
  .joins{property.development}
  .group{property.development.id}
  .group{property.development.name}
  .group{property.number}
  .group{created_at}
  .group{price}
  .group{reservation_path}
  .group{company_id}
  .group{user_id}

Mucho más legible, creo.

 32
Author: detunized,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-16 00:55:37

Aquí hay una lista completa de pros y contras de cuatro opciones. Dos de las opciones no se han mencionado en ninguna otra respuesta.

Los pros y los contras se pueden dividir en únicos y compartidos. Los pros compartidos son los inversos de una estafa única de otra opción. Del mismo modo, los contras compartidos son los inversos de un pro único de otra opción. También hay algunos puntos que son pros para dos opciones y contras para las otras dos.

Para evitar repetir explicaciones, describo cada opción comparte pros y contras con solo un resumen de ese punto. Los detalles completos sobre un pro o con compartido están disponibles en la descripción de su con o pro inverso en la sección única de otra opción. Para los puntos que son pros de dos opciones y contras de las otras dos, arbitrariamente elegí poner las explicaciones completas en el conjunto que comienza con ". al principio de la línea".

Para una lista más corta que deja implícitos los pros y los contras compartidos en lugar de repetirlos, ver esta antigua versión de esta respuesta.


. al final de la línea

items.get.lazy.
  take(10).
  force

Pros

Compartido con solo otra opción:
  • Las líneas continuas se pueden comentar libremente, y los comentarios se pueden agregar entre líneas
  • Pegable en IRB/Pry
  • Soportado en Ruby 1.8
Compartido con otras dos opciones:
  • Cuando lee la línea inicial, está claro que la expresión continúa{[41]]}
  • Mucho de espacio horizontal para líneas continuas
  • No requiere alineación manual de caracteres en columnas
  • Se ve bien cuando se ve en una fuente proporcional
  • Tiene un mínimo de puntuación, reduciendo el ruido de escritura y visual

Cons

Exclusivo:
  • Las líneas continuas parecen extrañas por sí solas. Usted debe leer la línea anterior para entender que son una continuación.
    • La sangría no es un indicador confiable de que una línea continúa de la línea anterior, podría significar simplemente el inicio de un bloque.
Compartido con solo otra opción:
  • Al editar el código, es más difícil comentar o reordenar la última línea

. al comienzo de la línea

items.get.lazy
  .take(10)
  .force

Pros

Compartido con solo otra opción:
  • Al editar el código, es más fácil comentar o cambiar el orden de la última línea – no es necesario eliminar y agregar . o \.
Compartido con otras dos opciones:
  • Las líneas continuas se pueden entender cuando se ven por sí mismas{[41]]}
  • Un montón de espacio horizontal para las líneas continuas
  • No requiere alineación manual de caracteres en columnas
  • Se ve bien cuando se ve en una fuente proporcional
  • Tiene un mínimo de puntuación, reduciendo el ruido de escritura y visual

Cons

Exclusivo:
  • Cuando lees la línea inicial, no es inmediatamente claro que la expresión continúa
    • Si usa esto en su base de código, entonces cuando lea una línea, siempre debe verificar la línea después para asegurarse de que no afecta el significado de la línea inicial.
Compartido con solo otra opción:
  • El código se rompe silenciosamente si # comenta una línea continua, o agrega un comentario entre líneas
  • No se puede pegar este código en IRB / Pry sin que sea malinterpretado
  • No es compatible con Ruby 1.8 y versiones anteriores

. al principio de la línea, sangrada a la anterior .

items.get.lazy
         .take(10)
         .force

Pros

Compartido con solo otra opción:
  • Al editar el código, es más fácil comentar o cambiar el orden de la última línea – no es necesario eliminar y agregar . o \.
Compartido con otras dos opciones:
  • Cuando se lee la línea inicial, está claro que la expresión continúa
  • Las líneas continuas se pueden entender cuando se ven por sí mismas{[41]]}
  • Tiene un mínimo de puntuación, reduciendo el ruido de escritura y visual

Cons

Exclusivo:
  • El código de cada línea debe caber en menos espacio horizontal
  • Requiere la alineación manual de las .s en columnas
    • Es más fácil si tiene un complemento de editor para alinear texto, pero aún más trabajo que usar reglas de sangría predeterminadas.
    • Incluso si su la configuración de edición incluye un complemento para la alineación, las configuraciones de sus compañeros de trabajo no pueden.
  • El código se verá desalineado cuando se vea en una fuente proporcional
Compartido con solo otra opción:
  • El código se rompe silenciosamente si # comenta una línea continua, o agrega un comentario entre líneas
  • No se puede pegar este código en IRB / Pry sin que se malinterprete
  • No soportado en Ruby 1.8 y abajo
Compartido con otras dos opciones:
  • Al editar el código, es más difícil comentar o reordenar la última línea

\ al final de la línea, . al principio de la siguiente línea

items.get.lazy \
  .take(10) \
  .force

Pros

Compartido con solo otra opción:
  • Las líneas continuas se pueden comentar libremente, y los comentarios se pueden agregar entre líneas
  • Pegable en IRB/Pry
  • Soportado en Ruby 1.8
Compartido con otras dos opciones:
  • Cuando lee la línea inicial, está claro que la expresión continúa{[41]]}
  • Las líneas continuas se pueden entender cuando se ven por sí mismas{[41]]}
  • Un montón de espacio horizontal para las líneas continuas
  • No requiere alineación manual de caracteres en columnas
  • Se ve bien cuando se ve en una fuente proporcional

Cons

Exclusivo:
  • Requiere más mecanografía
  • Crea más ruido visual
Compartido con solo otra opción:
  • Al editar el código, es más difícil comentar o reordenar la última línea
 17
Author: Rory O'Kane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-29 04:24:04

La razón por la que elijo el punto al final de la línea es que le permitirá pegar código en una sesión IRB. Además, no puedes comentar las líneas en el medio del código de varias líneas si usas los puntos al principio de las líneas. Aquí hay una buena discusión para leer: https://github.com/bbatsov/ruby-style-guide/pull/176

 10
Author: rosenfeld,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-08 12:41:06