Pourquoi les énoncés «if elif else» ne sont-ils pratiquement jamais sous forme de tableau?

73
if   i>0 : return sqrt(i)  
elif i==0: return 0  
else     : return 1j * sqrt(-i)

CONTRE

if i>0:  
   return sqrt(i)  
elif i==0:  
   return 0  
else:  
   return 1j * sqrt(-i)  

Compte tenu des exemples ci-dessus, je ne comprends pas pourquoi je ne vois pratiquement jamais le premier style dans les bases de code. Pour moi, vous transformez le code en un format tabulaire indiquant clairement ce que vous voulez. La première colonne peut être virtuellement ignorée. La deuxième colonne identifie la condition et la troisième colonne vous donne le résultat souhaité. Au moins, cela me semble simple et facile à lire. Pourtant, je vois toujours ce type de cas simple / commutateur apparaître dans le format étendu, en retrait. Pourquoi donc? Les gens trouvent-ils le deuxième format plus lisible?

Le seul cas où cela pourrait poser problème est si le code change et devient plus long. Dans ce cas, je pense qu'il est parfaitement raisonnable de reformuler le code dans le format long et en retrait. Est-ce que tout le monde fait la deuxième façon simplement parce que c'est toujours comme ça? Étant un avocat du diable, je suppose qu'une autre raison pourrait être que les gens trouvent que deux formats différents dépendant de la complexité des déclarations if / else créent de la confusion. Toute idée serait appréciée.

Horta
la source
91
Parce que les gens trouvent la 2ème option plus lisible?
GrandmasterB
65
Le cas d'utilisation de branches mutuellement exclusives renvoyant toutes une valeur du même type n'apparaît pas souvent dans les langages impératifs par rapport aux branches qui peuvent ne pas renvoyer de valeurs, peuvent s'étendre sur plusieurs lignes et ont probablement des effets secondaires. Si vous examinez les langages de programmation fonctionnels, vous verrez que le code ressemble beaucoup plus souvent à votre premier exemple.
Doval
47
@horta "Le seul cas où cela pourrait poser problème est que le code change et devient plus long." - Vous ne devez JAMAIS présumer qu'un morceau de code ne sera pas modifié. La refactorisation de code occupe une grande majorité du cycle de vie d'un logiciel.
Charles Addis
7
@horta: Rien à voir avec moi. C'est le code. Dans le contexte de la base de code que je lis, je veux voir si les instructions (et les autres constructions de langage) sont systématiquement formatées, sans aucun cas d'extrémité. Ce n’est pas que j’ai appris à lire le code d’une manière particulière, je peux le lire aussi bien, mais c’est plus lisible si tout est pareil. Encore une fois, pas la même chose pour moi, la même chose pour le reste du code.
GManNickG
44
En outre, la plupart des débogueurs sont basés sur des lignes. Impossible de placer un point d'arrêt sur une instruction qui se trouve à l'intérieur d'un ifsi elle se trouve sur la même ligne.
Isanae

Réponses:

93

Une des raisons peut être que vous n'utilisez pas de langues où c'est populaire.

Quelques contre-exemples:

Haskell avec des gardes et avec des motifs:

sign x |  x >  0        =   1
       |  x == 0        =   0
       |  x <  0        =  -1

take  0     _           =  []
take  _     []          =  []
take  n     (x:xs)      =  x : take (n-1) xs

Erlang avec des motifs:

insert(X,Set) ->
    case lists:member(X,Set) of
        true  -> Set;
        false -> [X|Set]
    end.

Emacs lisp:

(pcase (get-return-code x)
  (`success       (message "Done!"))
  (`would-block   (message "Sorry, can't do it now"))
  (`read-only     (message "The shmliblick is read-only"))
  (`access-denied (message "You do not have the needed rights"))
  (code           (message "Unknown return code %S" code)))

En général, je vois que le format de table est assez populaire avec les langages fonctionnels (et ceux basés sur l’expression en général), tandis que casser les lignes est plus populaire chez les autres (principalement à base d’instructions).

viraptor
la source
10
J'ai voté en faveur de cela et suis généralement d'accord, mais je me sens obligé de souligner que 1. Tous ces éléments sont des retours triviaux. , et même les langages impératifs ont des normes différentes pour les expressions que les déclarations. Si l'OP réécrivait l'exemple original en tant qu'applications de fonctions, il obtiendrait peut-être un conseil différent ...
Jared Smith
3
@ JaredSmith Merci pour la scission basée sur l'expression / l'instruction - je pense que cela peut être encore plus approprié que fonctionnel / impératif. Encore une fois, le rubis est presque basé sur l’expression et n’utilise pas souvent cette convention. (exceptions à tout) En ce qui concerne les points 1 et 2, je trouve que 50% + du code réel de Haskell sont des "retours triviaux" qui ne sont que des éléments de quelque chose de plus gros - c'est simplement la façon dont ce code est écrit - pas seulement dans les exemples ici. Par exemple près de la moitié des fonctions ici sont un seulement un / deux paquebots. (certaines lignes utilisent un tableau)
viraptor
Oui. Je ne suis pas un Haskeller, mais fais un peu de travail et trouve que la correspondance de motifs a tendance à être beaucoup plus concise que les commutateurs logiquement équivalents, et que les fonctions polymorphes couvrent une grande partie de ce terrain. J'imagine que les classes de types de Haskell élargiraient encore cette couverture.
Jared Smith
Je pense que c'est la syntaxe de cas modèle qui favorise cela. Parce qu’il est plus concis et généralement plus proche d’un boîtier de commutation court, il est plus facile de s’exprimer en une ligne. Je le fais souvent avec de courtes déclarations de cas pour des raisons similaires. Les if-elsedéclarations littérales sont toujours généralement réparties sur plusieurs lignes lorsqu'elles ne sont pas effectivement un simple ternaire.
Isiah Meadows
@viraptor Techniquement, les 50% restants du code haskell sont des "retours non triviaux" car toutes les fonctions haskell sont fonctionnellement pures et ne peuvent pas avoir d'effets secondaires. Même les fonctions qui lisent et impriment sur la ligne de commande ne sont que de longues déclarations de retour.
Pharap
134

C'est plus lisible. Quelques raisons pour lesquelles:

  • Presque toutes les langues utilisent cette syntaxe (pas toutes, la plupart - votre exemple semble être Python, cependant)
  • isanae a souligné dans un commentaire que la plupart des débogueurs sont basés sur les lignes (pas sur les instructions)
  • Cela commence à paraître encore plus moche si vous devez aligner des points-virgules ou des accolades
  • Il se lit de manière plus fluide de haut en bas
  • Il semble horriblement illisible si vous avez autre chose que des déclarations de retour triviales
    • Toute syntaxe significative de retrait est perdue lorsque vous parcourez du code, car le code conditionnel n'est plus séparé visuellement (de Dan Neely ).
    • Ce sera particulièrement grave si vous continuez à patcher / ajouter des éléments dans les instructions de 1 ligne si
  • Ce n'est lisible que si toutes vos vérifications si sont à peu près de la même longueur
  • Cela signifie que vous ne pouvez pas formater compliqué si les déclarations en déclarations multilignes, ils doivent être Citations
  • Je suis beaucoup plus susceptible de remarquer des bugs / une logique en lisant verticalement ligne par ligne, sans essayer d'analyser plusieurs lignes ensemble
  • Notre cerveau lit un texte plus étroit et plus large BEAUCOUP plus rapidement qu'un texte long et horizontal

À la minute où vous essayez de faire cela, vous finirez par le réécrire en plusieurs instructions. Ce qui signifie que vous venez de perdre du temps!

De plus, les gens ajoutent inévitablement quelque chose comme:

if i>0:  
   print('foobar')
   return sqrt(i)  
elif i==0:  
   return 0  
else:  
   return 1j * sqrt(-i)  

Cela ne prend pas très souvent cela avant de décider que ce format est bien meilleur que votre alternative. Ah, mais vous pouvez tout aligner en une seule ligne! Enderland meurt à l'intérieur .

Ou ca:

if   i>0 : return sqrt(i)  
elif i==0 and bar==0: return 0  
else     : return 1j * sqrt(-i)

Ce qui est vraiment très ennuyant. Personne n'aime formater des choses comme ça.

Et enfin, vous allez commencer la guerre sainte du problème "combien d'espaces pour les onglets". Ce qui s'affiche parfaitement sur votre écran sous forme de tableau peut ne pas être rendu sur le mien en fonction des paramètres.

La lisibilité ne devrait de toute façon pas dépendre des paramètres IDE.

Enderland
la source
14
@horta parce que vous devrez le convertir si vous le formatez de la première façon, au début? Je suis tout à propos de minimiser le travail pour l'avenir enderland. Créer de jolis tableaux d'espaces et compter les espaces et les tabulations pour mettre à jour le formatage visuel lorsque je pourrais ajouter de la logique à une vérification if n'est pas amusant du tout (ignorer les implications en termes de lisibilité).
enderland
14
@horta Il ne dit pas nécessairement qu'il ne réglerait pas le problème, il disait qu'il devrait le régler, et c'est beaucoup de temps passé au formatage fastidieux, plutôt qu'à la programmation.
Servy
11
@horta: À mon humble avis, votre façon de faire est souvent moins lisible et son format est nettement plus gênant. En outre, il ne peut être utilisé que lorsque les "if" sont de petites lignes, ce qui est rarement le cas. Enfin, ce n’est pas bien, IMHO, de transporter deux sortes de "si" de formatages pour cette raison.
dagnelies
9
@horta semble avoir la chance de pouvoir travailler sur des systèmes où les exigences, les systèmes, les API et les besoins des utilisateurs ne changent jamais. Ton âme chanceuse.
enderland
11
J'ajouterais: toute modification mineure dans une condition unique peut nécessiter un reformatage des autres pour correspondre à la :position -> faire un diff dans un CVS rend soudainement plus difficile de comprendre ce qui est réellement en train de changer. Ceci est également vrai pour la condition vs le corps. Les avoir sur des lignes séparées signifie que si vous n'en modifiez qu'une, les différences indiquent clairement que seule la condition a changé, pas le corps.
Bakuriu
55

Je crois fermement que «le code est lu plusieurs fois, peu écrit - la lisibilité est donc très importante».

Un élément clé qui m'aide lorsque je lis le code d'autres personnes est de suivre les schémas «normaux» que mes yeux sont formés à reconnaître. Je peux lire la forme indentée plus facilement parce que je l’ai vue tellement de fois qu’elle s’enregistre presque automatiquement (avec peu d’effort cognitif de ma part). Ce n'est pas parce que c'est 'plus joli' - c'est parce que ça respecte les conventions auxquelles je suis habitué. La convention bat 'mieux' ...

Art Swri
la source
3
Pertinent: thecodelesscode.com/case/94
Kevin
11
Cela explique pourquoi les gens sont conservateurs. Cela n'explique pas pourquoi les gens ont choisi d'écrire leur code d'une certaine manière pour commencer.
Jørgen Fogh
8
La question était: pourquoi est-ce que je vois ça souvent, pas d'où vient ce style? Les deux questions sont intéressantes. J'ai essayé de répondre à celle qui me semblait posée.
Art Swri
16

Outre les autres inconvénients déjà mentionnés, la présentation tabulaire augmente les chances de conflits de fusion de contrôle de version nécessitant une intervention manuelle.

Lorsqu'un bloc de code aligné tabulairement doit être réaligné, le système de contrôle de version considérera chacune de ces lignes comme ayant été modifiée:

diff --git a/foo.rb b/foo.rb
index 40f7833..694d8fe 100644
--- a/foo.rb
+++ b/foo.rb
@@ -1,8 +1,8 @@
 class Foo

   def initialize(options)
-    @cached_metadata = options[:metadata]
-    @logger          = options[:logger]
+    @metadata = options[:metadata]
+    @logger   = options[:logger]
   end

 end

Supposons maintenant qu'entre temps, dans une autre branche, un programmeur a ajouté une nouvelle ligne au bloc de code aligné:

diff --git a/foo.rb b/foo.rb
index 40f7833..86648cb 100644
--- a/foo.rb
+++ b/foo.rb
@@ -3,6 +3,7 @@ class Foo
   def initialize(options)
     @cached_metadata = options[:metadata]
     @logger          = options[:logger]
+    @kittens         = options[:kittens]
   end

 end

La fusion de cette branche échouera:

wayne@mercury:/tmp/foo$ git merge add_kittens
Auto-merging foo.rb
CONFLICT (content): Merge conflict in foo.rb
Automatic merge failed; fix conflicts and then commit the result.

Si le code en cours de modification n'avait pas utilisé d'alignement tabulaire, la fusion aurait réussi automatiquement.

(Cette réponse a été "plagiée" de mon propre article décourageant l'alignement tabulaire dans le code).

Wayne Conrad
la source
1
Intéressant, mais n'est-ce pas un échec des outils de fusion? Git spécifiquement dans ce cas? C’est un point de données pour que la convention soit la voie la plus facile. Pour moi, c'est quelque chose qui pourrait être amélioré (du côté des outils).
Horta
7
@horta Pour que l'outil de fusion modifie l'espace blanc de manière à ne pas presque toujours casser le code, il devra comprendre comment il peut modifier l'espace blanc sans en changer le sens. Il devra également comprendre l'alignement tabulaire particulier utilisé. Cela dépendra non seulement de la langue (Python!), Mais nécessitera probablement l'outil pour comprendre le code dans une certaine mesure. D'un autre côté, la fusion basée sur les lignes peut être réalisée sans IA et, bien souvent, ne rompt même pas le code.
Wayne Conrad
Je t'ai eu. Ainsi, comme mentionné ailleurs dans les commentaires, jusqu'à ce que nous disposions de formats d'entrée IDE ou de programmation incorporant directement les tableaux dans le format, les problèmes d'outils resteront toujours présents, ce qui rendra la vie difficile pour ceux d'entre nous qui préfèrent les tableaux.
Horta
1
@horta Correct. La plupart de mes objections à l'alignement tabulaire dans le code pourraient disparaître avec des outils suffisamment avancés.
Wayne Conrad
8

Les formats tabulaires peuvent être très utiles si les choses s’intègrent toujours dans la largeur allouée. Cependant, si quelque chose dépasse la largeur allouée, il est souvent nécessaire de disposer d'une partie de la table qui n'est pas alignée avec le reste, ou bien d'ajuster la disposition de tout le reste de la table pour l'adapter à l'élément long. .

Si les fichiers source ont été modifiés à l'aide de programmes conçus pour fonctionner avec des données de format tabulaire et capables de gérer des éléments trop longs en utilisant une taille de police plus petite, en les séparant en deux lignes dans la même cellule, etc. formats plus souvent, mais la plupart des compilateurs veulent des fichiers sources exempts du type de balises que de tels éditeurs auraient besoin de stocker pour conserver la mise en forme. Utiliser des lignes avec des retraits variables mais aucune autre mise en page n'est pas aussi beau que la mise en forme tabulaire dans le meilleur des cas, mais cela ne pose pas autant de problèmes dans le pire des cas.

supercat
la source
Vrai. J'ai remarqué que l'éditeur de texte que j'utilise (vim) prend en charge le formatage tabulaire ou même le texte large. Je n'ai pas vu d'autres éditeurs de texte faire beaucoup mieux.
Horta
6

Il y a la déclaration 'switch' qui fournit ce genre de chose pour des cas particuliers, mais je suppose que ce n'est pas ce que vous demandez.

J'ai vu si les déclarations étaient présentées sous forme de tableau, mais il faut un grand nombre de conditions pour que cela en vaille la peine. 3 Si les déclarations sont mieux représentées dans le format traditionnel, mais si vous en avez 20, il est beaucoup plus facile de les afficher dans un gros bloc formaté pour la rendre plus claire.

Et il y a le point: la clarté. Si cela vous permet de voir plus facilement (et que votre premier exemple n’est pas facile de voir où se trouve le délimiteur), formatez-le en fonction de la situation. Sinon, restez fidèle à ce que les gens attendent, car il est toujours plus facile de le reconnaître.

gbjbaanb
la source
1
OP semble utiliser Python, donc non switch.
Jared Smith
2
"3 si les déclarations sont mieux représentées dans le format traditionnel, mais si vous aviez 20" ... alors vous avez de plus gros problèmes à considérer! :)
Grimm Le Opiner
@GrimmTheOpiner Si vous écrivez un analyseur de langage ou un amplificateur AST, c'est une chose très possible à gérer. Par exemple, j'ai une fois contribué à un analyseur JavaScript dans lequel je divisais une fonction avec 15 à 20 observations, une pour chaque type d'expression. J'ai segmenté la plupart des cas de leurs propres fonctions (pour une amélioration notable de la performance), mais la longue switchétait une nécessité.
Isiah Meadows
@JaredSmith: Apparemment , switchle mal, mais instancier un dictionnaire en effectuant ensuite une recherche sur elle afin de faire est trivial ramification pas le diable ...
Mark K Cowan
1
@MarkKCowan oh j'ai attrapé le sarcasme mais je pensais que vous l'utilisiez pour vous moquer de moi. manque de contexte sur internet et tout le reste.
Jared Smith
1

Si votre expression est vraiment simple, la plupart des langages de programmation proposent l'opérateur?::

return  ( i > 0  ) ? sqrt( i)
      : ( i == 0 ) ? 0
        /* else */ : 1j * sqrt( -i )

Ceci est un format tabulaire lisible court. Mais la partie importante est la suivante: je vois en un coup d’œil ce que l’action "majeure" est. Ceci est une déclaration de retour! Et la valeur est décidée par certaines conditions.

Si par contre vous avez des branches qui exécutent un code différent, je trouve cela beaucoup plus lisible d'indenter ces blocs. Parce que maintenant, il y a différentes actions "majeures" en fonction de l'instruction if. Dans un cas, nous lançons, dans un cas, nous enregistrons et retournons ou retournons simplement. Le déroulement du programme varie en fonction de la logique. Par conséquent, les blocs de code encapsulent les différentes branches et les rendent plus visibles pour le développeur (par exemple, lire rapidement une fonction pour saisir le déroulement du programme).

if ( i > 0 )
{
    throw new InvalidInputException(...);
}
else if ( i == 0 )
{
    return 0;
}
else
{
    log( "Calculating sqrt" );
    return sqrt( -i );
}
Falco
la source
7
En fait, je trouve votre "format tabulaire lisible court" un cauchemar à lire, alors que le format proposé par OP convient parfaitement.
Matteo Italia
@MatteoItalia que diriez-vous de cette version éditée?
Falco
5
Désolé, encore pire; Je pense que cela vient du fait que les ?et :sont plus difficiles à repérer que les if/ elsekeywords et / ou à cause du "bruit" ajouté des symboles.
Matteo Italia
@ MatteoItalia: J'ai eu des cas avec plus de cent valeurs différentes. La valeur de la table permet de vérifier les erreurs. Avec plusieurs lignes, c'est impossible.
gnasher729
1
@ gnasher729 - Pour 100 "valeurs" différentes, j'ai généralement trouvé qu'il était bien préférable de déclarer une structure de données de chaque "élément" et de tout répertorier sous forme de tableau lors de l'initialisation pour un tableau de ces structures de données. (Bien sûr, des limitations linguistiques peuvent s'appliquer ici). Si un élément nécessite un aspect "informatique", sa structure peut contenir un pointeur ou une référence à une fonction pour effectuer l'action nécessaire. Pour de nombreuses applications, cela peut grandement simplifier le code et faciliter la maintenance.
Michael Karas
1

Comme enderland l'a déjà dit, vous supposez que vous n'avez jamais qu'un seul "retour" comme action et que vous pouvez marquer ce "retour" à la fin de la condition. Je voudrais donner quelques détails supplémentaires pour expliquer pourquoi cela ne va pas être couronné de succès.

Je ne sais pas quelles sont vos langues préférées, mais je code en C depuis longtemps. Il existe un certain nombre de normes de codage qui visent à éviter certaines erreurs de codage standard en interdisant les constructions de code sujettes aux erreurs, que ce soit lors du codage initial ou lors de la maintenance ultérieure. Je connais le mieux MISRA-C, mais il y en a d'autres, et généralement, ils appliquent des règles similaires, car ils traitent les mêmes problèmes dans la même langue.

Une erreur populaire que les normes de codage traitent souvent est cette petite erreur: -

if (x == 10)
    do_something();
    do_something_else();

Cela ne fait pas ce que vous pensez faire. En ce qui concerne C, si x est égal à 10, vous appelez do_something(), mais do_something_else()est appelé quelle que soit la valeur de x . Seule l'action qui suit immédiatement l'instruction "if" est conditionnelle. C’est peut-être ce que le codeur avait prévu, auquel cas il existe un piège pour les responsables de la maintenance; ou ce n'est peut-être pas ce que le codeur a voulu, auquel cas il y a un bug. C'est une question d'entrevue populaire.

La solution dans les normes de codage est de mandater les accolades autour de toutes les actions conditionnelles, même si elles ne concernent qu'une seule ligne. Nous avons maintenant

if (x == 10)
{
    do_something();
    do_something_else();
}

ou

if (x == 10)
{
    do_something();
}
do_something_else();

et maintenant cela fonctionne correctement et est clair pour les mainteneurs.

Vous remarquerez que cela est totalement incompatible avec votre format de style tableau.

D'autres langages (par exemple, Python) se sont penchés sur ce problème et ont décidé que, puisque les codeurs utilisaient des espaces pour clarifier la présentation, il serait judicieux d'utiliser des espaces au lieu d'accolades. Donc, en Python,

if x == 10:
    do_something()
    do_something_else()

fait les appels à la fois do_something()et do_something_else()conditionnel sur x == 10, alors que

if x == 10:
    do_something()
do_something_else()

signifie que seul do_something()est conditionnel à x et qu'il do_something_else()est toujours appelé.

C'est un concept valable, et quelques langues l'utilisent. (Je l'ai d'abord vu dans Occam2, il y a bien longtemps.) Encore une fois, vous pouvez facilement voir que votre format de style de tableau est incompatible avec le langage.

Graham
la source
1
Je pense que vous n'avez pas saisi mon argument. La question dont vous parlez est un cauchemar étrange spécifique à C spécifique qui cause la question dont vous parlez. Si vous codez en C, je ne recommanderais jamais l’utilisation de la méthode alternative simple if avec le format tabulaire que j’ai suggéré. Puisque vous utilisez C, utilisez plutôt des accolades sur une seule ligne. Les accolades rendraient le tableau encore plus clair car ils agissent comme des délimiteurs.
Horta
De plus, les instructions de retour dans ce cas ne sont qu'un exemple. En général, cela peut être une odeur de code en soi. Je fais simplement référence au format des déclarations simples, pas nécessairement avec les déclarations de retour.
Horta
2
Mon point de vue était que cela rend un format de table encore plus maladroit. Incidemment, ce n'est pas spécifique au C - il est partagé par tous les langages dérivés du C, donc C ++, C #, Java et JavaScript permettent tous le même principe.
Graham
1
Cela ne me dérange pas que ce soit des déclarations de retour - je comprends que votre intention est de montrer des déclarations simples. Mais cela devient plus lourd. Et bien sûr, dès qu'une déclaration devient non simple, vous devez modifier la mise en forme car il est impossible de conserver un format de tableau. À moins d'obscurcir le code, les longues lignes de code sont une odeur à part entière. (La limite originale était de 80 caractères, de nos jours, elle est généralement d'environ 130 caractères, mais le principe général est toujours qu'il ne faut pas faire défiler pour voir la fin de la ligne.)
Graham
1

La mise en page tabulaire peut être utile dans quelques cas limités, mais il est parfois utile avec if.

Dans des cas simples: peut être un meilleur choix. Dans les cas moyens, un commutateur est souvent plus approprié (si votre langue en a un). Dans les cas complexes, vous constaterez peut-être qu’une table d’appel convient mieux.

Lors de la refactorisation du code, il m'est souvent arrivé de modifier le code afin de le rendre évident. Il est rare que je laisse les choses ainsi, car dans la plupart des cas, il existe un meilleur moyen de résoudre le problème une fois que vous le comprenez. Il est parfois interdit par une pratique de codage ou une norme de mise en page, auquel cas un commentaire est utile.

Il y avait quelques questions à propos de ?:. Oui, c’est l’opérateur ternaire (ou comme j’aime bien y penser la valeur si). à première vue, cet exemple est un peu compliqué pour?: (et abusif?: ne facilite pas la lisibilité mais le blesse), mais avec une certaine réflexion L'exemple peut être réorganisé comme ci-dessous, mais je pense que dans ce cas, un commutateur est le plus lisible Solution.

if i==0: return 0
return i>0?sqrt(i):(1j*sqrt(-i))
Hildred
la source
1
Vous devrez peut-être préciser ce que "?:" Est destiné aux non-initiés (par exemple, avec un exemple, éventuellement lié à la question).
Peter Mortensen
Je suppose que c'est l'opérateur ternaire. Je pense que cela est évité pour la bonne raison que l'opérateur ternaire a tendance à réorganiser la norme si, faire des choses, sinon, faites d'autres formats de choses que les gens voient jour après jour et qui peuvent donc lire facilement.
Horta
@PeterMortensen: Si les non-initiés ne savent pas ce que cela signifie, ils devraient rester à l'écart du code jusqu'à ce qu'ils aient posé la question évidente et aient appris.
gnasher729
@horta Ternary est if ? do stuff : do other stuff. Même ordre qu'un if / else.
Navin
1
@ Navin Ah, c'est peut-être juste un échec du langage que j'utilise le plus (python). stackoverflow.com/questions/394809/…
horta
-3

Je ne vois rien de mal avec le format de table. Préférence personnelle, mais j'utiliserais un ternaire comme ceci:

return i>0  ? sqrt(i)       :
       i==0 ? 0             :
              1j * sqrt(-i)

Pas besoin de répéter à returnchaque fois :)

Navin
la source
1
Comme mentionné dans quelques commentaires, les déclarations de retour ne sont pas idéales ou le but de la publication, simplement un morceau de code que j'ai trouvé en ligne et mis en forme de plusieurs façons.
Horta
Les ternaires Python ne le sont do_something() if condition() else do_something_else()pas condition() ? do_something() : do_something_else().
Isiah Meadows
@IsiahMeadows OP n'a jamais mentionné Python.
Navin