Question

Raccourcis La langue peut souvent être utilisé pour rendre le code plus concis.

Par exemple, les opérateurs ternaires et coalescents nul peut 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 bavard.

Où tracer la ligne en matière de lisibilité vs concision?

Était-ce utile?

La solution

Les deux.

Votre premier exemple est certainement plus bavard, et sans doute plus explicite ... mais il me faut aussi balayer cinq lignes au lieu d'un. Pire encore, il deemphasizes son but -. 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 coalescent nul, mais il peut y avoir aucun doute quant à son but, et si je suis la numérisation à travers une routine plus à la recherche de la source d'une valeur , il me sera beaucoup plus facile pour de choisir celui-ci dehors.

Maintenant, contraste 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 but en faisant des tâches déclenchées par le même test semblent être distincts. Ici, je me sens la verbosité de l'ancien est justifiée.

Autres conseils

Bien que les deux sont de bons objectifs, je vais toujours du côté Lisibilité quand ils sont forcés de choisir un.

Je dirais que votre exemple améliore la lisibilité et brièveté. Tenez compte cependant:

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

au lieu de

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

Cette dernière est concise, mais est difficile à lire. Le premier est bavard, mais le flux de logique est claire.

En fin de compte, la brièveté ne sert pas à grand-chose, autre que la capacité d'adapter plus à l'écran. Lisibilité facilite la mise au point, et doit donc généralement être préféré.

Je dirais en règle générale, ne jamais sacrifier la lisibilité en raison d'alléger le texte, mais jamais juger la lisibilité basée sur un autre programmeurs manque de connaissances sur ce sujet.

Concision et la lisibilité ne sont pas opposés. Comme cette réponse, parfois plus courte est plus lisible.

Je dirais que je préfère la lisibilité, mais cela signifie parfois en utilisant le code concis. (Pour ternaire à savoir conditionals relativement simples à l'intérieur d'un plus grand bloc conditionnel.)

En fait, s'il est inutilement difficile à comprendre, ne pas le faire.

Lisibilité vient d'abord où il est en conflit avec concision, parce que le code est modifié plus souvent qu'il est d'abord écrit. D'autre part:

  1. bruit et le code de Syntactic intentions souvent obscures boilerplate et donc mal la lisibilité. Parfois, le code plus concis est de plus lisible. Par exemple, pensez fonctions lambda ou délégués / fonctions de première classe par rapport à une seule méthode des classes qui mettent en œuvre une interface unique méthode.

  2. Lisibilité devrait être évaluée en fonction de la facilité avec laquelle le code est à lire pour un programmeur raisonnablement expérimenté qui connaît la langue et ses caractéristiques uniques / avancées assez bien, pas un singe de code peine compétent qui ne connaît que le plus petit dénominateur commun .

L'un des aspects que je ne pense pas que cela a été mentionné encore: quelles sont votre objectifs

Si tout ce que vous aimez est la sécurité d'emploi au sujet, optez pour la compacité et la concision sur tout le reste. Passer commentant votre code, aussi.

Si vous voulez être en mesure de remettre facilement votre code à quelqu'un d'autre pendant que vous allez travailler sur un nouveau projet frais, optez pour la lisibilité, la clarté, et beaucoup de commentaires solides.

Note: ci-dessus ne vous concerne pas personnellement, @Damovisa; il est pour tout le monde de choisir entre les deux positions.

Il y a une chose que la version verbeux a un avantage.

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

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

(Cela dit, je comme le ?? - opérateur)

Lisibilité devrait venir en premier, la plupart des gens à long terme passent la plupart du temps en train de modifier ou d'étendre le code existant -. La lisibilité est une grande partie de la maintenabilité

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

Licencié sous: CC-BY-SA avec attribution
scroll top