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?
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" :)
Vous devriez essayer d'empêcher l'écriture de lignes de plus de 80 caractères plutôt que de les casser:
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. ;-)
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...
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)
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:
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). .
J'ai deux règles simples:
Donc, dans le cas où:
if ((long test 1) &&
(long test 2) &&
(long test 3)) {
code executed if true;
}
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.
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
}
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.
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.
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.
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é.
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.
Je dirais que la méthode que vous utilisez importe peu si elle répond aux critères suivants:
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.
Pour Java, Oracle fournit ces conventions. Conventions de code Java - Oracle.
À 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.
À 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++ .
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;
}