Quelle est la plus maintenable - l'affectation booléenne via if / else ou l'expression booléenne?

11

Laquelle serait considérée comme plus maintenable?

if (a == b) c = true; else c = false;

ou

 c = (a == b);

J'ai essayé de chercher dans Code Complete, mais je ne trouve pas de réponse.

Je pense que le premier est plus lisible (vous pouvez littéralement le lire à haute voix), ce qui le rend également plus facile à maintenir. Le second est certainement plus logique et réduit le code, mais je ne suis pas sûr qu'il soit aussi maintenable pour les développeurs C # (je m'attends à voir cet idiome plus dans, par exemple, Python).

Bret Walker
la source
3
Les deux ne sont pas équivalents. Vous avez besoin d'un else c = falsepour le premier ou faites le devoir ||=dans le second.
17
Je pense que le fait que vous ayez dû apporter deux modifications au premier formulaire répond à votre question!
James
7
Je suis d'accord avec @James. La deuxième forme, bien que moins verbeuse, est très simple à comprendre et ne laisse aucune ambiguïté quant à sa signification. Il n'y a pas de trucs ou de raccourcis à prendre, c'est juste court car le concept est simple. Le fait que vous ayez codé le premier avec un bogue et que vous ayez dû le modifier pour le corriger, et qu'il ne soit toujours pas parfait (utilisation incohérente des accolades), est la preuve que ce n'est pas aussi simple que vous le pensez.
Eric King
5
Wow, les développeurs C # considèrent-ils vraiment la première forme comme acceptable? Cela ... réduit sérieusement ma confiance en eux. D'après mon expérience, l'utilisation de la première forme suggère fortement une incompréhension complète des expressions booléennes.
Andres F.
2
Juste pour garder les choses intéressantes, voici une autre option:c = a==b ? true : false;
FrustratedWithFormsDesigner

Réponses:

14

La deuxième option est meilleure.

Il y a une raison certaine de se méfier des raccourcis de programmation intelligents qui nuisent à la maintenabilité en obscurcissant l'intention du code. Donc, je ne vous blâme pas d'avoir posé la question.

Cependant, je ne considère c = (a == b);pas être un exemple d'une astuce intelligente. Il s'agit d'une représentation simple d'un concept simple. Aussi simple que possible.

Un bon « maintenable » mise en forme de votre premier exemple (sans les accolades manquantes et la construction d' une ligne que je fais envisager un raccourci intelligent) donnerait ce code:

if (a == b)
{
    c = true; 
}
else 
{
    c = false;
}

D'après mon expérience, l'écriture d'une logique booléenne simple d'une manière aussi prolixe et sujette aux erreurs est un signe de code "incertain". Cela me ferait me demander comment une logique plus complexe est gérée dans cette base de code.

Eric King
la source
15

Tout d'abord, réalisez que vos deux formulaires ne sont pas équivalents.

if (a == b) c = true;

csera mis à true si aest égal à b, et sinon, sa valeur restera ce qu'elle est déjà.

c = (a == b);

csera défini sur true si aest égal à b, et sinon, il sera défini sur false.

Si vous voulez l'équivalent du deuxième formulaire, dans le style du premier formulaire, vous devez l'écrire comme ceci:

if (a == b) {
  c = true;
} else c = false;

Maintenant, il est clair lequel des deux est plus lisible, plus facile à gérer et moins susceptible d'introduire des bogues si quelque chose est changé. Restez avec la deuxième forme.

Mason Wheeler
la source
Tout à fait raison - j'ai mis à jour ma question.
Bret Walker
Je considère que la deuxième forme est trop longue et compliquée - si vous voulez cet effet, utilisez une affectation booléenne.
Rétablir Monica - M. Schröder
11

Je ne suis pas d'accord que votre premier formulaire soit plus lisible - ce n'est certainement pas idiomatique C # d'avoir deux déclarations sur une seule ligne, et il n'est pas recommandé d'avoir une ifdéclaration sans utiliser d'accolades.

Deuxièmement, je ne vois pas comment la deuxième forme est moins maintenable - il n'y a rien à maintenir. C'est une simple déclaration de la relation entre aet bet cela ne pourrait pas être exprimé plus simplement.

Une autre raison de préférer le deuxième formulaire est que vous pouvez le déclarer cet l'assigner dans une seule déclaration, c'est-à-dire

bool c = (a == b);

La modification des variables peut facilement conduire à des erreurs, donc je l'éviterais. L'utilisation d'une ifinstruction nécessite que la variable soit déclarée avant le conditionnel puis modifiée.

Lee
la source
J'ai lu les deux déclarations sur une seule ligne comme pseudo-code
Jimmy Hoffa
1
+1 pour " Another reason to prefer the second form is that you can declare c and assign it in a single statement"
Andres F.
0

«plus maintenable» pourrait être très subjectif.

Je préfère généralement la lisibilité et l'intention à la réduction de code. Je pense que vous enregistrez 8 caractères dactylographiés en utilisant le formulaire réduit.

Prendre la langue et la culture autour de la langue est une caractéristique de la «lisibilité» à mon avis.

Il y a des moments où les performances peuvent être à l'origine de la réduction du code pour optimiser le code d'octet résultant, mais cela doit être fait avec soin après un certain profilage.

Johnnie
la source
Subjective: Duh. Réduction du code: peut également (si ce n'est pas trop) améliorer la clarté et mieux communiquer l'intention. Performances: Pas de souci du tout (l'optimisation est parfois vitale, mais ce n'est pas quelque chose qui relève de l'optimisation, car cela n'a pratiquement jamais d'importance - probablement même pas si vous écrivez des noyaux ou des pilotes).
4
Le premier formulaire contenait au moins 1 bogue qui devait être corrigé, caché dans sa verbosité. La deuxième forme était simple et directe et n'avait aucun bug. Je repose mon cas. En tout cas, le but principal n'était pas de taper moins de caractères! Et cette question ne concernait pas du tout la performance, ce qui n'est pas pertinent dans ce cas.
Andres F.
@delnan exactement mon point, Duh. la réduction de code de quelqu'un est la clarté de quelqu'un d'autre. Je n'ai pas cité l'optimisation comme principale préoccupation ... Je l'ai utilisée comme exemple. Votre raison d'ajouter des astuces intelligentes ou d'aller au-delà de la norme doit être équilibrée par tout ce que vous / culture / entreprise considérerez comme lisible.
Johnnie
1
Écrire une expression booléenne propre n'est pas une astuce astucieuse!
Andres F.
Je suppose que j'accorderais plus de mérite à votre commentaire si vous répondiez à l'esprit de la question et non à une analogie stupide utilisée pour soutenir un concept sous-jacent.
Johnnie
0

La deuxième. Il a moins de répétition (DRY) et est plus facile à comprendre ce qui se passe, qui cvaut si oui ou non aet bsont égaux.

À mon humble avis, encore mieux serait

c = a == b

Tout comme j'écrirais

  • 1 + 2 + 3 au lieu de ((1 + 2) + 3)
  • 5 + 3 * 7 au lieu de (5 + (3 * 7))

De toute évidence et trivialement, le code inutile n'est pas une vertu. C'est encombré.

Paul Draper
la source
-4

Votants, veuillez expliquer ce qui ne va pas avec ma réponse révisée.

Oui, c = (a == b);peut être difficile à lire (pire encore, StyleCop se plaint de parenthèses inutiles), mais j'aime toujours la simplicité de a == b. Par conséquent, voici ce que j'aime utiliser lorsque les deux aet bsont les mêmes:

private static bool NoPeriod
{
    get
    {
        return this.MyWaveLength == this.HerWaveLength;
    }
}

Et puis vous pouvez faire: this.c = this.NoPeriodau lieu de:

this.c = this.MyWavelength == this.HerWaveLength;
Emploi
la source
1
alors tu voulais dire return this.MyWaveLength = this.HerWaveLength;ou à la return this.MyWaveLength == this.HerWaveLength;place?
Jesse C. Slicer
5
Quoi!? c = (a == b);n'est pas sujet aux erreurs. Le premier formulaire de la question d'origine est beaucoup plus sujet aux erreurs , comme le montre l'OP lui-même devant éditer sa question pour corriger des bugs!
Andres F.
Je suppose que votre solution suggérée a un bug = vs. ==
Ondra
@Ondra Morský, merci ... le compilateur aurait compris cela pour moi.
Job
6
Je ne connais pas StyleCop, mais s'il vous dit que les parenthèses inutiles sont mauvaises, vous devez le désactiver. Les parenthèses inutiles ne sont pas nécessaires pour le compilateur, mais elles peuvent être très, très agréables pour les yeux humains. Si vous avez écrit c = a == b; le compilateur peut le comprendre très bien, mais c'est plus difficile pour un humain.
Michael Shaw