68 votes

Comment formater correctement un composé long si les instructions dans Coffeescript

Si j'avais une déclaration complexe si je ne voulais pas déborder pour des raisons uniquement esthétiques, quel serait le moyen le plus simpliste de la diviser puisque coffeescript interprètera les déclarations comme le corps de la déclaration dans ce cas?

 if (foo is bar.data.stuff and foo isnt bar.data.otherstuff) or (not foo and not bar)
  awesome sauce
else lame sauce
 

86voto

nicolaskruchten Points 6130

CoffeeScript ne va pas interpréter la ligne suivante comme le corps de la déclaration, si la ligne se termine par un opérateur, donc c'est ok:

# OK!
if a and
not 
b
  c()

il compile

if (a && !b) {
  c();
}

si votre if pourrait être formaté comme

# OK!
if (foo is 
bar.data.stuff and 
foo isnt bar.data.otherstuff) or 
(not foo and not bar)
  awesome sauce
else lame sauce

ou de toute autre ligne de rupture régime, tant que les lignes de la fin, en and ou or ou is ou == ou not ou quelque chose comme opérateur

Comme à l'indentation, vous pouvez mettre en retrait de la non-premières lignes de votre if tant que le corps est encore plus en retrait:

# OK!
if (foo is 
  bar.data.stuff and 
  foo isnt bar.data.otherstuff) or 
  (not foo and not bar)
    awesome sauce
else lame sauce

Ce que vous ne pouvez pas faire est ceci:

# BAD
if (foo  #doesn't end on operator!
  is bar.data.stuff and 
  foo isnt bar.data.otherstuff) or 
  (not foo and not bar)
    awesome sauce
else lame sauce

3voto

Trevor Burnham Points 43199

Cela change votre code de la signification quelque peu, mais il peut être de quelque utilité:

return lame sauce unless foo and bar
if foo is bar.data.stuff isnt bar.data.otherstuff
  awesome sauce
else
  lame sauce

Remarque l' is...isnt chaîne, ce qui est légitime, tout comme a < b < c est légitime en CoffeeScript. Bien sûr, la répétition de l' lame sauce est malheureux, et vous ne pouvez pas vouloir return tout de suite. Une autre approche serait d'utiliser imbibe d'écrire

data = bar?.data
if foo and foo is data?.stuff isnt data?.otherstuff
  awesome sauce
else
  lame sauce

L' if foo and est un peu inélégant; vous pouvez le jeter si il n'y a aucune chance qu' foo est undefined.

2voto

John Nilsson Points 4650

Comme toute autre langue, en ne les ayant pas au départ. Donnez des noms aux différentes parties et traitez-les séparément. Soit en déclarant des prédicats, soit en créant simplement quelques vars booléens.

 bar.isBaz = -> @data.stuff != @data.otherstuff
bar.isAwsome = (foo) -> @isBaz() && @data.stuff == foo
if not bar? or bar.isAwesome foo
  awesome sauce
else lame sauce
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X