Interruzione di linea prima / dopo l'operatore [chiuso]


29

Mentre la convenzione sul codice Java di Sun suggerisce di mettere l'interruzione di linea davanti all'operatore molte altre linee guida non sono d'accordo. Non vedo alcun pro e contro ovvio, quindi ci sono vantaggi nell'usare uno di questi stili rispetto a un altro?

String longVarName = a + b + c + d +
          e + f;

vs

String longVarName = a + b + c + d
          + e + f;

Potete per favore pubblicare un semplice esempio di codice che mostra entrambe le convenzioni?
Michael,

Innanzitutto proverei a evitare la situazione usando qualcosa del genere: download.oracle.com/javase/1.4.2/docs/api/java/lang/…
Giobbe

Il collegamento è interrotto.
Florian F,

Risposte:


14

Lo lascerei su una riga e preferirei piuttosto la leggibilità in termini di nomi (e funzioni) che rivelano l'intenzione.

Una volta che diventa disordinato è il momento di refactoring :

  • rinominare var
  • introdurre nuove funzioni / var

Esempio

subtotal = price * (100 + tax_ratio) / 100`

vs.

tax = price * tax_ratio / 100
subtotal = price + tax

2
La formula a sinistra non è corretta. Dovrebbe essere price * (100 + tax_ratio) / 100o solo price * (1 + tax_ratio), a seconda che tax_ratiosia in percentuale o frazionaria.
Rufflewind

4
Questo non risponde alla domanda. Dovrebbe esserci una legge contro questo tipo di risposte.
Edward D'Souza,

@ EdwardD'Souza Mi sento lo stesso. Ma perché la risposta è stata accettata?
Rudy Vissers,

@RudyVissers la risposta risolve il problema a un livello più profondo. Risolve innanzitutto il problema della necessità di interrompere la linea. Da quel punto di vista, l'OP potrebbe considerarlo una risposta al suo problema, ma non è ancora appropriato dal punto di vista dell'essere un wiki della comunità.
Edward D'Souza,

ehi, non sono più qui, ma è davvero semplice - se ti trovi in ​​una situazione del genere, probabilmente stai sbagliando e dovresti pensare a refactoring del codice - o, in altre parole, dopo 15 anni di programmazione I semplicemente non mi importa più di queste cose, quello che mi interessa invece è la chiarezza del codice, la semplicità e il rendere facile per altre persone aiutarmi
Kamil Tomšík

36

Posso immaginare che la leggibilità sia un argomento

result = longidentifier +
   short -
   alittlelonger -
   c;

contro

result = longidentifier
   + short
   - alittlelonger
   - c;

Nel secondo esempio gli operatori sono ben allineati e puoi facilmente vedere con quale segno la variabile entra nell'equazione. Penso che ciò abbia senso anche per gli operatori binari, ma con il controvento ecc., Dovresti semplicemente fare tutto ciò che è più chiaro.


4
Per le situazioni in cui gli operatori sono importanti (come le espressioni matematiche e simili) sceglierei il numero due, perché, come hai detto, è molto più leggibile. Ma per le stringhe sceglierei le prime opzioni, poiché gli operatori sono "insignificanti". Non fanno altro che riunire le stringhe, e poiché le stringhe sono la parte importante, preferirei le prime opzioni.
Niklas H,

Entrambi i casi hanno merito. Entrambi i casi sono meglio che mettere tutto su una linea molto lunga! La mia preferenza è quella di utilizzare una parentesi aperta all'inizio (anche se non è necessaria) e quindi avere tutto allineato sotto quello. Lo rende molto più ovvio.
quick_now

35

Di solito seguo le linee guida di stile più comunemente usate o alcuni strumenti standard di codifica. Il vantaggio di utilizzare uno stile di uso comune porta vantaggi quando si legge il codice di altre persone o si è coinvolti in un progetto open source in cui sono stabilite le linee guida di stile.

Gli stili più comuni che ho visto è il secondo stile nella domanda. Vedi sotto per l'elenco di loro:

Guida allo stile di Google :

Quando una linea viene interrotta da un operatore non assegnato, l'interruzione precede il simbolo.

Convenzione sul codice solare :

Pausa prima di un operatore

Wrap Operatore Checkstyle controllo 's valore predefinito è nl:

L'operatore deve essere su una nuova linea


2
Aggiornato la mia risposta per chiarezza + convenzione sulla codifica di Sun.
ceilfors,

google.github.io/styleguide/javaguide.html (il link nella risposta è interrotto)
Martin Pfeffer

10

Nel codice tendo a mettere la pausa dopo l'operatore:

foo = some_long_expression() +
      some_other_long_expression();

Qui quell'operatore penzolante alla fine di una riga è un grande indizio per il lettore che il codice continua. Nei linguaggi che non hanno terminatori di istruzioni, quell'operatore penzolante può servire come indizio sufficiente al compilatore / interprete che il codice continua (altrimenti dovrei usare un brutto costrutto di linea di continuazione).

Nel documentare quell'espressione (se necessita di documentazione), tendo a mettere la pausa davanti all'operatore.


Almeno alcune lingue (ad esempio Python) non accettano un operatore binario finale come suggerimento del fatto che la linea continui, ma richiedono di più. Si noti che le nuove righe all'interno delle parentesi di solito non vengono conteggiate, quindi non è necessario un carattere di continuazione di riga esplicito (e soggetto a errori).

3

Finché rimani coerente, allora sappi che non c'è alcun vantaggio reale in entrambi i modi. Ciò è particolarmente importante quando si considerano le fusioni di codice e lo spazio bianco.


3

Credo che la linea dovrebbe iniziare con il simbolo più alto nella struttura di analisi dell'istruzione che si desidera interrompere. Evidenzia l'operatore che è più importante nell'espressione. È lo stesso motivo per cui hai inserito un altro all'inizio di una riga e non alla fine della riga precedente.

Nell'esempio seguente, analizzando il margine sinistro, viene visualizzata la struttura dell'istruzione come OR di 3 espressioni.

if (ch>='A' && ch<='Z'
    || ch>='a' && ch<='z'
    || ch>='0' && ch<='9')
{...}

Sotto, il || gli operatori sono meno evidenziati. È meno ovvio che si tratta di un || di espressioni. Soprattutto se le linee avevano lunghezze diverse.

if (ch>='A' && ch<='Z' ||
    ch>='a' && ch<='z' ||
    ch>='0' && ch<='9')
{...}

E solo per riferimento, questo è molto sbagliato. Il || gli operatori non sono affatto evidenziati.

if ( ch>='A' && ch<='Z' || ch>='a'
     && ch<='z' || ch>='0' && ch<='9')
{...}

Mi piace persino mettere le virgole all'inizio della riga, anche se raramente lo vedo. Mi astengo dal farlo sul codice condiviso.

var note:Object =
    { key: key
    , type: 'P'
    , text: someLongProcedureCallGettingTheUserInitials()
       + ": " + getTheTextThatWasTyped()
    };

2

Per lunghe equazioni aritmetiche, in genere faccio una delle due cose.

lascia tutto su una sola riga:

foo = bar + baz - fizz + buzz + alpha - beta;

In genere lo faccio per equazioni contenenti solo addizioni e sottrazioni, trovo molto facile fare un refuso con moltiplicazione e divisione che può seriamente rovinare l'ambito dell'operatore.

il secondo formato che utilizzo sono operatori progressivi:

foo = bar;
foo += baz;
foo -= fizz;
foo += buzz;
foo /= alpha - beta;
foo *= spiff;

Non vedo alcun motivo per accorciarlo su una sola riga, a meno che non si possa dimostrare che migliora le prestazioni in modo evidente. Inoltre, non vi è alcuna ambiguità su ciò che sta succedendo, e c'è meno possibilità di collocare erroneamente una parentesi per gli operatori /e *.


2

Posizionare il carattere di concatenazione (o qualsiasi operatore) all'inizio della riga migliora la leggibilità. Effettuiamo la scansione del codice concentrandoci sull'inizio di ogni riga. Quando una linea inizia con un operatore, il lettore può dire che la linea è una continuazione dell'istruzione precedente scansionando quel carattere.

Le espressioni matematiche lunghe sono sempre composte in modo che ogni nuova riga inizi con un operatore. Non vi è alcun motivo per cui il codice non dovrebbe seguire questa convenzione.


0

Lascia l'espressione su una riga e, se diventa troppo lunga, suddividila in espressioni più piccole:

days = ((year * months_per_year) + month) * days_per_month + day

diventa:

months = year * months_per_year + month
days = months * days_per_month + day

Se ciò non è possibile, allora trovo più leggibile interrompere prima dell'operatore e farlo iniziare direttamente sotto il compito precedente (metterlo sotto la variabile mi fa pensare e più recente, il che è fastidioso dato che l'obiettivo è rendere le cose più facili da leggere):

random = years * months_per_year 
         + month * days_per_month 
         + day * hours_per_day 
         + hour * minutes_per_hour 
         + minute * seconds_per_minute 
         + second

1
Questa risposta non aggiunge nulla di nuovo a ciò che è già stato detto.
Martijn Pieters,
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.