web-dev-qa-db-fra.com

Si vous cassez de longues lignes de code, comment indenter le contenu sur la ligne suivante?

Parfois, vous devez écrire dans vos sources longues lignes, qui sont meilleures à rompre. Comment indentez-vous les éléments cités par ceci?.

Vous pouvez l'indenter de la même manière:

very long
statement;
other statement;

Cela rend plus difficile la différenciation du code suivant, comme indiqué dans l'exemple. D'autre part, vous pouvez l'indenter d'un niveau:

very long
   statement;
other statement;

Cela facilite les choses, mais cela peut arriver, que la longue ligne soit le début d'un bloc imbriqué, que vous voulez mettre en retrait, comme ceci:

if ((long test 1) &&
   (long test 2) &&
   (long test 3)) {
   code executed if true;
}

Dans ce cas encore, c'est difficile à lire. La troisième possibilité à laquelle je peux penser est de ne pas couper les longues lignes, les éditeurs modernes peuvent la gérer et créer des sauts de ligne souples. Mais avec un autre éditeur, vous devez faire défiler l'écran de côté et vous ne pouvez pas influencer la position, l'éditeur interrompt votre longue ligne.

Quelle possibilité préférez-vous? Avez-vous d'autres idées pour résoudre ce problème? Pouvez-vous soutenir votre préférence avec une bonne justification?

37
Mnementh

J'aime les accolades sur leur propre ligne parce que j'aime bien, il est plus facile de voir l'état et le bloc intérieur en un seul élément (si vous voyez ce que je veux dire):

if ((long test 1)
    && (long test 2)
    && (long test 3)) 
{
    code executed if true;
}

et j'aime bien commencer des lignes conditionnelles supplémentaires avec ce que la condition est parce que je trouve que la condition "joindre" est très importante et qu'elle a tendance à être négligée à la fin de la ligne précédente.

J'essaie aussi d'indenter de manière à ce que l'effet de la parenthèse soit évident (bien qu'il soit généralement préférable d'essayer d'éviter les conditionnelles longues).

J'essaie de structurer les choses pour pouvoir "scanner" facilement "choses" :)

41
user53794

Vous devriez essayer d'empêcher l'écriture de lignes de plus de 80 caractères plutôt que de les casser:

  • Essayez de minimiser l'indentation en convertissant les conditions et en encapsulant du code.

Linus Torvalds: Si vous avez besoin de plus de 3 niveaux de indentation, vous êtes foutu quand même,
et devrait réparer votre programme. 

Cela a également pour effet secondaire de rendre votre code beaucoup plus lisible, outre le fait que les conditions sont les autres choses que vous encapsulez sont prêtes à être utilisées ailleurs.

bool encapsulatedLongCondition() // Add some parameters
{
  if (!condition1)
    return false;

  if (!condition2)
    return false;

  // ... (Other conditions)

  return true;
}    

if (encapsulatedLongCondition())
{
  // ... (Call some methods, try not to introduce deeper if/loop levels!)
}

Simplifier votre condition par le biais de l’algèbre booléenne et essayer d’inverser la condition et la valeur renvoyée peut être très utile. :-)

Voir aussi: Pouvez-vous simplifier cet algorithme? Voir aussi 2: Refactor for C # a la capacité de vous aider. ;-)

  • Utilisez des définitions de type et essayez d'éviter les noms longs

Un exemple simple, imaginez combien de temps il utilisera Days sans typedef avec des noms plus longs dans un autre conteneur.

struct Day
{
  // Some data
};
struct Event
{
  // Some data
};
typedef list<Event> Events;
typedef map<Day, Event> Days;
// Some other container that would else be long...
  • ... (Vous devriez essayer d'analyser pourquoi votre ligne est longue et trouver une solution pour cela)

J'espère que vous avez une idée générale, de cette façon vous n'aurez pas besoin de faire une rupture de ligne sale. ;-)

Le seul endroit où je verrais apparaître de longues lignes se trouve dans les prototypes de vos fonctions ou lorsque vous les appelez, vous devez simplement essayer de faire une pause après la dernière virgule possible et de continuer sur la ligne suivante. Plutôt que de le faire après chaque opération et de gaspiller plusieurs lignes en faisant défiler le texte de manière à ce que votre fonction se démarque trop ... Vous pouvez placer le type de retour sur la ligne précédant le nom de la fonction si vous voyez fréquemment ces longues lignes.

void longFunctionName(ParameterType1 parameter1, ParameterType2 parameter2,
                      ParameterType3 parameter3, ParameterType4 parameter4)  
31
Tom Wijsman

En général je fais:

if (condition) {
     something;
}

pour les délimiteurs de bloc. Cependant, si le cas d'une longue ligne je dois rompre, j'utilise ceci:

if (
    (long test 1) &&
    (long test 2) &&
    (long test 3)
) {
    code executed if true;
}

Principales différences avec la réponse de rbobby:

  1. Les opérateurs à la fin de chaque ligne au lieu du début des lignes suivantes, pour indiquer très clairement que la ligne est incomplète
  2. Saut de ligne sur la première ligne avant l'élément conditionnel - cela permet de garder la "forme" du code cohérente.
  3. Clôture paren pas en retrait.

Cela a pour effet visuel de donner aux listes de paramètres/conditionnelles une apparence de blocs de code (mais avec des parenthèses au lieu d'accolades bouclées. Je trouve la symétrie agréable. Cela évite également d'avoir une accolade ouverte nue sur une ligne (ce qui me semble terrible). .

8
Cory Petosky

J'ai deux règles simples:

  1. Bloc d'instructions: une indentation;
  2. Continuation de ligne: deux empreintes ou parenthèses alignées, ce qui est encore indenté.

Donc, dans le cas où:

if ((long test 1) &&
        (long test 2) &&
        (long test 3)) {
    code executed if true;
}
7
Juliano

Je me range avec, "Ne combattez pas l'IDE."

Cependant, mon IDE (Eclipse, Visual Studio) souhaite rompre les lignes, c'est comment elles sont rompues.

Cela peut signifier des incohérences entre les langues, ce qui est OK.

4
jjnguy

J'ai une légère variation sur ce qui est déjà écrit ici:

if ((long test 1) &&
    (long test 2) &&
    (long test 3)) 
{
    code executed if true;
}

J'aime avoir mes opérateurs booléens au bout de la ligne.

Les noms de méthode longs, ou les méthodes avec beaucoup de paramètres, ressemblent à ceci:

reallyLongMethodName (paramA,
                      paramB,
                      paramC);

avec les bits alignés avec le nom param ci-dessus; pas le support ...

De plus, pour réduire l'indentation, j'ai commencé à utiliser plusieurs points de retour dans mon code, ainsi que des suites et des interruptions dans mes boucles. par exemple

for(int i = 0; i < MAX; i++)
{
    if(!isPrime(i)) // predefined prime finding func
        continue;

    //now we have only prime values of i
}
3
masher

Indentez toujours, mais si les déclarations sont spéciales; J'aime aligner les tests, et je mets les opérateurs supplémentaires && à gauche:

if (  (long test 1)
   && (long test 2)
   && (long test 3)) 
{
    code executed if true;
}

Tirer le && vers la gauche pour l'aligner sur if est également possible, mais je trouve cette alternative plus difficile à lire.

2
Norman Ramsey

Je garde les expressions entre crochets au niveau de leur ouverture:

if ((long test 1) &&
    (long test 2) &&
    (long test 3)) {
  code executed if true;
}

Cela rend évident le niveau de chaque expression.

2
brian-brazil

J'ai déjà posé une question similaire dans le passé:

Où envelopper une ligne de code, en particulier les longues listes d'arguments?

La difficulté avec ce type de question est sa nature subjective, donc je n'ai pas pu accepter de réponse.

Je pense que l'important est de garder le style d'indentation cohérent dans l'ensemble de votre base de code.

2
coobird

La seule raison pour laquelle le code est formaté de manière particulière est de le rendre lisible. Ceci est intrinsèquement subjectif - faites-le d'une manière qui semble bien et qui, à votre avis, serait plus lisible pour quelqu'un qui consulte le code pour la première fois. Et je vais faire fi de la sagesse conventionnelle et dire: ne vous inquiétez pas d'une norme commune - pour deux raisons

1) c'est difficile dans cette situation, car il y a tellement de possibilités différentes pour les lignes brisées

2) il ne vous achète rien. période. Encore une fois, le formatage du code consiste simplement à rendre votre code lisible. Avoir une manière standard de formater les détails de votre code ne vous achète pas de la lisibilité.

1
user13276

Avec astyle, ou le pénétrateur automatique que vous utilisez. Il semble faire assez bien son travail et il faut généralement penser à des choses plus importantes.

1
Pete Kirkham

Je dirais que la méthode que vous utilisez importe peu si elle répond aux critères suivants:

  • c'est raisonnable
  • vous appliquez la même convention dans tout votre code.

Si vous faites partie du développement d’une équipe, do essayez de vous mettre d’accord sur une convention entre vous, par un mécanisme de vote obscur, si vous ne pouvez pas en arriver à un accord sans quoi personne ne peut dicter.

1
Mike Woodhouse

Pour Java, Oracle fournit ces conventions. Conventions de code Java - Oracle.

  • Pause après une virgule
  • Pause devant un opérateur
  • Préfère les pauses de niveau supérieur aux pauses de niveau inférieur
  • Aligne la nouvelle ligne avec le début de l'expression au même niveau que la ligne précédente
  • Si les règles ci-dessus conduisent à un code source de confusion ou à un code écrasé par rapport à la marge droite, indentez plutôt 8 espaces

À titre d'exemple,

longName1 = longName2 * (longName3 + longName4 - longName5)
            + 4 * longname6; // PREFER
longName1 = longName2 * (longName3 + longName4
                        - longName5) + 4 * longname6; // AVOID

Un autre :

//DON’T USE THIS INDENTATION
if ((condition1 && condition2)
    || (condition3 && condition4)
    ||!(condition5 && condition6)) { //BAD WRAPS
    doSomethingAboutIt(); //MAKE THIS LINE EASY TO MISS
}
//USE THIS INDENTATION INSTEAD
if ((condition1 && condition2)
        || (condition3 && condition4)
        ||!(condition5 && condition6)) {
    doSomethingAboutIt();
}
//OR USE THIS
if ((condition1 && condition2) || (condition3 && condition4)
        ||!(condition5 && condition6)) {
    doSomethingAboutIt();
}

D'autres exemples sont donnés dans ce document.

0
prime

À mon avis, une largeur de trait de 78 ou 80 caractères est utile car il est plus facile d’ouvrir plusieurs fichiers côte à côte sur le même écran.

Justification, qu'en est-il d'une citation de de Linus Torvalds ? :)

La réponse à cela est que si vous avez besoin de plus de 3 niveaux d'indentation, tu es foutu quand même, et devrait réparer votre programme.

Je suis normalement un conglomérat du style de codage Google C++ (vous pouvez également l'adapter à Java, je suppose) et ce style de codage C++ .

0
Manuel

Je n'indente presque jamais sur la même ligne. Cependant, à de rares occasions, j'ai réinitialisé un groupe de variables comme celle-ci.

a 
= b
= c
= d
= e
= f
= 0;

L’essentiel pour faire quelque chose comme cela est de garder l’opérateur d’affectation comme premier caractère de la ligne suivante. Cela donnera le maint. programmeur un moment WTF quand ils le voient, les forçant à regarder, pas seulement à le survoler.

Enveloppant une très longue déclaration, je le ferai là où j’ai le sentiment que c’est logique ... pas nécessairement au premier alinéa. Alors :

reallyLongMethodName (paramA,paramB,paramC);

ne serait pas formaté comme 

reallyLongMethodName (paramA,
    paramB,
    paramC);

mais finirait plus comme 

reallyLongMethodName (paramA,
                    paramB,
                    paramC);

avec tous les paramètres alignés avec la parenthèse ouvrante.

Pour si et caprice, je ferais quelque chose comme

if((long test 1) 
&& (long test 2) 
&& (long test 3))
{
    code executed if true;
}
0
John MacIntyre