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).
.net
code-quality
readability
maintainability
clean-code
Bret Walker
la source
la source
else c = false
pour le premier ou faites le devoir||=
dans le second.c = a==b ? true : false;
Réponses:
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:
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.
la source
Tout d'abord, réalisez que vos deux formulaires ne sont pas équivalents.
c
sera mis à true sia
est égal àb
, et sinon, sa valeur restera ce qu'elle est déjà.c
sera défini sur true sia
est é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:
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.
la source
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
if
dé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
a
etb
et 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
c
et l'assigner dans une seule déclaration, c'est-à-direLa modification des variables peut facilement conduire à des erreurs, donc je l'éviterais. L'utilisation d'une
if
instruction nécessite que la variable soit déclarée avant le conditionnel puis modifiée.la source
Another reason to prefer the second form is that you can declare c and assign it in a single statement
"«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.
la source
La deuxième. Il a moins de répétition (DRY) et est plus facile à comprendre ce qui se passe, qui
c
vaut si oui ou nona
etb
sont égaux.À mon humble avis, encore mieux serait
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é.
la source
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é dea == b
. Par conséquent, voici ce que j'aime utiliser lorsque les deuxa
etb
sont les mêmes:Et puis vous pouvez faire:
this.c = this.NoPeriod
au lieu de:la source
return this.MyWaveLength = this.HerWaveLength;
ou à lareturn this.MyWaveLength == this.HerWaveLength;
place?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!