web-dev-qa-db-fra.com

Ruby convention pour enchaîner les appels sur plusieurs lignes

Quelles sont les conventions pour cela?

J'utilise le style suivant, mais je ne suis pas sûr que ce soit le préféré car si je manque un point à la fin, je peux rencontrer beaucoup de problèmes sans m'en rendre compte.

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 # ....

Alors, quelles sont les conventions pour chaîner les méthodes sur plusieurs lignes et laquelle devrais-je préférer?

[~ # ~] note [~ # ~] : Je n'ai pas pu trouver un bon exemple dans le Guide de style de codage Ruby =.

42
Dmytrii Nagirniak

Il y a en fait une section à ce sujet dans le Ruby style guide :

Adoptez un style de chaînage de méthode multi-lignes cohérent. Il existe deux styles populaires dans la communauté Ruby, tous deux considérés comme bons - leader . (Option A) et à la fin . (Option B).

  • (Option A) Lorsque vous continuez un appel de méthode chaînée sur une autre ligne, conservez le . sur la deuxième ligne.

    # 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
    
  • (Option B) Lorsque vous continuez un appel de méthode chaînée sur une autre ligne, incluez le . sur la première ligne pour indiquer que l'expression continue.

    # 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
    

Une discussion sur les mérites des deux styles alternatifs peut être trouvée ici .

52
Bozhidar Batsov

Dans Ruby 1.9+, il est possible d'écrire comme ceci:

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}

Beaucoup plus lisible, je pense.

33
detunized

La raison pour laquelle j'ai choisi le point à la fin de la ligne est qu'il vous permettra de coller du code dans une session IRB. En outre, vous ne pouvez pas commenter les lignes au milieu du code multiligne si vous utilisez les points au début des lignes. Voici une bonne discussion à lire: https://github.com/bbatsov/Ruby-style-guide/pull/176

10
rosenfeld