La semplicità migliora sempre la leggibilità?


32

Di recente, stavo sviluppando una serie di standard di codifica per la nostra azienda. (Siamo una nuova squadra che si dirama in una nuova lingua per l'azienda.)

Nella mia prima bozza, ho fissato lo scopo dei nostri standard di codifica come migliorare la leggibilità, la manutenibilità, l'affidabilità e le prestazioni. (Ho ignorato la scrivibilità, la portabilità, i costi, la compatibilità con gli standard precedenti, ecc.)

Uno dei miei obiettivi durante la stesura di questo documento è stato quello di far passare l'idea della semplicità del codice. L'idea era che ci dovrebbe essere solo una chiamata di funzione o operazione per linea. La mia speranza era che ciò aumentasse la leggibilità. È un'idea che ho riportato dalla nostra lingua precedente.

Tuttavia, ho messo in dubbio il presupposto dietro questa spinta:

La semplicità migliora sempre la leggibilità?

Esiste un caso in cui la scrittura di un codice più semplice riduce la leggibilità?

Dovrebbe essere ovvio, ma per "più semplice" non intendo "più facile da scrivere", ma meno cose in corso per riga.


16
Se l'alternativa è il codice "intelligente", allora sì ...
Oded,


17
Cerca di evitare di usare termini così rigidi come sempre e mai. Questo per evitare di concentrarsi sui casi limite e invece concentrarsi sulle questioni più comuni che affrontiamo. Questo è ciò di cui tratta le migliori pratiche.
P.Brian.Mackey,

in realtà, si desidera 2 funzioni / operazioni per riga. a = bè un'operazione, b + cè una seconda, ovvero a = b + c2 operazioni. Il concatenamento di 2 funzioni / operatori è ancora leggibile:, foo(bar())o a = foo().
zzzzBov,

2
Inoltre, non preoccuparti troppo. Se provi a eliminare ogni parte della soggettività dalle tue spiegazioni, proprio come se provassi a specificare ogni possibile dettaglio dello stile di codifica in un milione o più regole, i tuoi standard saranno troppo complessi, illeggibili, ignorati e quindi inutili.
Steve314,

Risposte:


47

"Semplice" è una parola abusata. "Leggibile" può essere definito proficuamente come "semplice da capire", nel qual caso aumentare (questa misura di) semplicità per definizione aumenta la leggibilità, ma non penso che questo significhi. Ho scritto su questo altrove , ma in generale qualcosa può essere chiamato "semplice" o per essere più astratta (in questo caso un minor numero di concetti possono esprimere più fenomeni) o per essere più concreto (nel qual caso un concetto non richiede tanto di sfondo conoscenza da comprendere in primo luogo). Sto sostenendo che, a seconda della prospettiva, un concetto più astratto può ragionevolmente essere definito più semplice di un concetto più concreto, o viceversa . Questo, anche se "astratto" e "

Userò come esempio del codice Haskell che ho scritto qualche tempo fa. Ho fatto una domanda su StackOverflow sull'utilizzo della monade Elenco per calcolare un contatore in cui ogni cifra potrebbe avere una base diversa. La mia eventuale soluzione (non conoscendo molto Haskell) sembrava:

count :: [Integer] -> [[Integer]]
count [] = [[]]
count (x:xs) =
  -- get all possible sequences for the remaining digits
  let
    remDigits :: [[Integer]]
    remDigits = count xs
  in
  -- pull out a possible sequence for the remaining digits
  do nextDigits <- remDigits
     -- pull out all possible values for the current digit
     y <- [0..x]
     -- record that "current digit" : "remaining digits" is
     -- a valid output.
     return (y:nextDigits)

Una delle risposte ha ridotto questo a:

count = mapM (enumFromTo 0)

Quale di questi è "più semplice" da capire (cioè più leggibile) dipende interamente da quanto il lettore abbia acquisito confidenza con le operazioni (astratte) monadiche (e, per tale motivo, codice privo di punti). Un lettore che è molto a suo agio con questi concetti astratti preferirà leggere la versione (breve) più astratta, mentre uno che non è a proprio agio con tali operazioni preferirà leggere la versione (lunga) più concreta. Non esiste una risposta su quale versione sia più leggibile che valga per tutti.


11
Alcuni sviluppatori procederanno fino a quando non capiranno e preferiranno il one-liner. Difficile immaginare uno sviluppatore che capisca il one-liner che arriva a preferire la versione lunga. Pertanto IMO il one-liner è chiaramente migliore.
Kevin Cline,

7
@kevincline - supponendo che lo sviluppatore stia lavorando in modo isolato, sono d'accordo, la versione più corta è (probabilmente) migliore. Se lavora come parte di una squadra, e la squadra non è al livello in cui capisce e preferisce il one-liner, e devono tutti essere in grado di mantenere il codice, allora la versione lunga è (probabilmente) migliore in quella circostanza .
Aidan Cully,

6
Come contrappunto: dato che sei un esperto Haskeller, puoi leggere la seconda versione in un colpo d'occhio. La prima versione, d'altra parte, richiederebbe la lettura e la comprensione di molto più codice; non puoi farlo in un colpo d'occhio. Penso che ciò semplifichi la seconda versione.
Tikhon Jelvis,

6
@ Steve314: mapMè piuttosto idiomatico, e enumFromTofa esattamente quello che dice sulla scatola. In generale, trovo che in realtà sia più facile commettere errori off-by-one se si espande il codice - c'è semplicemente più codice in cui commettere un errore. Ciò è particolarmente evidente con cose come loop o procedure di ordine superiore in altre lingue , ma trovo che sia un principio generale.
Tikhon Jelvis,

1
@Tikhon - ma ciò non significa necessariamente leggere quel codice e il codice è proprio lì. Significa che possono esserci dei compromessi. Di solito fortemente unilaterale a favore dell'uso delle funzioni esistenti piuttosto che reinventare la ruota, ma ci sono eccezioni. Questo diventa molto ovvio in C ++, con alcuni degli "algoritmi" più banali nella libreria standard: usarli può occasionalmente essere più dettagliato e meno chiaro che scrivere direttamente il codice.
Steve314,

13

Se lo standard di codifica riguarda "Leggibilità, manutenibilità, affidabilità e prestazioni", basta affermarlo .

Non cercare di prescrivere come raggiungere queste cose in quanto ci saranno sempre situazioni in cui c'è un contro esempio.

Ciò che devi prescrivere sono le cose che causeranno la rottura del codice se non rispettate. I tratti stilistici non infrangono il codice e dovrebbero essere suggerimenti (fintanto che la maggior parte del team concorda sul fatto che è leggibilità, il resto dovrebbe essere la preferenza dello sviluppatore (con revisione del codice in modo che la pressione dei pari ricordi alle persone che altre persone devono leggere il codice)) .


Questo era l'obiettivo a cui miravo e quello era l'oggetto dichiarato. La semplicità (o meglio, l'unica funzione / operazione per riga) sembrava seguire naturalmente da quell'obiettivo. Sto cercando di accertare se la mia comprensione non era valida. Quando si creano standard di codifica, stabilire un insieme di regole e linee guida è il punto centrale dell'esercizio. Stabilire regole e linee guida troppo vaghe è inutile. In quanto tale, questa risposta non aiuta davvero.
Richard,

5
La mia tesi è che stabilire regole troppo rigide è peggio che inutile ed è effettivamente dannoso. L'impostazione di regole come un'istruzione per riga è stilistica. Questa è la cosa che NON dovrebbe assolutamente essere nelle linee guida del codice. Non fornisce vantaggi effettivi e può essere dannoso per la leggibilità e la manutenibilità se applicato senza pensarci.
Martin York,

3
+1 (perché non posso +10) Un errore comune che vedo con i nuovi gestori della programmazione è che provano a codificare ogni dettaglio. I migliori standard di codifica sono più simili ai biscotti della fortuna che alle ricette.
JohnFx il

"Stili e standard di codifica" era il nome del documento. Ovviamente questo non è uno standard (come in "Mai usare GoTo" o "Non usare mai brevi") ma uno stile. Lo stile unificante è importante per la leggibilità e la manutenibilità.
Richard,

1
Guida allo stile: "Questo progetto utilizza schede / spazi (scegline uno). Questo progetto utilizza lo stile parentesi graffa K & R / Allman / BSD / GNU (scegline uno). Non aggiungere spazi vuoti alla fine delle linee. Conserva codice pulito e leggibile Tutto sarà sottoposto a revisione da parte di due membri del team e di te stesso: per leggibilità / manutenibilità è necessaria una maggioranza di 2/3 per verificare il codice, per affidabilità e prestazioni sono necessari 3/3 (fornire prove appropriate per dimostrare ) Se verranno abusate verranno aggiunte altre regole :-) "Fatto.
Martin York,

7

Meno "cose ​​per riga", semplicità e leggibilità non sono la stessa cosa. Si può prendere un algoritmo non documentato oscuro incredibilmente complicato e codificarlo con 1 istruzione per riga anziché 2, e non diventerà molto più leggibile.

Meno "roba per linea" potrebbe anche richiedere agli sviluppatori di grandi monitor alti per vedere i blocchi di codice ora distribuiti in modo più verticale. O causare affaticamento degli occhi dalla lettura di caratteri più piccoli.

La leggibilità è la propria metrica, che spesso richiede un compromesso tra molte altre metriche più facilmente misurabili. Pre-vincolare tutte quelle altre metriche e il compromesso non diventa più possibile, con conseguente codice meno leggibile.


5

Sempre? - NO

Ironia della sorte, raggiungere il giusto livello di semplicità può essere un'impresa complessa. Penso che la chiave sia con moderazione. La semplicità può anche essere negli occhi di chi guarda, quindi se ti ritrovi a pensarci troppo, lascialo da solo o torna più tardi.

Personalmente, quando provo a tornare indietro e semplificare qualcosa che ho scritto, mi concentro su aree in cui ho cambiato idea o ho provato un paio di cose per ottenere quello che volevo. Di solito queste aree possono essere levigate. Quindi fai solo un paio di passaggi attraverso il codice per renderlo più leggibile senza distribuire le cose così tanto che stai saltando dappertutto per capire cosa sta succedendo in un debug.


5

Se vado per semplicità, posso scrivere codice in questo modo:

10000000000000000000000000000000000000000000

Ma se vado per leggibilità, preferirò questo:

1e43

D'altra parte, 1000è molto più leggibile e semplice rispetto 1e3a quando non si lavora sempre con numeri in notazione scientifica.

Questo è un esempio degenerato di un modello molto più generale che puoi trovare quasi ovunque: costruire qualcosa con blocchi molto semplici può rapidamente diventare illeggibile / inefficiente / cattivo in molti modi diversi. Generalizzare e riutilizzare, d'altra parte, all'inizio è più difficile ("wtf è e?! Intendevano scrivere 1343?" Qualcuno potrebbe dire), ma può aiutare molto nel lungo periodo.


Il tuo punto su "1e3" è meno leggibile di "100" è ben messo. In realtà, questo è un ottimo esempio di come il carico cognitivo influenza la leggibilità. "1e3" richiede la lettura di 3 caratteri e la traduzione dell'espiazione. La lettura di "100" richiede la lettura di 3 caratteri e nessuna ulteriore valutazione.
Stephen Gross,

Stephen, in realtà quando leggi un numero di tre cifre come 100te devi eseguire due moltiplicazioni e due aggiunte ( 0+10*(0+10*1)). Tuttavia, dopo aver usato questa notazione, non te ne accorgi nemmeno. Ciò dimostra ancora una volta come soggettiva può essere la nozione di semplicità.
Rotsor,

Interessante. Quindi, a rigor di termini, "100" richiede 2 moltiplicazioni (1 * 100, 0 * 10) e 2 operazioni di addizione. "1e3" richiede un'operazione di moltiplicazione. Quindi, in assenza di qualsiasi contesto cognitivo , "100" è più difficile da leggere di "1e3". Ma! Se si include il carico cognitivo a commutazione di contesto, il calcolo è diverso. Dato che normalmente leggiamo numeri interi in forma non scientifica, "100" è più facile. Ma se stiamo scrivendo un'app di ingegneria in cui tutti i numeri sono espressi in notazione scientifica, la forma "1e3" è più semplice!
Stephen Gross,

2

Non necessariamente. Se hai un'operazione complessa, quella complessità deve andare da qualche parte. Ridurre il numero di "cose" che vanno su una riga significa solo che occuperà più linee, il che può effettivamente essere dannoso per la leggibilità del codice se rende la tua routine troppo "alta" per adattarsi su uno schermo.


La complessità non è irriducibile. Abbiamo "astrazione" e "chunking" e "organizzazione" per cercare di gestire la complessità. Penserei che un'operazione complessa possa essere descritta in una serie di passaggi più semplici. Funziona per molti processi fisici del mondo reale: riepiloghi, panoramiche, ecc.
S.Lott

1
@ S.Lott: True, ma lo scorrimento e il clic Ctrl sufficienti potrebbero rendere più difficile seguire un processo "semplificato". L'ho visto accadere una o due volte (non è comune, ma può essere molto frustrante lavorare quando va troppo lontano).
FrustratedWithFormsDesigner il

3
@ S.Lott - ci sono ancora limiti a quanto può essere ridotta la complessità. È possibile eliminare la complessità non necessaria, ma è possibile gestire (non eliminare) solo la complessità necessaria, la complessità inerente ai requisiti. Probabilmente, i meccanismi per gestire la complessità aumentano anche la complessità - una certa complessità aggiuntiva è coinvolta nello spostare la complessità irrilevante fuori dalla strada per rivelare meglio i dettagli rilevanti per un particolare aspetto / problema / costrutto.
Steve314,

1
@ S.Lott - Beh, è ​​certamente vero che puoi rappresentare qualsiasi requisito tu voglia con un file sorgente a complessità zero (completamente vuoto). Ma poiché hai bisogno di una lingua molto specifica per soddisfare i tuoi requisiti, tutto ciò che stai facendo è spostare i tuoi requisiti nella specifica della lingua.
Steve314,

1
@ S.Lott - se stai sostenendo che puoi prevedere la posizione di Giove il giorno di Natale usando niente ma G=0, penso che tu sia pazzo. In caso contrario, mi manca il punto. Certamente puoi sottrarre dettagli irrilevanti, ma non è irrilevante se i tuoi requisiti dicono che è rilevante. Se rileggi, non ho mai sostenuto che tutta la complessità sia necessaria, solo che una certa complessità è inerente ai requisiti e non può essere eliminata.
Steve314,

2

Chiarezza + Standard + Riutilizzo del codice + Buoni commenti + Un buon design potrebbe migliorare la leggibilità .

La semplicità non è sempre nelle mani dello sviluppatore perché la natura degli algoritmi e la complessità della struttura dell'applicazione in questi giorni.

Prendi le semplici pagine Web che eseguono compiti semplici. Data una routine di ordinamento, non è possibile semplificare la logica, ma è possibile renderlo più chiaro con i commenti, utilizzando nomi di variabili significativi, averlo scritto in modo strutturato, ecc.


2

La semplicità migliora sempre la leggibilità?

No. Ho visto molti casi in cui fare più cose più semplici su una linea è meno complesso di avere più linee.

C'è un compromesso tra meno codice e codice più semplice.

In generale, consiglierei di cercare un codice più semplice a meno che non sia sicuro che farlo in meno righe sia meglio. Preferirei piuttosto avere un codice "troppo dettagliato" su un codice "troppo complesso".


1

"Rendi le cose il più semplice possibile, ma non più semplice" - Spesso parafrasi di Albert Einstein

La semplicità migliora tutto . Per diversi valori di semplicità, ovviamente. Sono meno righe di codice? Può essere. È un eseguibile più piccolo? Possibilmente. È qualcosa su cui la tua squadra deve essere d'accordo? Assolutamente .


+1 per il preventivo, ma la semplicità migliora la leggibilità?
Richard,

"Rendere le cose il più semplice possibile e poi semplificarle" è una parafrasi migliore in quanto gli ingegneri SW sono inclini a progettare troppo.
mattnz,

1
Vorrei che la gente smettesse di dire "rendi le cose il più semplice possibile, ma non più semplice". Non possiamo almeno generalizzare a MakeAsGoodAsPossibleButNoMoreSo <Thing, Attribute> come il nostro suggerimento di ingegneria inutilmente generale? (Mi dispiace @Jesse C. Slicer, sei tutt'altro che l'unica persona a citare questo, quindi non meriti davvero il mini-rant più di chiunque altro).
psr

1

La semplicità migliora sempre la leggibilità? Sì. Un'istruzione per riga è sempre più semplice? No. Molte lingue hanno un operatore ternario, che, una volta compreso, è più semplice e più facile da comprendere rispetto agli equivalenti compiti if / else.

Nelle lingue che consentono di impostare più variabili su una riga, farlo è spesso più semplice e facile da comprendere rispetto a qualsiasi equivalente.

Un altro esempio: le espressioni regolari fanno molto, in genere in una sola riga, e l'equivalente senza regex è spesso molto più difficile da leggere. / \ d {3} [-] \ d {3} - \ d {4} / è l'equivalente di una chiamata di funzione con almeno alcuni commenti ed è più facile da comprendere rispetto al corpo della funzione corrispondente.


1

Leggibilità e semplicità sono termini soggettivi che, a seconda della persona e del contesto, di solito ma non sempre vanno insieme.

Un termine più obiettivo è concisione - qualcosa che in linea di principio si può contare contando i personaggi, anche se ci sono alcuni difetti. La concisione sembra implicare semplicità e leggibilità, ma ci sono (almeno secondo me) delle eccezioni.

Un pezzo di codice più lungo (e probabilmente più complesso) può essere più leggibile se esprime meglio l'intento. Se la tua definizione di semplicità si preoccupa dell'intenzione è un'altra cosa soggettiva: potresti definire la complessità in termini di struttura sintattica ed entropia della teoria dell'informazione, per esempio, senza alcun riferimento alle intenzioni.

Quindi, un nome variabile più lungo ben scelto può ...

  • Migliora la leggibilità esprimendo meglio l'intento
  • Riduci la concisione: dopo tutto è più lungo
  • Non hanno alcun effetto sulla semplicità sintattica - la struttura sintattica del codice è invariata

Allo stesso modo, potrei scrivere if (some_boolean == true). In confronto con l'alternativa equivalente if (some_boolean), questo ...

  • Riduce la concisione
  • Riduce la semplicità sintattica, ma
  • Può migliorare la leggibilità esprimendo meglio l'intento.

Naturalmente questo scatenerà una protesta di massa - a molte persone, anche questo danneggia sempre la leggibilità. Per me dipende molto dalla fonte del valore booleano: ad esempio, il nome della variabile (o il nome del metodo o altro) potrebbe non esprimere chiaramente che il valore è "valore della verità". Certo, ifti dice qualcosa, ma profuma ancora. Ma molte persone mi chiameranno un idiota per crederci.

Che è un'ulteriore prova della soggettività generale, ovviamente.


1

Ti mancano tutte alcune definizioni fondamentali . Semplice, dalla radice sim-plex , significa una piega . Semplice significa fare una cosa . Facile, dalla facilità della radice , significa stare vicino . Facile significa che è a portata di mano . Gli esempi di codice semplice forniti in altre risposte non sono esattamente ciò che appaiono.

Prendi la visualizzazione di rotsor di un valore molto grande. Dice che è semplice . Secondo me, non è semplice. È facile. È a portata di mano per digitare il numero di 0 richiesti.

10000000000000000000000000000000000000000000

La versione leggibile è semplice. Fa una cosa. Esprime il numero descrivendone le dimensioni in uno scopo di notazione creato per questa funzione.

1e43

Potresti descrivere lo snippet di codice "semplice" di Aidan come fare una cosa? Contiene 10 righe di codice (senza contare i commenti) e almeno 7 blocchi (come li conterei). Se segui i commenti, vedresti che fa almeno 4 cose!

count :: [Integer] -> [[Integer]]
count [] = [[]]
count (x:xs) =
  -- get all possible sequences for the remaining digits
  let
    remDigits :: [[Integer]]
    remDigits = count xs
  in
  -- pull out a possible sequence for the remaining digits
  do nextDigits <- remDigits
     -- pull out all possible values for the current digit
     y <- [0..x]
     -- record that "current digit" : "remaining digits" is
     -- a valid output.
     return (y:nextDigits)

Ma una delle raccomandazioni per riscrivere questo codice era una dichiarazione. Aidan afferma che un lettore dovrebbe essere o familiarizzare con le dichiarazioni monadiche, il codice libero del puntatore, ecc. Va bene. Quei concetti sono singolari e indipendenti da imparare.

count = mapM (enumFromTo 0)

Scoprirai che il codice veramente semplice è più leggibile del codice semplice perché fa solo una cosa. Potrebbe essere necessario andare fuori e imparare più "una cosa" per capire il semplice codice. Ma dovrebbe essere sempre più leggibile.


1

La semplicità migliora sempre la leggibilità?

Direi, forse con un po 'di polemiche, assolutamente no .

Potresti consegnarmi una classe con 200 funzioni membro nella sua interfaccia pubblica, e potrebbe essere l'interfaccia pubblica più umanamente leggibile là fuori. Potrebbe essere una gioia leggere casualmente questo codice e la sua documentazione. Tuttavia, non lo definirei "semplice", perché a dispetto della leggibilità, dovrei preoccuparmi di come tutte queste funzioni interagiscono tra loro e potenzialmente fare attenzione ai casi complicati derivanti da un uso improprio.

Preferirei una classe con 20 funzioni membro che non erano così facili da leggere a 200, perché la "leggibilità" non è la mia priorità in termini di prevenzione dell'errore umano e miglioramento della manutenibilità del codice (la facilità con cui possiamo cambiarlo, cioè).

Tuttavia, tutto ciò dipenderà dalla nostra definizione personale di "semplicità". La "leggibilità" in genere non varia così selvaggiamente tra noi, a meno che qualcuno non abbia acquisito così tanta competenza e fluidità da considerare regex molto "leggibile", ad esempio dimenticando il resto di noi semplici mortali.

Semplicità

C'è stato un tempo, tanto tempo fa, in cui pensavo che "semplicità" significasse "il più facile da leggere possibile". Quindi scriverei il codice C con molte funzioni utili, cercando di migliorare la sintassi e rendere le cose il più facili da leggere e scrivere possibile.

Di conseguenza ho progettato librerie molto grandi, ricche e di alto livello, cercando di modellare una funzione per ogni pensiero umano naturale: aiutanti su aiutanti su aiutanti, tutti per modellare il codice client su una sintassi più leggibile. Il codice che ho scritto allora potrebbe essere stato il più "leggibile", ma era anche il più "non mantenibile" e "complesso".

blesità

Eppure ho avuto una breve passione con LISP verso la metà degli anni '90 (ritardatario). Ha cambiato tutta la mia idea di "semplicità".

LISP non è la lingua più leggibile. Spero che nessuno pensi che l'estrazione di CDR e CAR mentre invoca una funzione ricorsiva con un carico di parentesi annidate sia molto "leggibile".

Tuttavia, dopo aver lottato per farmi avvolgere il cervello dalla strana sintassi della lingua e dai modi totalmente ricorsivi di fare le cose, ha cambiato in modo permanente la mia idea di semplicità.

Quello che ho trovato con il codice che ho scritto in LISP è che non stavo più commettendo errori sottili, anche se la delicatezza di pensare in quel modo mi ha fatto commettere errori più palesi (ma quelli sono facili da individuare e correggere). Non avevo frainteso quello che stava facendo una funzione e mi perdevo un effetto collaterale sottile e imprevisto. Mi stavo solo divertendo in generale a fare modifiche e scrivere programmi corretti.

Dopo LISP, la semplicità per me è diventata minimalismo, simmetria, flessibilità, meno effetti collaterali, meno funzioni ma più flessibili che si combinano in un'infinita varietà di modi.

Sono arrivato ad apprezzare la mentalità secondo cui il codice più affidabile di tutti è il codice che non esiste. Sebbene sia solo una metrica grezza, tendo a vedere il potenziale di inaffidabilità del codice in base alla sua quantità. Cercare la massima praticità e leggibilità sintattiche tende ad aumentare tale quantità di un fattore importante.

minimalismo

Con la mentalità LISP integrata in me, sono arrivato a preferire le API minimaliste. Preferirei una libreria con meno funzioni, ma più affidabili e flessibili, che sono meno convenienti e la potenzialità più difficile da leggere rispetto a una che offre un carico di aiutanti "convenienti" e tale che può rendere il codice facile da "leggere" ma potenzialmente inciampare più problemi con inaffidabilità e sorprese che derivano dall'incomprensione di ciò che fa una di queste migliaia di funzioni.

Sicurezza

Un'altra cosa su LISP era la sicurezza. Promuoveva effetti collaterali minimi e funzioni pure, ed era lì che non mi vedevo più commettere errori impercettibili, anche se la difficoltà di leggere e scrivere nella lingua aumentava errori più palesi che potevo individuare 10 secondi dopo.

Funzioni pure e stati immutabili sono diventati preferibili per me ogni volta che potevo permettermelo, anche se la sintassi di:

sword = sharpen(sword)

... è un po 'meno semplice e distaccato dal pensiero umano rispetto a:

sharpen(sword)

Leggibilità VS. Semplicità

Ancora una volta, LISP non è la lingua più "leggibile". Può racchiudere molta logica in una piccola sezione di codice (probabilmente più di un pensiero umano per riga). Tendo a preferire idealmente un pensiero umano per riga per "leggibilità", ma non è necessariamente per "semplicità".

Con questo tipo di definizione di "semplice", a volte "semplice" potrebbe in qualche modo competere con "leggibile". Questo sta prendendo in considerazione le cose più dal punto di vista della progettazione dell'interfaccia.

Una semplice interfaccia significa che devi imparare molte meno cose per usarlo e potenzialmente ha una maggiore affidabilità e un minor numero di problemi a causa del suo minimalismo. Una documentazione completa sull'argomento potrebbe adattarsi a un opuscolo piuttosto che a un enorme volume di libri. Tuttavia, potrebbe richiedere un po 'più di lavoro grugnito e produrre codice meno leggibile.

"Semplice" per me migliora la nostra capacità di comprendere la funzionalità del nostro sistema ad un livello ampio. "Leggibile" per me migliora la nostra capacità di connettere ogni piccola riga di codice al linguaggio naturale e al pensiero e potrebbe accelerare la nostra comprensione di ciò che fa una riga di codice, specialmente se non siamo fluenti nella lingua.

Regex è un esempio di ciò che considero "estremamente semplice". È "troppo semplice e troppo illeggibile" per i miei gusti personali. C'è un atto di bilanciamento per me tra questi due estremi, ma regex ha quella qualità di semplicità simile a LISP come la definisco io: minimalismo, simmetria, incredibile flessibilità, affidabilità, ecc. Il problema per me con regex è che è così semplice che è diventato così illeggibile al punto in cui non penso che diventerò mai fluente (il mio cervello non funziona in quel modo e invidio le persone che sanno scrivere il codice regex in modo fluido).

Quindi, comunque, questa è la mia definizione di "semplicità", ed è completamente indipendente dalla "leggibilità" e talvolta può persino interferire con l'altro, portando a un atto di bilanciamento tra una libreria più "sintatticamente conveniente" e leggibile ma più grande o una "sintattica scomoda ", meno leggibile, ma ancora più piccola libreria. Ho sempre trovato la vera "convenienza della comprensione" e le vere priorità di "manutenibilità" in linea con quest'ultima, con la forte preferenza per il minimalismo anche a un certo costo per la leggibilità e la sintassi umana più naturale (ma non al punto di regex) . YMMV.


0

Sempre? - SÌ

Raggiungere il giusto livello di semplicità è un'impresa complessa e difficile. Ma vale sempre la pena poiché migliora sempre la leggibilità. Penso che la chiave sia la comprensione profonda. La semplicità è un assoluto, misurato da "nuovi concetti" per "pezzo" di codice. Alcuni nuovi concetti significa più semplice.

Concentrati sulle aree in cui è presente un denso gruppo di concetti e trova il modo di "frammentare" o "riassumere" o "astratto". Fai un paio di passaggi attraverso il codice per renderlo più semplice e più leggibile.

Una buona astrazione vale il suo peso in oro. Una buona astrazione rende questo più semplice - e di conseguenza più leggibile.


Non posso fare a meno di pensare che le tue citazioni di paura siano lì perché sei consapevole che "concetto" e "pezzo" sono essi stessi soggettivi. Il singolo concetto di una persona è un altro amalgama di tre idee distinte. È difficile avere una misura assoluta e obiettiva di cose soggettive.
Steve314,

@ Steve314: citazioni di paura? No. en.wikipedia.org/wiki/ Chunking sembrano tutti simili in quanto descrivono la semplificazione tramite chunking. (Tranne la tecnica della chitarra, questo sembra diverso.) Le virgolette sono lì perché ci sono così tanti termini alternativi per astrazione, chunking, riassunto, ecc. Se ne scelgo solo uno, tutti obiettano che l'astrazione non è la stessa cosa del chunking. Le citazioni sono lì per sottolineare che questo è in qualche modo discutibile. Ancora. È chiaramente fatto tutto il tempo e sembra essere una tendenza umana naturale.
S.Lott

Quello che non nego: il chunking è fatto tutto il tempo ed è una buona idea. Quello che nego - che esiste una regola oggettiva definitiva per dove dovrebbero esserci i confini tra i blocchi. Le mie argomentazioni possono essere più pedanti che utili, ma dubito ancora che "sempre" in "migliora sempre la leggibilità".
Steve314,

@ Steve314: riusciamo sempre ad astrarre, raggruppare e riassumere per aiutarci a capire le cose. Sempre. Chunking, abstracting, riepilogo ("semplificazione") è qualcosa che facciamo sempre. Lo facciamo e basta. È così che i nostri cervelli comprendono la realtà. La semplificazione migliora sempre la leggibilità e può sempre essere eseguita.
S.Lott

si lo facciamo. Non ho mai detto diversamente.
Steve314,

-2

Le domande mi ricordano questa risposta su Stack Overflow, in particolare questa citazione (sostituire la qualità con semplicità):

Qualità: sai di cosa si tratta, ma non sai di cosa si tratta. Ma questo è contraddittorio. Ma alcune cose sono meglio di altre, cioè hanno più qualità. Ma quando provi a dire qual è la qualità, a parte le cose che ce l'hanno, va tutto male! Non c'è niente di cui parlare. Ma se non riesci a dire cos'è la qualità, come fai a sapere di cosa si tratta o come sai che esiste? Se nessuno sa cosa sia, allora per tutti gli scopi pratici non esiste affatto. Ma per tutti gli scopi pratici esiste davvero. Su cosa si basano i voti? Perché altrimenti la gente pagherebbe fortuna per alcune cose e ne getterebbe altre nel mucchio dei rifiuti? Ovviamente alcune cose sono migliori di altre - ma qual è la `` migliore ''? - Quindi vai e vai, girare ruote mentali e in nessun posto trovare un posto per ottenere trazione. Che diavolo è la qualità? Che cos'è?

Penso che sia importante tenere presente che uno standard di codifica codificato per tutti i suoi benefici non renderà buoni programmatori di cattivi. Una parola come "semplice" può essere interpretata in modo diverso da persone diverse (vedi la risposta di Aidan Cully), ma potrebbe non essere una cosa così brutta. I programmatori junior dovranno ancora far rivedere il proprio codice da programmatori senior e capire perché l'interpretazione dei programmatori senior di "semplice" è migliore della propria.


1
Questo è il motivo per cui ho definito la semplicità nella domanda.
Richard,

-2

Una chiamata di funzione per linea è più semplice? Facciamo un esempio!

=== One call per line ===
x = y.getThis()
a = x.getThat()
b = a.getSomethingElse()

=== Less "simple" version ===
b = y.getThis().getThat().getSomethingElse()

Cosa pensi? Una chiamata per linea è davvero più semplice?


Sì. Una chiamata per linea è più semplice e più facile da leggere per me. Tuttavia, la leggibilità è soggettiva. (Inoltre, questo non si avvicina nemmeno alla risposta alla domanda.)
Richard,

Ciao Stephen, puoi approfondire come pensi che questo risponda alla domanda? Non è chiaro cosa stai cercando di sottolineare qui.

@MarkTrapp Nessun problema. La domanda originale proponeva un approccio a funzione singola per linea. L'esempio che ho pubblicato mostra gli stessi due frammenti di codice, uno implementato come singola funzione per riga, l'altro come chiamate a metodo concatenato. Penso che la chiamata incatenata sia molto più facile da leggere: breve, priva di variabili temporanee non necessarie ed elegante.
Stephen Gross,

Se devi eseguire il chain getter, il tuo codice è progettato in modo pool
Winter
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.