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


21

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

Ad esempio, gli operatori di coalescenza ternari e nulli possono ridurre la quantità di codice, ma probabilmente a scapito 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ù dettagliato.

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


3
Questa è una domanda soggettiva, qualcuno che ha implementato qualcosa direbbe che la sua strada ha un senso, qualcuno che la legge direbbe che non ha senso e un'altra persona che la legge direbbe che la capisco ma preferisco un altro modo. Questa è solo una preferenza.
Chris,

20
Penso che la seconda versione sia più leggibile.
Vaibhav,

2
Stai confondendo concisione con terseness. La concisione migliora la leggibilità. La terseness ne toglie.
Ferruccio,

1
@ ThorbjørnRavnAndersen: il pubblico per il codice C # di solito è "sviluppatori con uno sfondo C #". Da quello che ho visto, il consenso qui su programmers.se sembra essere che non dovresti evitare di usare utili funzioni linguistiche solo perché qualcuno potrebbe non averne familiarità. (Vedi anche: programmers.stackexchange.com/q/101513/33843. )
Heinzi

1
duplicato ?: programmers.stackexchange.com/q/58630/15464 .. Oh, questo è più vecchio. :)
Steven Jeuris,

Risposte:


63

Tutti e due.

Il tuo primo esempio è sicuramente più dettagliato, e probabilmente più esplicito ... ma mi richiede anche di scansionare cinque righe anziché una. Peggio ancora, sottolinea il suo scopo: assegnare un valore a newGuy.Boss.

Il tuo secondo esempio potrebbe costarmi un secondo se non ho familiarità con l'operatore di coalescenza nulla, ma non ci possono essere dubbi sul suo scopo e se sto eseguendo una scansione di una routine più ampia alla ricerca della fonte di un valore, lo farà essere molto più facile per me scegliere questo.

Ora, contrapponi 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");

Il secondo esempio è di nuovo molto più breve, ma ora ne oscura lo scopo facendo apparire distinti i compiti attivati ​​dallo stesso test. Qui, sento che la verbosità del primo è giustificata.


3
Risposta eccellente! - Non riguarda la verbosità tanto quanto lo scopo.
Damovisa,

2
@Damovisa: esattamente - l'obiettivo del codice è la comunicazione, e non c'è ragione generale per cui questo non dovrebbe essere fatto nel modo più conciso possibile (ma non di più).
Shog9

1
Imparare l'operatore di coalescenza nulla richiederà più di un secondo, ma se non lo conosci, dovresti impararlo!
Casebash,

2
Ah "??" sarebbe bello in Java.

Anche se l'ultimo esempio è più breve in termini di codice, in realtà sta valutando boss3 volte anziché solo una volta nell'esempio dettagliato. Questo è solo un altro motivo per cui un codice più breve, solo per essere più breve, è una cattiva idea. Penso che la concisione dovrebbe essere seconda all'obiettivo primario, sia che si tratti di leggibilità / manutenibilità (per codice complesso) o di prestazioni (per sezioni critiche di circuiti interni, ecc.). In altre parole, non ottimizzare mai solo per concisione - a meno che non preveda di inviare il codice tramite una connessione a 1bps;)
user193130

16

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

Direi che il tuo esempio migliora sia la leggibilità che la 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 a che fare con uno scopo, oltre alla capacità di adattarsi maggiormente allo schermo. La leggibilità semplifica il debug e quindi dovrebbe essere generalmente preferita.


11
Una formattazione corretta potrebbe facilmente migliorare la leggibilità del secondo esempio. Questo è un confronto ingiusto. Quando formattato in questo modo , non sono affatto sicuro che sia così male.
Steven Jeuris,

Gli esempi di codice non sono equivalenti: manca il primo ?? whatever.something.
John B. Lambe,

11

Direi che una regola generale non sacrifica mai la leggibilità a causa della concisione, ma mai giudicare la leggibilità sulla base della mancanza di conoscenza di un altro programmatore su tale argomento.

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


4
+1 per non assumere la mancanza di conoscenza di un altro programmatore. Nell'esempio fornito, la seconda opzione è solo meno leggibile se non si ha familiarità con l'operatore di coalescenza nulla. Non scriverei mai il mio codice in base al presupposto che i miei colleghi non conoscano la sintassi del linguaggio. Anche se non sapevano cosa ??significhi, se lo uso e poi lo imparano, ne abbiamo beneficiato entrambi. E non è difficile digitare "?? operator" su msdn.com
Tim Goodman,

4

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

Fondamentalmente, se è inutilmente difficile da capire, non farlo.


3

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

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

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


2

Un aspetto che non credo sia stato ancora menzionato: quali sono i tuoi obiettivi?

Se tutto ciò che ti interessa è la sicurezza del lavoro, cerca concisione e compattezza su tutto il resto. Passa anche a commentare il tuo codice.

Se vuoi essere in grado di distribuire facilmente il tuo codice a qualcun altro mentre lavori su un nuovo progetto interessante, vai per leggibilità, chiarezza e molti commenti solidi.

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


Sembra una sicurezza del lavoro ma se vuoi essere un programmatore, è una sicurezza del lavoro presso un'azienda sbagliata ...;)
Alois Mahdal

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 inizi quando boss == null?

(Detto questo mi piace l'operatore ?? -)


0

La leggibilità dovrebbe venire prima di tutto, a lungo termine la maggior parte delle persone trascorre 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 frammento è sia più leggibile sia più conciso.

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.