Comment stylisez-vous les instructions complexes ET / OU if pour une lisibilité maximale? Comment indentez-vous et où placez-vous les sauts de ligne? Ma situation particulière ressemble à ce qui suit. C'est certainement mieux que de tout casser en une seule ligne, mais ça a toujours l'air désordonné.
if (
(
x == y
&& a != b
&& p.isGood()
&& (
i + u == b
|| q >= a
)
)
|| k.isSomething()
|| m > n
) {
doSomething();
}
Réponses:
Créez des variables booléennes pour chaque petite étape:
Ceci est bien sûr similaire à la réponse de Lacrymologie, sauf avec des noms différents pour chaque étape.
Si vous nommez
step1
,step2
etstep3
d'une manière qui a un bon sens conceptuel, cela devrait être de loin le plus lisible.p.isGood()
etk.isSomething()
peut parfois être invoqué dans des situations où il ne serait pas dans votre code d'origine, donc ce ne serait pas une option si ces fonctions sont coûteuses ou si vous exécutez ce code dans une boucle très serrée.D'un autre côté, vous n'avez pas à vous soucier des performances que la création de nouvelles variables pourrait entraîner; un bon compilateur les optimisera.
Un exemple avec la détection de collision rectangle (que vous n'utiliseriez probablement pas en raison de la performance susmentionnée):
Pourrait devenir:
De plus, si vous voulez laisser votre code tel quel, je pense que ce serait tout aussi bien. Je pense honnêtement que votre code est assez lisible. Évidemment, je ne sais pas exactement ce que
a b x y i u p k m n
sont, mais en ce qui concerne la structure, cela me semble bien.la source
En général, je re-factorise mon code pour le rendre plus modulaire si mes conditions deviennent compliquées.
la source
let x = a > b
oulet f a b = a > b
.Je ferais quelque chose de plus comme ça, à ce niveau de complexité
c'est moche, mais c'est lisible et je suis presque certain que le compilateur saura comment le refactoriser.
D'un autre côté, si jamais je me vois dans la situation d'écrire une telle déclaration IF, je repense la solution, car je suis CERTAIN qu'il existe un moyen de le faire plus simplement, ou du moins d'abstraire une partie de cette condition (par exemple: peut-être:
x == y && a != b && p.isGood()
vraiment méchantthis->isPolygon()
et je peux faire cette méthode;la source
Je suis de moins en moins obsédé par l'alignement vertical au fil du temps, mais ma forme générale avec des expressions sur plusieurs lignes est ...
Points clés...
Parfois, je vais formater
+
et /*
ou d'autres opérateurs comme ça aussi. Un certain nombre d'expressions complexes prennent une forme de somme de produit ou de produit de somme (qui peut faire référence à des «sommes» et «produits» booléens), il est donc probablement assez courant qu'un style cohérent en vaille la peine.Soyez prudent avec cela, cependant. Il est souvent préférable de refactoriser (déplacer des parties de l'expression dans une fonction, ou de calculer et de stocker des parties intermédiaires dans une variable) plutôt que d'utiliser l'indentation pour essayer de rendre une expression trop complexe plus lisible.
Si vous préférez empiler vos parenthèses sur le côté droit, je ne le déteste pas, mais je suppose que ce n'est pas trop mal. Trop poussé, vous courez le risque qu'une erreur puisse laisser l'indentation dénaturer ce que font les parenthèses.
la source
http://www.codinghorror.com/blog/2006/01/flattening-arrow-code.html
Je suis d'accord avec la réponse de JohnFx ainsi que celle de Lacrymology. Je voudrais créer un tas de fonctions (de préférence statiques) qui atteignent de petits objectifs, puis les développer de manière intelligente.
Alors, que diriez-vous de quelque chose comme ça? Notez que ce n'est pas la solution parfaite, mais cela fonctionne. Il existe des moyens de nettoyer davantage, mais des informations plus spécifiques sont nécessaires. Remarque: ce code devrait fonctionner tout aussi rapidement, car le compilateur est intelligent.
la source
Pour ce que ça vaut, j'ai été surpris de voir que votre exemple ressemble beaucoup aux prédicats compliqués que j'ai écrits. Je suis d'accord avec les autres pour dire qu'un prédicat compliqué n'est pas le meilleur pour la maintenabilité ou la lisibilité, mais il arrive parfois qu'il apparaisse.
Permettez-moi de souligner que vous avez fait cette partie correctement:
&& a != b
NE JAMAIS mettre de connecteur logique à la fin d'une ligne, c'est trop facile de manquer visuellement. Un autre endroit où vous ne devez JAMAIS mettre un opérateur à la fin de la ligne est la concaténation de chaînes, dans les langues avec un tel opérateur.Faites ceci:
Ne faites pas ça:
la source
Si le conditionnel est si compliqué, c'est généralement une indication qu'il doit être divisé en plusieurs parties. Peut-être qu'une clause peut être affectée à une variable intermédiaire. Peut-être qu'une clause peut être transformée en une méthode d'assistance. Je préfère généralement ne pas avoir autant d'and et d'ou sur une même ligne.
la source
Vous pouvez diviser le code en plusieurs instructions, ce qui le rend facile à comprendre. Mais un vrai ninja ferait quelque chose comme ça. :-)
la source