2009-03-30 8 views
34

A volte è necessario scrivere nelle lunghe code di origine, è meglio interromperlo. Come si fa a indentare la roba cessa da questo.Se si rompono lunghe code line, come si fa a indentare il materiale sulla riga successiva?

È possibile far rientrare lo stesso:

very long 
statement; 
other statement; 

Questo rende più difficile differenziare dal seguente codice, come mostrato nell'esempio. D'altra parte si potrebbe rientrare è di un livello:

very long 
    statement; 
other statement; 

che rende più facile, ma può accadere, che la linea lunga è l'inizio di un blocco nidificato, che si desidera far rientrare, in questo modo:

if ((long test 1) && 
    (long test 2) && 
    (long test 3)) { 
    code executed if true; 
} 

In questo caso è difficile da leggere. La terza possibilità a cui riesco a pensare, è quella di non spezzare le lunghe code, gli editori moderni possono gestirli e creare linebreak morbidi. Ma con un altro editor devi scorrere lateralmente e non puoi influenzare la posizione, l'editor rompe la tua lunga fila.

Quale possibilità preferisci? Hai altre idee per risolvere questo? Puoi sostenere la tua preferenza con una buona giustificazione?

risposta

1

Con astyle o qualsiasi indentatore automatico che si sta utilizzando. Sembra fare un buon lavoro, e di solito ci sono cose più importanti a cui pensare.

2

Continuo espressioni bracketed a livello della loro apertura:

if ((long test 1) && 
    (long test 2) && 
    (long test 3)) { 
    code executed if true; 
} 

Questo rende evidente che ogni livello di espressione è.

+2

Mi dispiace dirlo, ma questo codice è estremamente difficile da leggere per me. – Mnementh

+1

Probabilmente ti ci abituerai, comunque. – Gauthier

5

ho due semplici regole:

  1. blocco di istruzioni: una rientranza;
  2. Proseguimento della riga: due rientranze o parentesi allineate, qualunque sia ulteriormente rientrato.

Così, nel caso caso:

if ((long test 1) && 
     (long test 2) && 
     (long test 3)) { 
    code executed if true; 
} 
+0

È più difficile da leggere e capire questo, rispetto alla variante di rbobby, con il rinforzo su una nuova riga. – Mnementh

+2

Questo è in realtà terribile –

+0

Questo è effettivamente utilizzato e consigliato da Google: https://google-styleguide.googlecode.com/svn/trunk/cppguide.html#Function_Declarations_and_Definitions e il formato clang fa anche questo tipo di indentazione per impostazione predefinita. – Juliano

3

ho a fianco con, "Non combattere l'IDE."

Tuttavia il mio IDE (Eclipse, Visual Studio) vuole interrompere le linee è come sono interrotte.

Ciò potrebbe significare incoerenze tra le lingue, che è OK.

+3

Come utente di emacs di solito discuto con l'utente di Visual Studio, ma ha esattamente ragione su questo. –

+2

Non combatto l'IDE ... mi combatte! – Juliano

+1

Non combatto con il mio IDE, perché è 'vi'. Molto obbediente e utile. Non parlo in termini di termini megalomani con i personaggi megalomani, come per esempio gli eclipse. – tchrist

0

A mio parere, una larghezza della linea di 78 o 80 caratteri è utile in quanto rende più facile avere più file aperti uno accanto all'altro sullo stesso schermo.

Giustificazione, che dire di un quote by Linus Torvalds? :)

La risposta è che se avete bisogno più di 3 livelli di indentazione, sei fregato comunque, e dovrebbe risolvere vostro programma.

Io di solito seguo un conglomerato del Google C++ coding style (è possibile adattare questo a Java, anche, immagino) e this C++ coding style.

+0

Posso montare 2 100 buffer di caratteri affiancati sullo schermo. In generale, Linus ha ragione. –

0

Non ho quasi mai indentato sulla stessa linea. Tuttavia, ho in rarissime ocasione ri-inizializzare un gruppo di variabili come questo

a 
= b 
= c 
= d 
= e 
= f 
= 0; 

L'unica cosa fondamentale con il fare qualcosa di simile a questo, però, è quello di mantenere l'operatore di assegnazione come primo carattere nella riga successiva. Questo darà il problema. programmatore un momento WTF quando lo vedono, costringendoli a guardare, non solo a sorvolare su di esso.

Concludendo un'affermazione molto lunga, lo farò ovunque io abbia la sensazione che abbia senso ... non necessariamente al primo trattino. Quindi:

reallyLongMethodName (paramA,paramB,paramC); 

non otterrebbe formattato come

reallyLongMethodName (paramA, 
    paramB, 
    paramC); 

ma finirebbe più come

reallyLongMethodName (paramA, 
        paramB, 
        paramC); 

con tutti i parametri in fila con la parentesi di apertura.

Perché se di e talora, mi piacerebbe fare qualcosa di simile a

if((long test 1) 
&& (long test 2) 
&& (long test 3)) 
{ 
    code executed if true; 
} 
38

Mi piace parentesi sulla loro propria linea perché ho bene più facile vedere la condizione e blocco interno tutti come un elemento (se sai cosa intendo):

if ((long test 1) 
    && (long test 2) 
    && (long test 3)) 
{ 
    code executed if true; 
} 

e mi piace iniziare linee condizionali aggiuntivi con ciò che la condizione è perché trovo che la condizione "lega" è molto importante e si tende ad avere trascurato alla fine della riga precedente.

Inoltre, provo a indentare in modo che l'effetto delle parentesi sia ovvio (anche se cercare di evitare i condizionali lunghi è generalmente una buona cosa).

cerco di roba struttura in modo che posso facilmente "scan" per "roba" :)

+0

Non è normale impostare la parentesi di apertura sulla riga seguente, ma ciò può impedire problemi di leggibilità con il rientro delle linee avvolte. – Mnementh

+4

Beh, potrebbe sembrare insolito per te, ma lo metto sempre su una nuova riga per lasciarlo allineare nella stessa colonna della parentesi di chiusura rendendo più facile abbinarli visivamente quando si scorre verso l'alto il codice. Bene, ognuno ha il suo modo di posizionarli. ;-) –

+3

+1 per parentesi graffe corrispondenti. Rende le cose molto più chiare, quindi perché non dovresti? – chimp

28

Si dovrebbe cercare di impedire la scrittura linee più lungo di 80 caratteri piuttosto che rompere loro:

  • Cerca di minimizzare il rientro convertendo le condizioni e il codice di incapsulamento.

Linus Torvalds: Se avete bisogno di più di 3 livelli di indentazione, sei fregato comunque,
e dovrebbe risolvere il vostro programma.

Questo ha anche l'effetto collaterale di rendere il codice molto più leggibile, oltre al fatto che le condizioni sono le altre cose che si incapsulano sono pronte per essere utilizzate altrove.

bool encapsulatedLongCondition() // Add some parameters 
{ 
    if (!condition1) 
    return false; 

    if (!condition2) 
    return false; 

    // ... (Other conditions) 

    return true; 
}  

if (encapsulatedLongCondition()) 
{ 
    // ... (Call some methods, try not to introduce deeper if/loop levels!) 
} 

Semplificare la sua condizione attraverso algebra booleana e cercando di invertire il valore della condizione e di ritorno può aiutare molto. :-)

Vedere anche: Can you simplify this algorithm? Vedere anche 2: Refactor per C# ha la capacità di assistervi. ;-)

  • definizioni Usa tipo e cercare di evitare i nomi lunghi

un semplice esempio, immaginare quanto tempo ci sarebbe utilizzando Giorni senza typedef con i nomi più lunghi in un altro contenitore.

struct Day 
{ 
    // Some data 
}; 
struct Event 
{ 
    // Some data 
}; 
typedef list<Event> Events; 
typedef map<Day, Event> Days; 
// Some other container that would else be long... 
  • ... (Si dovrebbe cercare di analizzare il motivo per cui la linea è lunga e trovare una soluzione per esso)

auguro che si ottiene l'idea generale, in questo modo non sarà necessario arrivare a una linea sporca interrotta. ;-)

L'unico posto dove vorrei vedere le lunghe file si verifica nei prototipi delle tue funzioni o quando li chiami, lì dovresti solo provare a rompere dopo l'ultima virgola possibile e continuare sulla riga successiva. Piuttosto che farlo dopo ogni e sprecare più righe rendendo lo scorrimento gonfio e la tua funzione risaltare troppo ... Puoi posizionare il tipo di ritorno sulla linea prima del nome della funzione se ti capita di vedere frequentemente queste linee lunghe.

void longFunctionName(ParameterType1 parameter1, ParameterType2 parameter2, 
         ParameterType3 parameter3, ParameterType4 parameter4) 
+0

In realtà cerco di evitare le lunghe code, per evitare di incappare nei problemi di indentazione. Ma a volte si verificano lunghe righe. Ma dai qualche buon suggerimento per ottimizzarli. +1 – Mnementh

+0

Stai inserendo il tipo di reso sulla riga precedente compatibile con lo stile di google? – zzz777

+3

Per me, le righe lunghe si verificano perché conferisco nomi molto espressivi alle mie variabili. E non mi importa di nomi di variabili lunghe (purché siano facili da leggere) poiché la maggior parte degli editor che uso hanno funzioni di completamento automatico. – elatalhm

1

direi che non importa quale metodo si usa fornendo soddisfa i seguenti criteri:

  • è ragionevole
  • si applica la stessa convenzione in tutto il codice.

Se sei in un team di sviluppo, fare cercare di concordare una convenzione tra voi, per qualche arcano meccanismo di voto se non è possibile raggiungere un accordo altrimenti e non c'è nessuno di dettare.

3

Ho una leggera variazione su ciò che è già scritto qui:

if ((long test 1) && 
    (long test 2) && 
    (long test 3)) 
{ 
    code executed if true; 
} 

Mi piace avere i miei operatori booleani alla fine della linea.

nomi dei metodi lunghi, o metodi con un sacco di parametri sono come questo:

reallyLongMethodName (paramA, 
         paramB, 
         paramC); 

con i bit allineati con il param name sopra; non la parentesi ...

Inoltre, per ridurre i rientri, ho iniziato a utilizzare più punti di ritorno nel mio codice, così come continua e interrompe i loop. es.

for(int i = 0; i < MAX; i++) 
{ 
    if(!isPrime(i)) // predefined prime finding func 
     continue; 

    //now we have only prime values of i 
} 
+0

si. Allineo sempre i parametri del mio metodo. alcuni sviluppatori mi chiamano un maniaco per aggiornare il mio codice e altri per questo stile ... – MikeJ

+0

Qual è il vantaggio? L'aggiornamento del codice di lavoro di altri programmatori e l'ulteriore sforzo di estenderlo su più righe ti fa perdere efficienza. –

+0

Ho il "vantaggio" di dover lavorare solo sul mio codice ... – masher

0

L'unico motivo per la formattazione del codice in un modo particolare è renderlo leggibile. Questo è intrinsecamente soggettivo: fallo in un modo che sembra buono e che ritieni sia più leggibile per chi guarda il codice per la prima volta. E ho intenzione di invertire il senso comune e dire, non preoccupatevi di qualsiasi standard comuni - per due motivi

1) E 'difficile in questa situazione, perché ci sono così tante possibilità diverse per linee spezzate

2) non ti compra nulla periodo. ancora una volta, la formattazione del codice è semplicemente per rendere leggibile il tuo codice, avendo un modo standard di formattazione dei dettagli del tuo codice non ti compra la leggibilità.

2

Indentare sempre, ma se le istruzioni sono speciali; Mi piace per allineare i test, e ho messo le && operatori in più a sinistra:

if ( (long test 1) 
    && (long test 2) 
    && (long test 3)) 
{ 
    code executed if true; 
} 

Tirando la && a sinistra per allinearsi con if è anche possibile, ma trovo questa alternativa più difficile da leggere.

+0

Questo sembra bello se rientri con gli spazi, che odio dato che ti ruba la possibilità di decidere da sola quanto indentazione ti piace vedere. Quindi intendo sempre con schede perché chiunque può visualizzare il codice può decidere se una scheda è 1, 2, 3, 4, 6 o 8 spazi, qualunque cosa preferisca. E quindi non posso usare spazi per allineare un'indentazione in quanto non so quanti spazi ci saranno per il visualizzatore. – Mecki

7

In generale faccio:

if (condition) { 
    something; 
} 

per delimitatori di blocco. Tuttavia, se il caso di una lunga serie devo rompere, io uso questo:

if (
    (long test 1) && 
    (long test 2) && 
    (long test 3) 
) { 
    code executed if true; 
} 

differenze fondamentali rispetto risposta di rbobby:

  1. operatori alla fine di ogni riga invece che l'inizio di linee successive, per indicare chiaramente visivamente che la linea è incompleta
  2. Interruzione di riga sulla prima riga prima dell'elemento condizionale - questo aiuta a mantenere la "forma" del codice coerente.
  3. Parente di chiusura non rientrato.

Questo ha l'effetto visivo di rendere parametro/liste condizionali guardare un po 'come i blocchi di codice (ma con parentesi al posto delle parentesi graffe. Trovo la simmetria gradevole. Evita anche avere un nudo apertura parentesi graffa su una linea (che sembra terribile)

0

Per Java Oracle fornisce tali convenzioni.Java Code Conventions - Oracle.

  • pausa dopo una virgola
  • Pausa prima di un operatore
  • Preferisco di livello superiore si rompe a livello inferiore pause
  • Allineare la nuova linea con l'inizio dell'espressione allo stesso livello sulla riga precedente
  • Se le regole sopra portano a codice confusione o codice che viene schiacciato contro il margine destro, appena trattino 8 spazi invece

Ad esempio,

longName1 = longName2 * (longName3 + longName4 - longName5) 
      + 4 * longname6; // PREFER 
longName1 = longName2 * (longName3 + longName4 
         - longName5) + 4 * longname6; // AVOID 

altro:

//DON’T USE THIS INDENTATION 
if ((condition1 && condition2) 
    || (condition3 && condition4) 
    ||!(condition5 && condition6)) { //BAD WRAPS 
    doSomethingAboutIt(); //MAKE THIS LINE EASY TO MISS 
} 
//USE THIS INDENTATION INSTEAD 
if ((condition1 && condition2) 
     || (condition3 && condition4) 
     ||!(condition5 && condition6)) { 
    doSomethingAboutIt(); 
} 
//OR USE THIS 
if ((condition1 && condition2) || (condition3 && condition4) 
     ||!(condition5 && condition6)) { 
    doSomethingAboutIt(); 
} 

Ulteriori esempi sono forniti in tale documento.