Perché le dichiarazioni "if elif else" non sono praticamente mai in formato tabella?


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

VS

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

Dati gli esempi sopra, non capisco perché praticamente non vedo mai il primo stile nelle basi di codice. Per me, trasformi il codice in un formato tabulare che mostra chiaramente ciò che desideri. La prima colonna può essere praticamente ignorata. La seconda colonna identifica la condizione e la terza colonna fornisce l'output desiderato. Sembra, almeno per me, semplice e facile da leggere. Eppure vedo sempre questo semplice tipo di caso / interruttore emergere nel formato esteso, con rientro a schede. Perché? Le persone trovano più leggibile il secondo formato?

L'unico caso in cui ciò potrebbe essere problematico è se il codice cambia e diventa più lungo. In tal caso, penso che sia perfettamente ragionevole rielaborare il codice nel formato lungo e rientrato. Lo fanno tutti nel secondo modo semplicemente perché è il modo in cui è sempre stato fatto? Essendo un avvocato del diavolo, immagino che un'altra ragione potrebbe essere perché le persone trovano due formati diversi a seconda della complessità delle dichiarazioni if ​​/ else per essere confusi? Qualsiasi approfondimento sarebbe apprezzato.


91
Perché le persone trovano la seconda opzione più leggibile?
GrandmasterB,

65
Il caso d'uso di rami reciprocamente esclusivi che restituiscono tutti un valore dello stesso tipo non compare spesso in linguaggi imperativi rispetto ai rami che potrebbero non restituire valori, potrebbero estendersi su più righe e probabilmente avere effetti collaterali. Se osservassi linguaggi di programmazione funzionali, vedresti un codice che ricorda molto più spesso il tuo primo esempio.
Doval,

47
@horta "L'unico caso in cui questo potrebbe essere problematico è che il codice cambia e si allunga." - Non dovresti MAI presumere che un pezzo di codice non verrà modificato. Il refactoring del codice occupa gran parte del ciclo di vita di un software.
Charles Addis,

7
@horta: niente a che fare con me. È il codice Nel contesto della base di codice che sto leggendo, voglio vedere se le istruzioni (e altri costrutti del linguaggio) sono formattate in modo coerente, senza alcun limite. Non è che ho imparato a leggere il codice in un modo particolare, riesco a leggere bene, ma è più leggibile se tutto è uguale. Ancora una volta, non è lo stesso per me, lo stesso per il resto del codice.
GManNickG,

44
Inoltre, la maggior parte dei debugger sono basati su linea. Non è possibile inserire un punto di interruzione su un'istruzione che si trova all'interno di un ifse si trova sulla stessa riga.
Isanae,

Risposte:


93

Uno dei motivi potrebbe essere che non stai usando le lingue in cui è popolare.

Alcuni contro-esempi:

Haskell con protezioni e con motivi:

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

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

Erlang con motivi:

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)))

Generalmente vedo che il formato della tabella è piuttosto popolare con i linguaggi funzionali (e in generale quelli basati sull'espressione), mentre spezzare le righe è più popolare in altri (principalmente basati su istruzioni).


10
Ho votato a favore e generalmente sono d'accordo, ma mi sento obbligato a sottolineare che 1. Tutti questi sono rendimenti banali 2. Gli haaskeller sono affezionati a identificatori comicamente brevi oltre alla terseness della lingua stessa e 3. I linguaggi funzionali tendono ad essere basati sull'espressione e persino le lingue imperative hanno standard diversi per le espressioni rispetto alle dichiarazioni. Se l'OP riscrivesse l'esempio originale come applicazioni funzionali potrebbe ricevere diversi consigli ...
Jared Smith,

3
@JaredSmith Grazie per la divisione basata sull'espressione / istruzione - Penso che potrebbe essere ancora più appropriato di funzionale / imperativo. Di nuovo il rubino è quasi basato sull'espressione e non usa spesso quella convenzione. (eccezioni a tutto) Riguardo ai punti 1 e 2, trovo che il 50% + del vero codice Haskell sia "risultati banali" che sono solo parti di qualcosa di più grande - è proprio come è scritto quel codice - non solo negli esempi qui. Ad esempio quasi la metà delle funzioni qui sono solo una / due linee. (alcune linee usano il layout della tabella)
viraptor,

Sì. Non sono un Haskeller ma faccio un po 'di ocaml e scopro che il pattern matching tende ad essere molto più conciso degli switch logicamente equivalenti, e le funzioni polimorfiche coprono comunque molto di quel terreno. Immagino che le classi di tipi di Haskell amplierebbero ulteriormente quella copertura.
Jared Smith,

Penso che sia la sintassi del case pattern che lo promuove. Poiché è più conciso e di solito più vicino a una custodia corta, è più facile da esprimere come una linea. Lo faccio spesso con brevi dichiarazioni di switch-case e per ragioni simili. Tuttavia, le if-elsedichiarazioni letterali sono generalmente distribuite su più righe quando non sono effettivamente un semplice ternario.
Isiah Meadows il

@viraptor Tecnicamente l'altro 50% del codice haskell è "ritorni non banali" perché tutte le funzioni di haskell sono funzionalmente pure e non possono avere effetti collaterali. Anche le funzioni che leggono e stampano sulla riga di comando sono solo lunghe dichiarazioni di ritorno.
Pharap,

134

È più leggibile. Alcuni motivi per cui:

  • Quasi tutte le lingue usano questa sintassi (non tutte, la maggior parte - il tuo esempio sembra essere Python, però)
  • isanae ha sottolineato in un commento che la maggior parte dei debugger sono basati su linee (non su istruzioni)
  • Inizia a sembrare ancora più brutto se devi incorporare punti e virgola o parentesi graffe
  • Legge dall'alto verso il basso più uniformemente
  • Sembra orribilmente illeggibile se hai qualcosa di diverso dalle banali dichiarazioni di ritorno
    • Qualsiasi sintassi significativa del rientro viene persa quando si sfoglia il codice poiché il codice condizionale non è più visivamente separato (da Dan Neely )
    • Ciò sarà particolarmente negativo se continui a patchare / aggiungere elementi nell'istruzione if di 1 riga
  • È leggibile solo se tutti i tuoi controlli if hanno circa la stessa lunghezza
  • Essa significa che non è possibile formattare complicato se le dichiarazioni in istruzioni su più righe, si devono essere oneliners
  • Sono molto più propenso a notare bug / flusso di logica durante la lettura verticale riga per riga, non cercando di analizzare più righe insieme
  • I nostri cervelli leggono il testo più stretto e più alto MOLTO più velocemente del testo orizzontale lungo

Nel momento in cui provi a fare tutto ciò, finirai per riscriverlo in istruzioni multilinea. Ciò significa che hai perso tempo!

Inoltre le persone inevitabilmente aggiungono qualcosa come:

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

Non ci vuole molto spesso a farlo prima di decidere che questo formato è molto meglio della tua alternativa. Ah, ma potresti incorporare tutto in una riga! enderland muore all'interno .

O questo:

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

Il che è davvero molto fastidioso. A nessuno piace formattare cose come questa.

E infine, inizierai la guerra santa del problema "quanti spazi per le schede". Ciò che viene visualizzato perfettamente sullo schermo come formato di tabella potrebbe non essere visualizzato sul mio a seconda delle impostazioni.

La leggibilità non dovrebbe comunque dipendere dalle impostazioni IDE.


14
@horta perché dovrai convertirlo se lo formatti nel tuo primo modo, inizialmente? Sto minimizzando il lavoro per il futuro enderland. Creare graziose tabelle di spazi bianchi e contare spazi e schede per aggiornare la formattazione visiva quando potrei aggiungere un po 'di logica a un controllo if non è affatto divertente (ignorando le implicazioni della leggibilità).
Enderland,

14
@horta Non sta necessariamente dicendo che non lo aggiusterà, sta dicendo che dovrebbe ripararlo, e questo è molto tempo speso in noiosa formattazione, piuttosto che in programmazione.
Servito il

11
@horta: IMHO a modo tuo è spesso meno leggibile ed è decisamente più fastidioso da formattare. Inoltre, può essere utilizzato solo quando gli "if" sono piccoli riquadri, il che è raramente un caso. Infine, in qualche modo non è carino, IMHO, portare in giro due tipi di formattazioni "if" per questo motivo.
Dagnelies,

9
@horta sembra che tu abbia la fortuna di lavorare su sistemi in cui i requisiti, i sistemi, le API e le esigenze degli utenti non cambiano mai. Anima fortunata.
Enderland,

11
Aggiungo: qualsiasi piccolo cambiamento in una singola condizione può richiedere la riformattazione delle altre in modo che corrisponda alla :posizione -> facendo un diff in un CVS diventa improvvisamente più difficile capire cosa sta realmente cambiando. Questo vale anche per condizione vs corpo. Avendoli su linee separate significa che se si cambia solo uno di essi, le differenze mostrano chiaramente che è cambiata solo la condizione, non il corpo.
Bakuriu,

55

Sono fermamente convinto che "il codice viene letto molte volte, scritto poche volte, quindi la leggibilità è molto importante".

Una cosa fondamentale che mi aiuta quando leggo il codice di altre persone è che segue gli schemi "normali" che i miei occhi sono addestrati a riconoscere. Riesco a leggere più facilmente la forma rientrata perché l'ho vista così tante volte che si registra quasi automaticamente (con un piccolo sforzo cognitivo da parte mia). Non è perché è "più bello" - è perché segue le convenzioni a cui sono abituato. La convenzione batte "meglio" ...



11
Questo spiega perché le persone sono conservatrici. Non spiega perché le persone abbiano scelto di scrivere il loro codice in un certo modo per cominciare.
Jørgen Fogh,

8
La domanda era "perché lo vedo spesso", non da dove provenga questo stile. Entrambe le domande sono interessanti; Ho provato a rispondere a quello che pensavo mi fosse stato chiesto.
Art Swri,

16

Insieme agli altri inconvenienti già menzionati, il layout tabulare aumenta le probabilità del controllo della versione unendo conflitti che richiedono un intervento manuale.

Quando è necessario riallineare un blocco di codice tabellare, il sistema di controllo della versione tratterà ciascuna di quelle righe come modificata:

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

Supponiamo ora che nel frattempo, in un altro ramo, un programmatore abbia aggiunto una nuova riga al blocco di codice allineato:

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 fusione di quel ramo fallirà:

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.

Se il codice modificato non avesse utilizzato l'allineamento tabulare, l'unione avrebbe avuto successo automaticamente.

(Questa risposta è stata "plagiata" dal mio articolo scoraggiando l'allineamento tabulare nel codice).


1
Interessante, ma non è questo un fallimento degli strumenti di unione? In particolare git in questo caso? Questo è un punto di riferimento per la convenzione che è il modo più semplice di procedere. Per me, è qualcosa che potrebbe essere migliorato (dal lato dello strumento).
horta,

7
@horta Affinché lo strumento di unione modifichi lo spazio bianco in modo che non rompa quasi sempre il codice, dovrà capire in che modo può modificare lo spazio bianco senza cambiare il significato del codice. Dovrà inoltre comprendere il particolare allineamento tabulare utilizzato. Questo non dipenderà solo dalla lingua (Python!), Ma probabilmente richiederà allo strumento di comprendere il codice in una certa misura. D'altra parte, l'unione basata su linee può essere fatta senza AI, e abbastanza spesso non rompe il codice.
Wayne Conrad,

Gotcha. Quindi, come menzionato altrove nei commenti, fino a quando non avremo IDE o formati di input di programmazione che incorporano le tabelle direttamente nel formato, i problemi di utensili saranno sempre lì solo rendendo la vita difficile per quelli di noi che preferiscono le tabelle.
horta,

1
@horta Correct. La maggior parte delle mie obiezioni all'allineamento tabulare nel codice potrebbe andare via con strumenti sufficientemente avanzati.
Wayne Conrad,

8

I formati tabulari possono essere molto utili se le cose si adattano sempre alla larghezza assegnata. Se qualcosa supera la larghezza assegnata, tuttavia, spesso diventa necessario avere una parte della tabella che non è allineata con il resto di essa, oppure regolare il layout di tutto il resto della tabella per adattarlo all'elemento lungo .

Se i file di origine sono stati modificati utilizzando programmi progettati per funzionare con dati in formato tabulare e in grado di gestire elementi eccessivamente lunghi utilizzando una dimensione del carattere più piccola, suddividendoli in due righe all'interno della stessa cella, ecc., Potrebbe essere logico utilizzare tabulare formati più spesso, ma la maggior parte dei compilatori desidera file di origine liberi dal tipo di markup che tali editor dovrebbero archiviare per mantenere la formattazione. L'uso di linee con quantità variabili di rientro ma nessun altro layout non è bello come la formattazione tabellare nel migliore dei casi, ma non causa quasi tutti i problemi nel peggiore dei casi.


Vero. Ho notato che l'editor di testo che uso (vim) ha un supporto orribile per la formattazione tabellare o anche per il testo largo. Non ho visto altri editor di testo fare molto meglio.
horta,

6

C'è l'istruzione 'switch' che fornisce questo tipo di cose per casi speciali, ma immagino che non sia quello che stai chiedendo.

Ho visto se le dichiarazioni in formato tabella, ma ci devono essere molte condizioni per renderlo utile. 3 se le istruzioni sono mostrate al meglio nel formato tradizionale, ma se ne avevi 20, è molto più facile visualizzarle in un grande blocco formattato per renderlo più chiaro.

E c'è il punto: chiarezza. Se è più facile vedere (e il tuo primo esempio non è facile vedere dove si trova: delimitatore), formattalo per adattarlo alla situazione. Altrimenti, attenersi a ciò che le persone si aspettano, poiché è sempre più facile da riconoscere.


1
OP sembra usare Python, quindi no switch.
Jared Smith,

2
"3 se le dichiarazioni sono mostrate meglio nel formato tradizionale, ma se ne avessi 20" ... allora hai problemi più grandi a cui pensare! :)
Grimm L'Opiner

@GrimmTheOpiner Se stai scrivendo un parser di lingua o un stringificatore AST, è una cosa molto possibile da affrontare. Ad esempio, una volta ho contribuito a un parser JavaScript in cui ho diviso una funzione con 15-20 casi, uno per ciascun tipo di espressione. Ho segmentato la maggior parte dei casi in base alle loro funzioni (per un notevole potenziamento del perf), ma il lungo switchera una necessità.
Isiah Meadows il

@JaredSmith: Apparentemente switchè malvagio, ma creare un'istanza di un dizionario e quindi eseguire una ricerca su di esso per fare una ramificazione banale non è male ...
Mark K Cowan,

1
@MarkKCowan oh ho preso il sarcasmo ma pensavo che lo stessi usando per deridermi. mancanza di contesto su Internet e quant'altro.
Jared Smith,

1

Se la tua espressione è davvero così facile, la maggior parte dei linguaggi di programmazione offre l'operatore?: Branching:

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

Questo è un formato tabulare leggibile breve. Ma la parte importante è: vedo a prima vista qual è l'azione "maggiore". Questa è una dichiarazione di ritorno! E il valore è deciso da determinate condizioni.

Se invece hai rami che eseguono codice diverso, trovo molto più leggibile indentare questi blocchi. Perché ora ci sono diverse azioni "principali" a seconda dell'istruzione if. In un caso lanciamo, in un caso registriamo e ritorniamo o semplicemente ritorniamo. Esiste un flusso di programma diverso a seconda della logica, quindi i blocchi di codice incapsulano i diversi rami e li rendono più importanti per lo sviluppatore (ad es. Lettura veloce di una funzione per comprendere il flusso del programma)

if ( i > 0 )
{
    throw new InvalidInputException(...);
}
else if ( i == 0 )
{
    return 0;
}
else
{
    log( "Calculating sqrt" );
    return sqrt( -i );
}

7
In realtà, trovo che il tuo "formato tabulare leggibile breve" sia piuttosto un incubo da leggere, mentre il formato proposto da OP va benissimo.
Matteo Italia,

@MatteoItalia che ne dici di questa versione modificata?
Falco,

5
Scusa, ancora peggio; Penso che derivi dal fatto che ?e :sono più difficili da individuare rispetto alle if/ elseparole chiave e / o a causa del "rumore" aggiunto dei simboli.
Matteo Italia,

@MatteoItalia: ho avuto casi con oltre cento valori diversi. Il valore della tabella consente di verificare la presenza di errori. Con multilinea, è impossibile.
gnasher729,

1
@ gnasher729 - Per 100 diversi "valori" ho generalmente trovato molto meglio dichiarare una struttura di dati di ogni "elemento" ed elencarlo tutto come una tabella nell'inizializzazione di una matrice di queste strutture di dati. (Naturalmente le limitazioni linguistiche possono essere applicate qui). Se un elemento richiede un aspetto "computazionale", la struttura dell'elemento può contenere un puntatore o un riferimento a una funzione per eseguire l'azione necessaria. Per le applicazioni di maggio ciò può semplificare notevolmente il codice e semplificare notevolmente la manutenzione.
Michael Karas,

1

Come ha già detto Enderland, stai assumendo che tu abbia sempre un solo "ritorno" come azione e che puoi taggare quel "ritorno" alla fine della condizione. Vorrei dare qualche dettaglio in più sul perché questo non avrà successo.

Non so quali siano le tue lingue preferite, ma sto scrivendo codice in C da molto tempo. Esistono numerosi standard di codifica che mirano a evitare alcuni errori di codifica standard impedendo la costruzione di codici che sono soggetti a errori, sia nella codifica iniziale che durante la manutenzione successiva. Conosco molto bene MISRA-C, ma ce ne sono altri e generalmente hanno regole simili perché affrontano gli stessi problemi nella stessa lingua.

Un errore popolare a cui spesso si rivolgono gli standard di codifica è questo piccolo errore: -

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

Questo non fa quello che pensi che faccia. Per quanto riguarda C, se x è 10 allora chiami do_something(), ma poi do_something_else()viene chiamato indipendentemente dal valore di x . Solo l'azione immediatamente successiva all'istruzione "if" è condizionata. Questo potrebbe essere ciò che intendeva il programmatore, nel qual caso esiste una potenziale trappola per i manutentori; o potrebbe non essere quello che intendeva il programmatore, nel qual caso c'è un bug. È una domanda di intervista popolare.

La soluzione negli standard di codifica è imporre le parentesi graffe attorno a tutte le azioni condizionali, anche se sono a linea singola. Ora capiamo

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

o

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

e ora funziona correttamente ed è chiaro per i manutentori.

Noterai che questo è del tutto incompatibile con il tuo formato da tavolo.

Alcuni altri linguaggi (ad esempio Python) hanno esaminato questo problema e hanno deciso che, poiché i programmatori utilizzavano gli spazi bianchi per chiarire il layout, sarebbe una buona idea usare gli spazi bianchi anziché le parentesi graffe. Quindi in Python,

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

rende le chiamate a entrambi do_something()e do_something_else()subordinate a x == 10, mentre

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

significa che do_something()è solo condizionale su x ed do_something_else()è sempre chiamato.

È un concetto valido e alcune lingue lo usano. (L'ho visto per la prima volta in Occam2, molto tempo fa.) Ancora una volta, tuttavia, puoi facilmente vedere che il tuo formato di tabella è incompatibile con la lingua.


1
Penso che tu abbia perso il punto. Il problema di cui parli è uno strano incubo non standard specifico per C che causa il problema di cui parli. Se codifico in C, non consiglierei mai di usare il metodo if semplice alternativo con il formato tabellare che ho suggerito. Invece, dal momento che stai usando C, useresti tutte le parentesi graffe su una sola riga. Le parentesi graffe renderebbero il formato della tabella ancora più chiaro perché fungono da delimitatori.
horta,

Inoltre, le dichiarazioni di ritorno in questo caso sono solo un esempio. In generale, questo può essere odore di codice in sé. Mi riferisco solo al formato delle istruzioni semplici, non necessariamente con le dichiarazioni di ritorno.
horta,

2
Il mio punto era che questo rende un formato tabella ancora più goffo. Per inciso, non è specifico per C: è condiviso da tutti i linguaggi derivati ​​da C, quindi C ++, C #, Java e JavaScript consentono tutti lo stesso gotcha.
Graham,

1
Non mi dispiace che siano dichiarazioni di ritorno - ho capito che la tua intenzione è quella di mostrare dichiarazioni semplici. Ma diventa più ingombrante. E, naturalmente, non appena un'istruzione diventa non semplice, è necessario modificare la formattazione poiché è impossibile mantenere un formato tabella. A meno che tu non stia facendo l'offuscamento del codice, le lunghe righe di codice sono un odore a sé stante. (Il limite originale era di 80 caratteri, al giorno d'oggi è più o meno di circa 130 caratteri, ma il principio generale sostiene ancora che non dovresti scorrere per vedere la fine della linea.)
Graham,

1

Il layout tabulare può essere utile in pochi casi limitati, ma ci sono poche volte con cui è utile.

In casi semplici?: Potrebbe essere una scelta migliore. In casi medi, uno switch è spesso più adatto (se la tua lingua ne ha uno). In casi complicati potresti scoprire che le tabelle di chiamata sono più adatte.

Ci sono state molte volte in cui il refactoring del codice l'ho riorganizzato per essere tabulare per renderlo ovvio. È raro che io lo lasci così in quanto nella maggior parte dei casi esiste un modo migliore per risolvere il problema una volta compreso. Occasionalmente una pratica di codifica o standard di layout lo proibiscono, nel qual caso è utile un commento.

C'erano alcune domande su ?:. Sì, è l'operatore ternario (o come mi piace pensarlo il valore se). al primo blush questo esempio è un po 'complicato per?: (e abusando?: non aiuta la leggibilità ma fa male), ma con qualche pensiero L'esempio può essere riorganizzato come di seguito, ma penso che in questo caso un interruttore sia il più leggibile soluzione.

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

1
Potrebbe essere necessario chiarire che cosa "?:" È per i non iniziati (ad esempio, con un esempio, forse correlato alla domanda).
Peter Mortensen,

Suppongo che sia l'operatore ternario. Sento che è evitato per la buona ragione che l'operatore ternario tende a riorganizzare lo standard se, fa cose, altrimenti, fa altri formati di roba che le persone vedono giorno dopo giorno e quindi possono leggere facilmente.
horta,

@PeterMortensen: se i non iniziati non sanno cosa significhi, devono stare alla larga dal codice fino a quando non fanno la domanda ovvia e imparano.
gnasher729,

@horta Ternary è if ? do stuff : do other stuff. Stesso ordine di un if / else.
Navin,

1
@Navin Ah, forse è solo un fallimento della lingua che uso di più (python). stackoverflow.com/questions/394809/…
horta,

-3

Non vedo nulla di sbagliato nel formato della tabella. Preferenza personale, ma vorrei usare un ternario come questo:

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

Non c'è bisogno di ripetere returnogni volta :)


1
Come accennato in alcuni commenti, le dichiarazioni di ritorno non sono l'ideale o il punto del post, semplicemente un pezzo di codice che ho trovato online e formattato in un paio di modi.
horta,

I ternari di Python do_something() if condition() else do_something_else()no condition() ? do_something() : do_something_else().
Isiah Meadows il

@IsiahMeadows OP non ha mai menzionato Python.
Navin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.