Préférez-vous la concision ou la lisibilité de votre code? [fermé]

21

Les raccourcis linguistiques peuvent souvent être utilisés pour rendre le code plus concis.

Par exemple, les opérateurs de coalescence ternaire et nulle peuvent réduire la quantité de code, mais sans doute au détriment de la lisibilité:

En C #:

Person newGuy = new Person();
if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
} else {
    newGuy.Boss = boss;
}

est fonctionnellement équivalent à:

Person newGuy = new Person();
newGuy.Boss = boss ?? GetDefaultBoss();

mais évidemment beaucoup plus verbeux.

Où tracez-vous la ligne quand il s'agit de concision vs lisibilité?

Damovisa
la source
3
C'est une question subjective, quelqu'un qui a implémenté quelque chose dirait que sa manière a du sens, quelqu'un qui la lit dirait que ça n'a pas de sens et une autre personne qui la lit dirait que je comprends, mais je préfère une autre façon. Ce n'est qu'une préférence.
Chris
20
Je pense que la deuxième version est plus lisible.
Vaibhav
2
Vous confondez concision et concision. La concision améliore la lisibilité. La concision en nuit.
Ferruccio
1
@ ThorbjørnRavnAndersen: Le public pour le code C # est généralement "les développeurs avec un fond C #". D'après ce que j'ai vu, le consensus ici sur programmers.se semble être que vous ne devriez pas éviter d'utiliser des fonctionnalités de langage utiles simplement parce que quelqu'un ne les connaît pas. (Voir aussi: programmers.stackexchange.com/q/101513/33843. )
Heinzi
1
dupliquer?: programmers.stackexchange.com/q/58630/15464 .. Oh, celui-ci est plus ancien. :)
Steven Jeuris

Réponses:

63

Tous les deux.

Votre premier exemple est certainement plus verbeux et sans doute plus explicite ... mais il m'oblige également à scanner cinq lignes au lieu d'une. Pire encore, il sous-estime son objectif - attribuer une valeur à newGuy.Boss.

Votre deuxième exemple peut me coûter une seconde si je ne suis pas familier avec l'opérateur de coalescence nulle, mais il ne fait aucun doute quant à son objectif, et si je scanne une routine plus large à la recherche de la source d'une valeur, il être beaucoup plus facile pour moi de choisir celui-ci.

Maintenant, contrastez ceci:

if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
    newGuy.IsTemp = true;
    newGuy.AddTask("orientation");
} else {
    newGuy.Boss = boss;
    newGuy.IsTemp = false;
}

...avec:

newGuy.Boss = boss ?? GetDefaultBoss();
newGuy.IsTemp = boss == null;
if ( boss == null ) newGuy.AddTask("orientation");

Le dernier exemple est encore beaucoup plus court, mais maintenant il obscurcit son objectif en faisant apparaître les tâches déclenchées par le même test comme distinctes. Ici, je pense que la verbosité de l'ancien est justifiée.

Shog9
la source
3
Excellente réponse! - Il ne s'agit pas autant de verbosité que d'objectif.
Damovisa
2
@Damovisa: exactement - le but du code est la communication, et il n'y a aucune raison générale pour laquelle cela ne devrait pas être fait aussi concis que possible (mais pas plus).
Shog9
1
Apprendre l'opérateur de coalescence nulle prendra plus d'une seconde - mais si vous ne le connaissez pas, alors vous devriez l'apprendre!
Casebash
2
Ah "??" serait bien en Java.
Même si le dernier exemple est plus court en termes de code, il est en fait en train d'évaluer boss3 fois au lieu d'une seule fois dans l'exemple détaillé. C'est juste une autre raison pour laquelle un code plus court juste pour être plus court est une mauvaise idée. Je pense que la concision devrait être en second lieu à l'objectif principal, que ce soit la lisibilité / maintenabilité (pour le code complexe) ou les performances (pour les sections critiques des boucles internes, etc.). En d'autres termes, n'optimisez jamais uniquement pour des raisons de concision - à moins que vous ne prévoyiez d'envoyer votre code via une connexion à 1 bps;)
user193130
16

Bien que les deux soient de bons objectifs, je serai toujours du côté de la lisibilité lorsque je serai obligé d'en choisir un.

Je dirais que votre exemple améliore à la fois la lisibilité et la brièveté. Considérez cependant:

if( a > b )
{
    foo = bar
}
else
{
    if( c.isThing() ){
        foo = somethingElse;
    }
    else{
        foo = someFurtherThing.GetFoo();
    }
}

par opposition à

foo = a > b ? bar ?? whatever.something : c.isThing() ? somethingElse : someFurtherThing.GetFoo();

Ce dernier est concis, mais difficile à lire. Le premier est verbeux, mais le flux de la logique est clair.

En fin de compte, la brièveté ne sert pas à grand chose, à part la possibilité d'afficher plus sur l'écran. La lisibilité facilite le débogage et devrait donc être généralement préférée.

Fishtoaster
la source
11
Un formatage approprié pourrait facilement améliorer la lisibilité du deuxième exemple. C'est une comparaison injuste. Lorsqu'il est formaté comme ça , je ne suis pas du tout sûr que ce soit si mauvais.
Steven Jeuris
Les exemples de code ne sont pas équivalents: le premier est manquant ?? whatever.something.
John B. Lambe
11

Je dirais qu'en règle générale, ne sacrifiez jamais la lisibilité à cause de la concision, mais ne jugez jamais la lisibilité en fonction du manque de connaissances d'un autre programmeur à ce sujet.

La concision et la lisibilité ne sont pas opposées. Comme cette réponse, parfois plus courte est plus lisible.

Brian R. Bondy
la source
4
+1 pour ne pas supposer le manque de connaissances d'un autre programmeur. Dans l'exemple donné, la deuxième option est seulement moins lisible si vous n'êtes pas familier avec l'opérateur de coalescence nul. Je n'écrirais jamais mon code en supposant que mes collègues ne connaissent pas la syntaxe du langage. Même s'ils ne savaient pas ce que cela ??signifie, si je l'utilise et ensuite ils l'apprennent, nous en avons tous les deux profité. Et ce n'est pas comme s'il était difficile de taper "?? operator" sur msdn.com
Tim Goodman
4

Je dirais que je préfère la lisibilité, même si cela signifie parfois utiliser un code concis. (C'est-à-dire ternaire pour les conditions relativement simples à l'intérieur d'un bloc conditionnel plus grand.)

Fondamentalement, s'il est inutilement difficile à comprendre, ne le faites pas.

George Marian
la source
3

La lisibilité vient en premier où elle entre en conflit avec la concision, car le code est modifié plus souvent qu'il n'est initialement écrit. D'autre part:

  1. Le bruit syntaxique et le code passe-partout obscurcissent souvent les intentions et nuisent ainsi à la lisibilité. Parfois, le code plus concis est également plus lisible. Par exemple, pensez aux fonctions lambda ou aux fonctions délégués / de première classe par rapport aux classes à méthode unique qui implémentent une interface à méthode unique.

  2. La lisibilité doit être évaluée en fonction de la facilité de lecture du code pour un programmeur raisonnablement expérimenté qui connaît assez bien le langage et ses caractéristiques uniques / avancées, pas un singe de code à peine compétent qui ne connaît que le plus petit dénominateur commun.

dsimcha
la source
2

Un aspect qui, je pense, n'a pas encore été mentionné: quels sont vos objectifs?

Si vous ne vous souciez que de la sécurité de l'emploi, optez pour la concision et la compacité par rapport à tout le reste. Évitez également de commenter votre code.

Si vous voulez pouvoir facilement transmettre votre code à quelqu'un d'autre pendant que vous travaillez sur un nouveau projet sympa, optez pour la lisibilité, la clarté et de nombreux commentaires solides.

Remarque: ce qui précède ne vous concerne pas personnellement, @Damovisa; c'est pour quiconque choisit entre les deux positions.

Dori
la source
Cela ressemble à une sécurité d'emploi mais si vous voulez être programmeur, c'est une sécurité d'emploi dans la mauvaise entreprise ...;)
Alois Mahdal
2

Il y a une chose que la version détaillée a comme avantage.

Il a plus de lignes et la plupart des débogueurs sont orientés ligne ! Il est très difficile de définir un point d'arrêt au milieu d'une expression, mais il est généralement très simple de le placer dans une instruction de bloc.

En d'autres termes, lequel voudriez-vous voir dans votre éditeur si vous voulez que votre débogueur démarre quand boss == null?

(Cela dit, j'aime l'opérateur ?? -)


la source
0

La lisibilité doit venir en premier, à long terme, la plupart des gens passent le plus de temps à modifier ou étendre le code existant - la lisibilité est une grande partie de la maintenabilité.

Cela dit, la concision est quelque chose qui peut contribuer à la lisibilité. Par exemple, dans votre question, le deuxième extrait est à la fois plus lisible et plus concis.

FinnNk
la source