50 votes

Utilisation de 'if' contre 'less' pour conditionnels Perl

Quelles sont certaines des directives pour une utilisation optimale de if contre unless en code Perl? Existe-t-il de bonnes raisons de préférer l’un ou l’autre dans certaines situations?

61voto

friedo Points 36209

En Perl, les Meilleures Pratiques, le conseil est de ne jamais utiliser d' unless. Personnellement, je pense que c'est la folie.

J'utilise unless quand il y a une condition simple que je voudrais écrire comme if( ! ... ). Je trouve l' unless version pour être plus lisible, en particulier lorsqu'il est utilisé comme un postfix:

do_something() unless $should_not_do_that;

Je recommande d'éviter unless quand les choses deviennent plus compliquées, telles que lorsque vous aurez elsif ou else blocs. (Heureusement, ou peut-être malheureusement, selon votre point de vue, il n'y a pas d' elsunless. :) )

Aussi, toutes les fois qu'une condition est une expression complexe composé de booléens. Par exemple,

unless( $foo and !$bar )

Est sacrément confusion, et n'ont aucun avantage par rapport à l'équivalent if.

36voto

Michael Carman Points 21983

Hormis une ésotériques cas1unless est juste sucre syntaxique pour if !. Il existe pour vous permettre d'écrire du code plus clair et plus expressif. Il doit être utilisé quand il atteint ce but et tenue à l'écart quand il l'altère.

- Je trouver de l' unless d'être les plus utiles pour le contrôle de flux dans les boucles. par exemple

while (<$fh>) {
    next unless /\S/;
    # ...
}

Pour de simples négations je trouve ça plus clair qu'un niée if -- il est facile d'oublier qu'à la tête de ! lors de la lecture du code.

unless ($condition) {
    do_something();
}

if (!$condition) {
    do_something();
}

Mais ne pas écrire d' unless ... else, parce que c'est juste choquant.

Dans postfix forme, il fournit un indice sur ce que la trajectoire prévue par le code de l'est.

do_normal_thing() unless $some_unlikely_condition;

1) La dernière expression évaluée est différente, ce qui peut affecter le comportement des sous-marins sans explicite return.

12voto

Grant McLean Points 2461

Une règle de base est que «à moins que» devrait probablement être utilisé rarement.

Il est particulièrement utile sous la forme postfixe, par exemple:

 delete_old_widgets() unless $old_widget_count == 0
 

Les situations où vous ne devriez jamais utiliser à moins que:

  • avec une condition composée (et, ou, non)
  • avec une clause else

10voto

user3043717 Points 1

J'ai passé une heure a récemment essayé d'expliquer à quelqu'un comment imbriquées "à moins que" les clauses travaillé, il était difficile de déchiffrer sans avoir à s'inverser en cas de déclarations avec la logique booléenne.

Si vous essayez de le convertir en anglais, il vous aide à vous orienter.

Un simple sauf fonctionne très bien. Par exemple.

"Si vous êtes calme, je vais vous ignorer'.

unless ($quiet) {
    ignore();
}

Bien que je pense que cela fonctionne tout aussi bien

"Si vous n'êtes pas tranquille, je vais vous ignorer'

if (not $quiet) {
    ignore();
}

quand ça commence à devenir compliqué, c'est quand vous avez la négation.

"A moins que vous ne sont pas bruyant, je vais vous ignorer'

unless ( ! $noisy) {
    ignore();
}

Bien mieux écrit que

"Si vous êtes bruyant, je vais vous ignorer'

if ($noisy) {
    ignore();
}

Donc, n'utilisez pas un "à moins que" si vous avez de la nier.

Aussi, ne pas utiliser "à moins que d'autre"

unless ($quiet) {
    ignore();
}
else {
    give_a_sweet();
}

"Si vous êtes calme, je vais vous ignorer, sinon je vais vous donner un doux'

Le changement par l'inversion de l'état.

if ($quiet) {
    give_a_sweet();
}
else {
    ignore();
}

"Si vous êtes calme, je vais vous donner un bonbon, sinon je vais vous ignorer'.

avec plus d'une condition, c'est salissant.

unless ($quiet and not $fidgit) {
    punish();
}

"Si vous êtes calme, et vous n'avez pas fidgit, je vais vous punir'.

(désolé de ma compréhension est un échec ici!)

encore une fois, plus le nier.

if (not $quiet or $fidgit) {
    punish();
}

"Si vous n'êtes pas tranquille, ou vous fidgit, je vais vous punir'.

le problème de l'utilisation de "à moins que", même pour les cas les plus simples, ils sont souvent (par vous ou par outhe

J'espère qu'il est clair lorsque vous devraient ou ne devraient pas l'utiliser à moins que?

(sauf si vous n'avez pas d'autre avis?)

1voto

MikeKulls Points 300

Mon avis serait de ne jamais utiliser le moins. Mes raisons sont les suivantes:

  • Je pense que la syntaxe rend le code plus difficile à lire. Avoir une méthode unique de faire un si rend la chose plus simple et cohérente.
  • Si vous avez besoin d'ajouter une autre déclaration, plus tard, vous devrait vraiment changer le moins que pour un si. C'est juste plus facile si l'on est déjà un si.
  • Si la logique à l'intérieur de l'sauf déclaration devient de plus en plus complexe, alors vous pouvez vous retrouver avec odd de code comme "si (x == 5 && y != 7). C'est bizarre, parce qu'il y a une double négative sur la deuxième case.
  • Il y a d'autres façons de nier les choses, c'est à dire x != 5
  • C'est plus cohérent avec les autres langues. Je ne sais pas de toute autre langue qui a un à moins de déclaration, et je pense qu'il y a une très bonne raison pour cela.

En perl, il y a vraiment 4 façons d'écrire une instruction si, si, à moins que puis mettre le chèque à la fin de la ligne au lieu de le démarrer. Je préfère de beaucoup une seule méthode cohérente qui soit compatible avec d'autres langues également.

Juste mon 0,02 $en vaut la peine.

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