Preferisci la concisione o la leggibilità nel tuo codice? [chiuso]

21

Le scorciatoie di lingua possono essere spesso utilizzate per rendere il codice più conciso.

Ad esempio, gli operatori a coalescenza nulla e ternaria possono ridurre la quantità di codice, ma probabilmente a discapito della leggibilità:

In C #:

Person newGuy = new Person();
if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
} else {
    newGuy.Boss = boss;
}

è funzionalmente equivalente a:

Person newGuy = new Person();
newGuy.Boss = boss ?? GetDefaultBoss();

ma ovviamente molto più prolisso.

Dove traccia la linea quando si tratta di concisione o leggibilità?

    
posta Damovisa 06.09.2010 - 07:17
fonte

8 risposte

63

Entrambi.

Il tuo primo esempio è sicuramente più prolisso e probabilmente più esplicito ... ma richiede anche che io scruti cinque righe anziché una. Peggio ancora, sottovaluta il suo scopo: assegnare un valore a newGuy.Boss .

Il tuo secondo esempio potrebbe costare un secondo se non ho familiarità con l'operatore a coalescenza nulla, ma non ci sono dubbi sul suo scopo, e se sto esaminando una routine più ampia alla ricerca dell'origine di un valore , sarà molto più facile per me sceglierlo.

Ora, metti a confronto questo:

if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
    newGuy.IsTemp = true;
    newGuy.AddTask("orientation");
} else {
    newGuy.Boss = boss;
    newGuy.IsTemp = false;
}

... con:

newGuy.Boss = boss ?? GetDefaultBoss();
newGuy.IsTemp = boss == null;
if ( boss == null ) newGuy.AddTask("orientation");

Quest'ultimo esempio è di nuovo molto più breve, ma ora oscura il suo scopo rendendo le attività innescate dallo stesso test sembrano essere distinte. Qui, sento che la verbosità del primo è giustificata.

    
risposta data 06.09.2010 - 07:32
fonte
16

Mentre entrambi sono buoni obiettivi, mi schiererò sempre con Readability quando forzato a sceglierne uno.

Direi che il tuo esempio migliora sia la leggibilità che della brevità. Considera, tuttavia:

if( a > b )
{
    foo = bar
}
else
{
    if( c.isThing() ){
        foo = somethingElse;
    }
    else{
        foo = someFurtherThing.GetFoo();
    }
}

al contrario di

foo = a > b ? bar ?? whatever.something : c.isThing() ? somethingElse : someFurtherThing.GetFoo();

Quest'ultimo è conciso, ma è difficile da leggere. Il primo è dettagliato, ma il flusso della logica è chiaro.

In definitiva, la brevità non ha molto scopo, a parte la possibilità di adattarsi di più sullo schermo. La leggibilità rende più facile il debug, e quindi dovrebbe essere generalmente preferito.

    
risposta data 06.09.2010 - 07:56
fonte
11

Direi come regola generale non sacrificare mai la leggibilità a causa della concisione, ma non giudicare mai la leggibilità basata sulla mancanza di conoscenza di un altro programmatore su quell'argomento.

La concisione e la leggibilità non sono opposti. Come questa risposta, a volte più breve è più leggibile.

    
risposta data 06.09.2010 - 15:42
fonte
4

Direi che preferisco la leggibilità, anche se a volte significa usare un codice conciso. (Ie ternario per condizionali relativamente semplici all'interno di un blocco condizionale più grande.)

In sostanza, se è inutilmente difficile da capire, non farlo.

    
risposta data 06.09.2010 - 07:28
fonte
3

La leggibilità viene prima dove è in conflitto con la concisione, poiché il codice viene modificato più spesso di quanto sia inizialmente scritto. D'altra parte:

  1. Il rumore sintattico e il codice boilerplate spesso oscurano le intenzioni e quindi pregiudicano la leggibilità. A volte il codice più conciso è anche più leggibile. Ad esempio, pensa funzioni lambda o delegati / funzioni di prima classe rispetto alle classi a metodo singolo che implementano un'interfaccia a metodo singolo.

  2. La leggibilità dovrebbe essere valutata sulla base della facilità di lettura del codice per un programmatore ragionevolmente esperto che conosce abbastanza bene la lingua e le sue caratteristiche uniche / avanzate, non un codice scimmia a mala pena competente che conosce solo il minimo comune denominatore .

risposta data 25.10.2010 - 00:34
fonte
2

Un aspetto che non penso sia già stato menzionato: quali sono i tuoi obiettivi?

Se tutto quello che ti interessa è la sicurezza del lavoro, vai per conciseness & compattezza su tutto il resto. Salta anche commentando il tuo codice.

Se vuoi essere in grado di consegnare facilmente il tuo codice a qualcun altro mentre lavori a un nuovo fantastico progetto, consulta la leggibilità, la chiarezza e molti commenti concreti.

Nota: quanto sopra non riguarda te personalmente, @Damovisa; è per chiunque scelga tra le due posizioni.

    
risposta data 07.09.2010 - 00:45
fonte
2

C'è una cosa che la versione dettagliata ha come vantaggio.

Ha più linee e la maggior parte dei debugger sono orientati alla linea ! È molto difficile impostare un punto di interruzione nel mezzo di un'espressione, ma di solito è banalmente semplice impostarlo all'interno di un'istruzione di blocco.

In altre parole, quale vorresti vedere nel tuo editor se vuoi che il tuo debugger si avvii quando boss == null ?

(Detto questo mi piace l'operatore ??)

    
risposta data 17.10.2010 - 12:05
fonte
0

La leggibilità dovrebbe venire prima, a lungo termine la maggior parte delle persone passa la maggior parte del tempo a modificare o estendere il codice esistente: la leggibilità è una parte importante della manutenibilità.

Detto questo, la concisione è qualcosa che può contribuire alla leggibilità. Ad esempio, nella tua domanda il secondo snippet è sia più leggibile che più conciso.

    
risposta data 17.10.2010 - 11:42
fonte

Leggi altre domande sui tag