Dovrei mettere newline prima o dopo gli operatori binari? [chiuso]


11

Quando sei in Python o Javascript, dovresti sempre mettere gli operatori binari alla fine della riga precedente, per evitare che le nuove righe terminino prematuramente il tuo codice; ti aiuta a rilevare gli errori.

Ma in C o C ++, questo non è un problema, quindi mi chiedo:

C'è qualche motivo per preferire la seconda versione alla prima?

return lots_of_text
       + 1;

contro

return lots_of_text +
       1;

(Ad esempio, uno di essi aiuta a prevenire altri tipi di errori? O uno di questi è considerato più leggibile?)


No, non dovresti farlo in Python, soprattutto perché non ha l'effetto che affermi di avere. Un operatore finale non provoca una continuazione della linea; una barra rovesciata o con parentesi, parentesi o parentesi chiuse non chiuse.

@delnan: I (con molta attenzione) mai detto che provoca una continuazione di linea. Sono consapevole che devi ancora racchiudere i caratteri di raggruppamento. Ho detto che aiuta a prevenire errori con la fine della linea prematuramente, cosa che fa, dandoti un errore.
user541686

Vedo, ma non lo fa neanche. Almeno non l'ho mai visto accadere (e seguo scrupolosamente la regola di PEP 8 in merito al mettere le nuove righe dopo gli operatori) e non riesco a immaginare un codice non forzato che sia valido con la nuova riga prima dell'operatore ma non dopo l'operatore. Ad esempio, il codice come nel primo frammento contiene anche errori (dovuti al rientro). Qualcuno non aggiunge rientri quando si divide una linea?

@delnan: In realtà è molto facile rovinare accidentalmente il rientro con il tuo editor di testo, ad esempio quando si eseguono modifiche collettive o si esegue una selezione rettangolare. E se / quando ciò accade durante la manutenzione, non otterrai un errore nel primo caso e scivolerà silenziosamente da te, ma otterrai un errore nel secondo caso.
user541686

4
Non sono sicuro del motivo per cui questo è stato sottoposto a downgrade. Sembra una domanda ragionevole in stile codice.
Stuart segna il

Risposte:


18

Come puoi vedere dalle risposte, non c'è consenso su questo argomento. A meno che tu non lavori in gruppo, usa ciò con cui ti senti più a tuo agio.


Io preferisco l'inserimento di una nuova riga prima di operatori.

Ogni volta che devo interrompere le linee, di solito metto al massimo un termine dello stesso "livello" su una linea:

La legge di gravitazione di Newton in Python:

force = (
    gravitational_constant
    * mass_1
    * mass_2
    / (distance * distance)
)

Confronta questo con:

force = (
    gravitational_constant *
    mass_1 *
    mass_2 /
    (distance * distance)
)

Voglio sapere che "divido per distanza al quadrato", non voglio sapere che "mass_2 viene diviso", perché non è così che penso alle espressioni matematiche.

Inoltre, di solito voglio sapere prima cosa sto facendo (operatore), prima di preoccuparmi di cosa faccio (operandi).

Oppure considera questa istruzione SQL contorta:

WHERE
  a = 1
  AND b = 2
  AND c = 3
  AND ( -- or put the OR on one line together with the AND
    d = 3 
    OR e = 1)
  AND x = 5

Questo mi permette di vedere come le singole condizioni sono collegate molto facilmente, semplicemente scorrendo dall'alto verso il basso senza dover leggere tutte le righe fino alla fine per trovare l'operatore invece di:

WHERE
  a = 1 AND
  b = 2 AND
  c = 3 AND
  ( 
    d = 3 OR
    e = 1) AND
  x = 5

Penso al primo in termini di " Xè vero", quindi lo rettifico dicendo: " E questo è anche vero", che mi sembra più naturale del contrario. Inoltre, trovo il primo molto più facile da analizzare visivamente.

O un esempio di PHP:

$text = "lorem ipsum"
      . "dolor sit amet, "
      . "consectetur adipisicing elit, "
      . "sed do eiusmod tempor";

Ancora una volta, posso semplicemente sfogliare la lettura in verticale per vedere che sto semplicemente concatenando il testo, perché la maggior parte delle volte sento che in realtà non mi interessa cosa c'è dentro le stringhe / condizioni.

Naturalmente, non applicherei questo stile incondizionatamente. Se inserire la nuova riga dopo un operatore sembra avere più senso per me, lo farei, ma al momento non riesco a pensare ad un esempio.


Aggiunta la parentesi mancante al primo esempio.
Kevin Cline,

1
+1: esattamente giusto; la matematica è sempre composta in modo tale che le linee di continuazione inizino con un operatore.
Kevin Cline,

+1 per gli stessi motivi che descrivi, ma il tuo esempio di PHP mi sembra abbastanza strano. Quei concats non dovrebbero essere ., no .=?
Izkata,

@Izkata oh sì, hai ragione ovviamente. Grazie. kevin: Le parentesi erano corrette;) Le ho appena allineate conforce
phant0m

11

Quasi sempre interrompo le righe davanti agli operatori binari per chiarire ai lettori del codice che questa è la continuazione di un'espressione e non la frase successiva. Ciò è importante se la frase successiva verrebbe normalmente rientrata. Ad esempio, considera un'istruzione if con un'espressione condizionale complessa:

if (first_part_of_condition &&
    second_part_of_condition) {
    statement_within_then_part;
}

La seconda parte dell'espressione condizionale viene facilmente confusa con la prima istruzione della parte in poi. Questo può essere abbastanza confuso se la prima parte della condizione è lunga e il && finisce a destra. Confronta questo con l'alternativa:

if (first_part_of_condition
    && second_part_of_condition) {
    statement_within_then_part;
}

Sembra un po 'strano ma rende abbastanza chiaro che la seconda parte della condizione non è l'inizio di un'istruzione.

Lo faccio anche in altri contesti, ma l'istruzione if è la più importante, poiché l'indentazione è ambigua. Naturalmente, si potrebbe cambiare il rientro o il posizionamento del controvento, ma anche questo sembra strano.

tl; dr l'estremità sinistra della riga è più significativa per una rapida comprensione della lettura, quindi mettere l'operatore all'estremità sinistra è un marcatore più evidente che questa è un'espressione continua, non un'affermazione.


Pensiero interessante ma lo trovo piuttosto confuso (specialmente quando fatto con +e -che potrebbe anche essere inteso come operatori prefissi unari). La solita soluzione per far risaltare le linee continue è quella di rientrare di più (cioè di due livelli).
Konrad Rudolph,

"La seconda parte dell'espressione condizionale viene facilmente confusa con la prima istruzione della parte allora.": Questo non accade se si allinea verticalmente "{" e "}" (stessa colonna) per rendere l'inizio e la fine del blocco spiccano più chiaramente.
Giorgio,

8

Userei sempre il primo. Vuoi che sia chiaro cosa stai facendo con quell'1 lì. Se lo vedessi e ci fosse un muro di testo sopra quello 1 non avrei idea di cosa stesse succedendo fino all'utilizzo di quel 1.

Il '+' accanto a 1 chiarisce che almeno sto facendo qualcosa con l'1 in questione piuttosto che uscire in giro "Sono tutto nel tuo codice amico ..." senza una ragione apparente.


distaccato ...........
James,

7

Sento che aiuta a leggere enormemente la comprensione quando una riga indica che l'istruzione continua nella riga successiva avendo l'operatore binario alla fine e rendendo così incompleta l'affermazione. Il punto e virgola mancante non mi basta per capirlo immediatamente.

Questa potrebbe essere semplicemente una questione di abitudine ma a meno che tu non lavori esclusivamente in lingue che richiedono il punto e virgola (che trovo piuttosto irrealistico data la pervasività di script shell, makefile e linguaggi come Python) probabilmente non avrai nemmeno quell'abitudine.

EDIT: Giorgio fa un eccellente punto nei commenti: questo uso fa eco alla punteggiatura comune , sia in matematica che in linguaggi naturali. Scriveresti

Affondo,
quindi ho nuotato

Si potrebbe non scrivere

Affondo
, quindi ho nuotato


3
+1: tendo anche a leggere il + alla fine della riga come una virgola che separa due elementi in un elenco di operandi. Per questo motivo preferisco mettere il + alla fine di una riga come farei con una virgola (non inizierei mai una riga con una virgola).
Giorgio,

@Giorgio Questo punto è così eccellente che l'ho rubato per la mia risposta. Spero che tu possa perdonarmi.
Konrad Rudolph,

Vai avanti: mi sento onorato. ;-)
Giorgio,

7
Il codice non è inglese e penso che sia una falsa analogia usare le regole della sintassi inglese come modo per giustificare le convenzioni di codifica. Non mi piace lo stile dell'operatore finale, ma ammetto che Konrad ha un buon punto su linguaggi come Python.
M. Dudley,

3
Nella composizione matematica, l'interruzione di riga è sempre prima di un operatore, mai dopo. Nell'esempio prosaico, l'operatore è "quindi". Nella prosa inglese, le virgole sono essenzialmente segni di respiro.
Kevin Cline,
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.