Perché la verbosità è negativa per un linguaggio di programmazione? [chiuso]


98

Ho visto molte persone in giro lamentarsi della verbosità nei linguaggi di programmazione. Trovo che, entro certi limiti, più un linguaggio di programmazione sia dettagliato, migliore è capire. Penso che la verbosità rafforzi anche la scrittura di testi più chiari APIper quel particolare linguaggio.

L'unico svantaggio che mi viene in mente è che ti fa scrivere di più, ma intendo, la maggior parte delle persone usa IDE che fanno tutto il lavoro per te.

Quindi, quali sono i possibili svantaggi di un linguaggio di programmazione dettagliato?


20
Hai codificato di recente in APL?
Logica SK

5
Scopri Lingue, verbosità e Java di Dhanji R. Prasanna
Jeremy Heiler,

67
"Uno sviluppatore ha solo un certo numero di sequenze di tasti prima di morire"
CamelBlues

10
Forse dovresti chiedere alle "molte persone che si lamentano" quali sono le loro ragioni.
Eric Lippert,

29
@EricLippert, credo che P.SE sia il luogo perfetto per interrogare un gran numero di sviluppatori "lamentosi".
Kevin McCormick,

Risposte:


168

L'obiettivo è una rapida comprensione

"Verbose" significa "usa troppe parole". La domanda è: "troppi".

Un buon codice dovrebbe essere facile da capire a colpo d'occhio. Questo è più semplice se la maggior parte dei caratteri serve direttamente allo scopo del codice .

Segnale vs rumore

Se una lingua è dettagliata, gran parte del tuo codice è rumore. Confronta "Hello World" di Java :

class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

... con Ruby:

print "Hello World!"

Il rumore spreca energia mentale.

Cryptic vs Clear

D'altra parte, l' eccessiva terseness in una lingua costa anche energia mentale. Confronta questi due esempi da Common Lisp :

(car '(1 2 3))   # 3 characters whose meaning must be memorized
# vs
(first '(1 2 3)) # 5 characters whose meaning is obvious

20
Direi che il secondo riguarda la leggibilità a livello micro (dove di solito preferiamo una notazione più dettagliata) dove come il primo riguarda la leggibilità a livello macro (dove di solito preferiamo più brevità)
jk.

67
Per qualsiasi programma che effettivamente fa qualcosa, Java diventa spesso molto più leggibile, specialmente con un buon uso della libreria.

9
in realtà un esempio migliore di verbosità su scala macro potrebbe essere modelli che aggirano una caratteristica del linguaggio mancante
jk.

21
Direi che anche l'esempio con Java non è il migliore. Cose come la necessità di definire una classe e un metodo contano nel golf del codice, ma difficilmente nelle applicazioni reali. Non è come se Java richiedesse molto codice per produrre poche parole, queste poche righe sono necessarie per creare un programma, e questo è diverso.
Malcolm,

27
+1 per la distinzione tra Signal vs. Noise e Cryptic vs. Clear
Spoike

118

Colpisce la quantità di codice che puoi vedere e analizzare in una sola occhiata

x++ piuttosto che set(x,Integeradd(get(x),1))

ps. Non si tratta solo di leggere il codice. Ai giorni delle schermate 40x25, le lingue di tipo APL, o Perl, erano utili su Cobol o Fortran per la quantità di codice che si poteva leggere / pagina. Ma ora si tratta più della tua cache interna - se un'istruzione ha un singolo operatore è più facile per il mio cervello invecchiato analizzare uno con 3 simboli e 4 chiamate di funzione.


19
Credo che questa sia la ragione ultima. Leggibilità su uno spazio limitato come un pezzo di carta o un monitor.

1
+1, e sono completamente d'accordo, e codice su un laptop da 13 ", ma poi questo sito ha 3 monitor come logo ... deve essere in qualche modo correlato :)
ZJR

1
@ZJR - vedi modifica.
Martin Beckett,

3
Quindi cosa fa il setmetodo qui? In realtà imposta qualcosa (ovvero il primo xparametro) o restituisce qualcosa (ovvero l'assegnazione a xdopo la chiamata)? Direi che c'è qualche strana duplicazione in corso nell'esempio dettagliato.
Jesse C. Slicer,

8
Una cosa che manca qui è l'utilità degli ideografi: i simboli possono essere più significativi delle parole. Ad esempio +è più significativo di plus. =è meglio di equals. Questo ovviamente può essere portato troppo lontano (ed è stato in diverse lingue) ma se usato con moderazione, è molto potente.
mcmcc,

29

Se la verbosità della lingua toglie la leggibilità del codice, allora è cattiva.

Alcune lingue hanno una sintassi così dettagliata che la comprensione del significato del codice richiede più tempo (sto pensando a VB.NET rispetto a C #):

If something Then
End If

if(something)
{}

Si riduce davvero a ciò che un programmatore ha familiarità e confidenza.


6
Lavoro principalmente in C #, ma quando leggo VB trovo che lo leggo come se fosse C #. Ignoro tutto If .. Then .. End Ife leggo solo ciò che è importante.
Andy Hunt,

7
lo stesso di Andy. Trovo entrambi ugualmente leggibili. Tenderei anche a dire che preferisco una piccola variante di VB (nonostante io sia più abituato a c #).
Dagnelies,

9
VB.NET non è prolisso rispetto ad altri criminali peggiori!

3
@AndyBursh - Esattamente il mio punto. Quando leggi VB.NET fai qualche traduzione mentale sopra e oltre la comprensione del codice.
Oded,

6
Oded, End-If è un costrutto molto più facile da capire per la fine di un'istruzione if rispetto alle parentesi quando le parentesi sono raggruppate all'interno di un'altra istruzione if, all'interno di un ciclo, all'interno di un altro ciclo, all'interno di una funzione che è dentro una classe. Tutti i blocchi sopra menzionati usano le stesse parentesi, il che significa che cercare di capire quale una particolare parentesi terminale corrisponde meno intuitiva.
Andrew Neely,

27

Dai un'occhiata ad AppleScript , uno dei linguaggi più prolissi a cui posso pensare che potrebbe essere considerato attuale , prova a scrivere qualcosa di trivalente in esso e torna indietro e prova a sostenere che la verbosità è un buon tratto in una lingua.

Cercare di ricordare tutta la semantica di dove vanno le parole chiave e cosa sono non è banale se non lo fai tutti i giorni.

Guarda tutto il rumore delle parole chiave in questo banale esempio:

tell application "Finder"
    if folder "Applications" of startup disk exists then
        return count files in folder "Applications" of startup disk
    else
        return 0
    end if
end tell

concesso lo stesso bashcon gli strumenti Unix tradizionali sarebbe conciso ma criptico per la maggior parte degli utenti OSX, quindi c'è un equilibrio che deve essere raggiunto.


15
Non volevi return the 0quando lo hai digitato? AppleScript è l'unico linguaggio che conosco che consente di mettere a dura prova le parole chiave degli avversari ... Intendo colleghi.
ccoakley,

l'IDE di Applescript, Script Editor, negli anni '90, aiutava a gestire la verbosità con la registrazione delle azioni di applecript , non era orribilmente intelligente, ma un po 'utile durante lo scripting Finder ... intorno al 1998 la registrazione si interruppe e non fu mai più riparata . (non so se la transizione OSX lo ha risolto, IIRC, no)
ZJR

3
La risposta di OSX all'ingombro di AppleScript è Automator. Sostituiamo il testo facile da scrivere con una gigantesca libreria di blocchi funzionali trascinabili, descritti in modo dettagliato e spiegati male!
soffice

La cosa peggiore di AppleScript è che ogni applicazione con cui vuoi guidare può avere una terminologia diversa. Apple definisce alcune suite di comandi che tutti i programmi dovrebbero supportare, ma in generale, sapere come eseguire il script di un'applicazione è solo di aiuto limitato nello scripting di un'altra.
kindall

1
Applescript è ingombrante da scrivere, ma di facile comprensione umana ... entro i limiti dei programmatori che inseriscono i hook di applecript con sintassi intelligibile nell'applicazione guidata.
Aramis,

23

Penso che devi girare la domanda sulla sua testa e chiedere: perché alcune persone pensano che il codice terse sia buono?

La mia risposta sarebbe che ci sono due ragioni fondamentali:

Ragioni per cui Terse può essere migliore

Questi includono essere più leggibili, allo stesso modo in cui una frase breve può essere più comprensibile di una frase fiorita e dettagliata. Spesso i linguaggi di programmazione che cercano di emulare la grammatica della lingua inglese finiscono per essere orribilmente prolissi, che richiedono enormi distese di codice per eseguire le azioni più semplici. Spesso scoprirai che più una lingua emula una lingua scritta, più è difficile convincerla a eseguire operazioni logicamente complesse.

Ragioni per cui Terse può essere peggio

Alcune lingue (e sto pensando al Perl) usano una serie di strani simboli, che sembrano essere stati scelti quasi arbitrariamente, come parte della loro sintassi. Per chiunque non abbia familiarità con questi geroglifici, la lingua diventa impenetrabile. Diventa anche facile commettere errori di battitura che non sono facilmente visibili. Le espressioni regolari forse incarnano questo tipo di terseness.

Inoltre, ad alcune persone piace mettersi in mostra scrivendo codici concisi perché, francamente, pensano che li faccia sembrare intelligenti. Lo vedi a volte su StackOverflow, dove le persone spesso inviano risposte estremamente compatte a spese della leggibilità. Questo è un tipo di "impressione dei tuoi colleghi" con quanto conosci la filosofia, ma i bravi programmatori si rendono conto che il " golf del codice " non è il modo di creare software gestibile.


Non prenderei in considerazione di mettere a tacere l'opposto del verboso. Il verboso porta una connotazione negativa, quindi probabilmente sarebbe più adatto per un antonimo che porta una connotazione positiva.
Joshua Drake,

6
terseè l'apice di verbose, tersepuò portare la stessa connotazione negativa (vedi Perl)

1
@JarrodRoberson: odio essere pedante il venerdì sera di tutte le cose, ma ho guardato alcuni dei thesaurus online e nessuno di loro ha tersecome un inno verbose(o viceversa). / anatre
Scott Mitchell,


15

@frowing, suggerirei che un modo per esaminare il problema della verbosità è rendersi conto che la programmazione è sempre un mix di due stili piuttosto diversi di ricerca ed espressione di una soluzione.

Il primo e più dettagliato stile è la programmazione orientata al linguaggio (linguistica). Questo stile combina parole simili a un sostantivo e parole simili a un verbo all'interno di strutture simili a una frase, ed è inteso per essere letto e compreso in modo molto simile a un paragrafo ben scritto. La programmazione linguistica è lo stile più universale di programmazione poiché il linguaggio stesso è universale. Per lo stesso motivo, il supporto di programmi a lungo termine necessita sempre di una potente componente linguistica, poiché la prima cosa che un nuovo programmatore cercherà è la comprensione concettuale di ciò che viene fatto. Come regola generale, più ti allontani dal contesto in cui hai creato un programma, più importante sarà uno stile linguistico di programmazione per garantire che i tuoi presupposti e concetti non vengano fraintesi dalla persona successiva che cerca di capire il tuo codice .

Il secondo e più conciso stile è la programmazione matematica (orientata alla matematica). Questo stile di ragionamento si basa anche sul linguaggio, poiché ad esempio le variabili sono analoghe ai sostantivi e gli operatori ai verbi. Tuttavia, il ragionamento matematico sfrutta la straordinaria e altamente parallela capacità dei nostri cervelli di effettuare complesse trasformazioni spaziali su oggetti che si trovano all'interno della nostra linea di visione. Rappresentando nomi e verbi come simboli compatti e distintivi che possono essere disposti in oggetti immaginari ben strutturati - equazioni - possiamo quindi usare le nostre capacità visive altamente parallele per eseguire rotazioni, sostituzioni, movimenti, inversioni e altre trasformazioni su questi immaginari oggetti. Il risultato è un'enorme amplificazione del numero di casi che possiamo gestire contemporaneamente, poiché ogni simbolo può rappresentare intere classi di oggetti strettamente correlati.

Nota che per applicare efficacemente l'elaborazione visiva, devi mantenere il tuo oggetto immaginario il più simile possibile per dimensioni e caratteristiche a un oggetto reale. Se il campo visivo necessario diventa troppo ampio, o i simboli non possono essere usati come segni mobili su un oggetto, o se devi “leggere lettere” e convertirle in parole, la capacità di eseguire trasformazioni complesse in modo affidabile cadrà rapidamente anche per un ottimo matematico.

Ecco perché le persone immerse profondamente nello stile matematico della programmazione possono diventare seriamente infelici se un'equazione viene diffusa ed espressa in quello che chiamerebbero uno stile linguistico "verboso". Non è perché l'equazione è stata modificata in modo significativo, è perché diffonderla in questo modo può rendere quasi impossibile applicare uno stile visivo di comprensione ad essa. Allo stesso tempo, è probabile che un nuovo programmatore che non abbia familiarità con i simboli brevi preferisca una versione più dettagliata che fornisca più informazioni linguistiche per comprendere inizialmente cosa fa il codice.

Quindi cosa consiglierei?

Usa entrambi gli stili, ma presta molta attenzione al motivo per cui stai usando ogni stile.

Ad esempio, tutto ciò che ha la possibilità di interfacciarsi con il mondo esterno dovrebbe essere intensamente dettagliato ad un certo livello, anche se solo sotto forma di commenti incorporati mescolati con il codice, e dovrebbe includere anche controlli automatizzati per un corretto utilizzo. Notazioni criptiche e soprattutto definite in modo incompleto non hanno affari in tali interfacce, dal momento che sono quasi garantite per essere fraintese ad un certo punto. La perdita del Mars Climate Obiter del 1999 a causa di un fallimento nel riconoscere se le unità di interfaccia software fossero espresse in libbre o Newton è un esempio particolarmente evidente dei pericoli di affidarsi troppo casualmente a numeri grezzi su interfacce software o hardware.

Al contrario, qualsiasi forma di programmazione profondamente algoritmica e matematica è una buona programmazione succinta che supporta lo stile matematico del ragionamento. Se qualcuno di nuovo deve mantenere tale codice, di solito sarebbe meglio per loro imparare le notazioni matematiche invece di provare a trasformare il codice in forme più dettagliate. Ovviamente ci dovrebbe essere sempre la documentazione facilmente disponibile per spiegare le parti matematiche del codice disponibile per tali sviluppatori, ma questo è un problema separato.

Tra questi due estremi ci sono molti casi in cui il programmatore ha una notevole discrezione. Suggerirei di esaminare come il codice verrà mantenuto a lungo termine e di cercare di soddisfare le esigenze delle persone che più probabilmente mantengono il codice a lungo termine.


8

Un certo numero di persone ha accennato a qualcosa che penso dovrebbe essere dichiarato esplicitamente.

La verbosità tende a favorire la comprensione a livello microscopico - in genere porta a un'affermazione individuale di facile lettura e comprensione. La verbosità tende anche a ridurre il grado di familiarità con la lingua necessaria per capirla (almeno in parte). I linguaggi più dettagliati (ad esempio, COBOL) possono essere almeno in qualche modo leggibili anche da non programmatori completi.

La concisione tende al contrario: aiuta a comprendere a livello macroscopico, specialmente dai programmatori con la più intima familiarità con quel particolare linguaggio. Allo stesso tempo, la mancanza di familiarità con quel linguaggio specifico può impedire persino una comprensione rudimentale, anche da parte di programmatori che sono altrimenti abbastanza esperti.

Pertanto, la leggibilità varia ampiamente a seconda del pubblico di destinazione. Da un lato, considera un progetto ampio e complesso che viene scritto e gestito da persone che lavorano quasi esclusivamente su quel progetto, la maggior parte delle quali ha un notevole background di programmazione e formazione (ad esempio, molti dottorandi). Ciò tenderà a favorire un linguaggio più conciso.

Più o meno all'estremo opposto, prendi in considerazione un progetto che è considerevolmente più semplice (anche se forse ancora abbastanza grande) gestito principalmente da persone specializzate nel business associato al software, piuttosto che nel software stesso. Ciò favorirà quasi sicuramente un linguaggio molto più dettagliato.


6

Piuttosto che andare a un libro tecnico, torno a Elements of Style * di Strunk and White. Il concetto alla base è "Sii preciso" e "Non dire più del necessario". Tutto il resto è commento.

Applicato alla programmazione, si tratta di essere molto precisi, ma di non avere lanugine non necessarie. La lanugine in più può essere sintassi, ma potrebbe anche essere più parole del necessario per trasmettere significato. (Ovviamente non troppo pochi per consentire l'ambiguità)

  • Cito la versione originale poiché è la più concisa. :-)

5

Alla fine della giornata, tutto ciò che è "diverso" farà urlare le persone. Sono a mio agio con la sintassi in stile C e quindi ok con altri linguaggi che condividono una sintassi simile (C ++, Java, C #). Quindi tendo a favorire questo stile particolare.

Le lingue tendono a trovare un equilibrio tra abbastanza descrittivo e non dettagliato.

Perl è un esempio di dove puoi scrivere un codice molto conciso. Per chi non lo sapesse, il codice scritto da un ninja Perl è a dir poco magico.

COBOL è un esempio di troppo prolisso.


5
Come risponde alla domanda?
ChrisF

la verbosità è diversa per tutti. Questo era lo scopo del mio commento. Se ti trovi nel campo C / C ++, la verbosità accettata è diversa rispetto a quella del campo Perl.
Nasir,

il codice scritto da un ninja perl è a dir poco magico? Seriamente, penso che sia un incubo.
Kevin,

sto alla larga da perl :)
Nasir

Per i programmatori COBOL potrebbe essere troppo dettagliato rispetto ad altre lingue. Tuttavia, COBOL ben scritto può essere facile da leggere per i clienti aziendali. Ciò consente loro di verificare che il codice faccia ciò di cui hanno bisogno leggendolo.
BillThor,

4

Ho letto da qualche parte una volta che gran parte del dibattito prolisso viene da nuovi programmatori contro vecchi. L'analogia usata era che quando impariamo qualcosa di nuovo, ci raccontiamo una "storia" per superarla (pensate a quando avete imparato l'algebra in HS). Man mano che acquisiamo esperienza, andiamo oltre la necessità di una storia che spieghi i singoli componenti e ne comprendiamo una quantità maggiore. Il nostro codice diventa più denso e più conciso, con commenti che spiegano solo gli elementi necessari, invece di ripetere ciò che dice il codice.

Ho trovato che questo è vero tra me e un collega. Scrive codice con molti commenti che spiegano quali sono le righe di codice e un sacco di spazio bianco. Se lo sto leggendo, trovo che per questo motivo posso inserire solo poche righe di codice su una schermata. Ciò rende la comprensione di ogni singola linea molto più semplice, ma il trekking rende l'intera funzione molto più difficile.

Tendo a scrivere codice senza spazi o commenti extra. Questo rende il tutto molto più semplice, ma devi essere semplicemente in grado di "ottenere" le "parole" del singolo codice. Se provassi a leggere questa risposta con ogni parola sulla sua stessa riga, con un sacco di spazi bianchi / commenti / verbosità extra, sarebbe molto più facile capire ogni singola parola, ma molto più difficile da capire il tutto.


Nessuno è contrario ai commenti. Il problema sono linguaggi come java, applecript o Visual Basic, che hanno molti elementi ridondanti ma obbligatori.
Marcin,

2
@Marcin Non sono neanche contrario ai commenti, ma quando sono così: i++; //this is adding one to var iè ridondante.
Spencer Rathbun,

La domanda riguarda i linguaggi di programmazione.
Ripristina Monica il

2
@BrendanLong Hmm, forse non ero chiaro. Stavo equiparando i commenti non necessari ai linguaggi di programmazione dettagliati. Molte parole per dire la stessa cosa, solo un linguaggio di programmazione dettagliato le richiede sempre.
Spencer Rathbun,

Si potrebbe sostenere che una funzione non dovrebbe consistere in più di poche righe comunque. Se è difficile capire come funziona la funzione, probabilmente non è a causa di troppi commenti. Ma concordo sul fatto che i commenti che dicono solo ciò che è immediatamente chiaro dovrebbero essere evitati.
circa il

4

Einstein ha capito bene: "Rendi le cose il più semplici possibile, ma non più semplici".

Questo vale anche per il codice. Se puoi semplificare il codice rimuovendo elementi ripetitivi e inutilmente prolissi, questa è una buona cosa.

Inoltre, alcuni casi studio suggeriscono che la produttività del programmatore misurata in righe di codice è più o meno una costante. Lo stesso vale per il numero di bug per LOC. Quindi passare a una lingua che ti consente di fare di più per riga di codice può essere considerato un miglioramento della produttività, se tutte le altre cose rimangono uguali.

Detto questo, c'è una tendenza in questo settore a progettare eccessivamente e complicare quelle che dovrebbero essere cose semplici. Cose semplici come riempire i dettagli di contatto in un database relazionale. Ho visto alcune soluzioni ridicolmente complicate e fuorviate ( tosse MDA) per quel particolare problema. Lingue come Scala e Ruby sono buoni esempi di potenti strumenti che nelle mani di determinati individui danno origine a codici incomprensibili, eccessivamente complicati e scarsamente mantenibili. Solo perché puoi usare più livelli di indiretta con pochi colpi di chiave non significa che devi battere ogni chiodo in vista con quel particolare martello.

Se usato correttamente, ottieni un codice pulito che è sia breve che facile da capire. Se usato male, è meglio limitare la persona in questione all'utilizzo di Visual Basic o di un linguaggio altrettanto limitato per prevenire ulteriori danni.

La vera abilità sta nel fare cose complesse in modo semplice, non nel fare cose semplici in modo complicato.


3

Qualcosa che nessun altro ha colpito è la quantità di codice che puoi inserire in una schermata. Aiuta per diversi motivi:

  • Meno scorrimento avanti e indietro quando si sta lavorando (o leggendo) più funzioni in un file.
  • Meno scorrimento orizzontale (interrompere la lettura, fare clic e trascinare la barra di scorrimento, interrompere la lettura, fare clic e trascinare la barra di scorrimento ...).
  • Scansione più rapida, poiché la sintassi è meno inutile nel modo di trovare ciò che desideri.

davvero quanto si scorre su uno schermo 1920 X 1080 con una dimensione del carattere ragionevolmente leggibile? Ci sono anche queste cose chiamate scorciatoie da tastiera per la navigazione in entrambi i modi.

@JarrodRoberson - Il mio schermo mostra circa 30 righe. Se apro la finestra del codice a schermo intero e riduco la dimensione del carattere per essere appena leggibile, ottengo 60 righe. Ho dovuto lavorare su diverse migliaia di file di linea (non per scelta, te lo assicuro). Uso il "navigatore" nel mio IDE, ma non è affatto conveniente come dare un'occhiata tra due sezioni di codice che sono entrambe sullo schermo.
Ripristina Monica il

Il tuo IDE non supporta le visualizzazioni divise?
sinistra il

2
Ti manca entrambi il punto: se il mio IDE può rendere lo scorrimento meno male , non sarà mai buono come non dover scorrere (o usare i tasti di scelta rapida o schermo diviso) . È come dire "Le tastiere sullo schermo vanno bene, non hai mai sentito parlare di fare clic sulle cose?"; Ovviamente ce l'ho, ma non batte avere una tastiera reale.
Ripristina Monica il

Ricordo vagamente che in realtà ci sono studi che dimostrano che ciò è vero (in particolare la parte a scorrimento). Dover scorrere per vedere un'intera unità logica rende più difficile la comprensione. Sembra plausibile, almeno.
Konrad Rudolph,

1

Perché più codice significa più tempi di sviluppo e più bug.

Se scrivi 100 righe di codice anziché 300 righe di codice. Ciò significa quasi 1/3 dei tempi di sviluppo necessari e 1/3 dei potenziali bug che potresti incontrare.

Nella maggior parte dei casi è necessario bilanciare l'efficienza e la concisione, poiché scrivere meno codici significa che la macchina deve fare più cose e diminuirà l'efficienza.


2
Mi aspetterei molti più bug nascosti in 100 linee tipiche di Perl che in 300 linee di Ada. - Quanto a "dal momento che scrivere meno codici significa che la macchina deve fare più cose e ridurrà l'efficienza", potrebbe esserci una tale correlazione ma non è causalità. È solo che i linguaggi dinamici concisi e / o interpretati come Ruby, Perl e Python tendono ad essere più lenti dei linguaggi compilati statici più dettagliati come C o Fortran. Ma i programmi Haskell, Python w / PyPy o C ++ compilati in modo conciso possono essere molto più veloci di quelli dettagliati, ad esempio interpretati come Basic, Groovy, Smalltalk o persino codice C #.
circa il

1

Di solito, le persone preferiscono le lingue leggibili / verbose rispetto a quelle criptiche / chiare. Tuttavia, penso che la maggior parte delle persone abbia assimilato la "verbosità" con il "disordine", che non sono la stessa cosa.

Per esempio: while(<>){print if($.==2 || $& && !$x++); $.=0 if (/^--+$/)}

è un'affermazione molto concisa. Contiene tutto quello che vuoi sapere. Tuttavia, a causa della sua morbidezza, è difficile da capire. D'altra parte, una versione leggermente più dettagliata dello stesso programma sarebbe abbastanza semplice da capire perché è più leggibile. Ovviamente questa non è una proprietà del linguaggio di per sé, ma alcune lingue tendono a una maggiore verbosità mentre altre tendono a una maggiore concisione nel loro modo di programmare.

All'altro estremo della verbosità, è http://en.wikipedia.org/wiki/Literate_programming , che considero un concetto piuttosto interessante.

Un altro aspetto è la "verbosità indesiderata", chiamata anche "disordine". Cose che devi aggiungere per motivi tecnici, mancanza di zucchero sintattico, API gonfiate e così via.

Penso che una sintassi chiara e intuitiva sia molto importante. Deve anche essere abbastanza dettagliato per facilitare una lettura facile. Dichiarazioni troppo brevi piene di troppa logica spesso possono portare a più tempo per la decifrazione rispetto alle loro controparti leggermente più lunghe. D'altra parte, l'inutile codice gonfio pieno di righe di caldaia per fare qualcosa di assolutamente semplice è ugualmente fastidioso.


4
Potresti voler ricontrollare il [significato di conciso] ( en.wiktionary.org/wiki/concise ), in quanto è quasi un antonimo di criptico. Hai forse un codice in Java?
Joshua Drake,

2
Preferisco un codice dettagliato scritto in lingue concise.
Ripristina Monica il

@Joshua: sì, ho notato che può essere interpretato in modi molto diversi, quindi ho modificato la mia risposta. ... e che c'entra Java?
Dagnelies,

1
Un commento per affermare perché è stato downvotato può essere più interessante del downvote stesso.
Dagnelies,

@arnaud my bad for using wiktionary. La ricerca di Google definisce: inizia conciso: "Fornire molte informazioni in modo chiaro" che il codice di esempio viola chiaramente. Anche se devo riconoscere le implicazioni originali di conciso, chiaro e conciso, ora viaggio insieme.
Joshua Drake,

1

La verbosità è una tendenza ad usare grandi quantità di testo e Terseness l'uso di pochissimo testo ...

La verbosità è cattiva perché:

  1. introduce maggiori opportunità di errore tipografico
  2. rende più difficile leggere il codice sullo schermo o sulla carta e / o inserire sulla scheda perforata
    1. questo aumenta i tempi di debug
    2. questo rende più difficile la comprensione del codice per l'aggiornamento / la manutenzione
    3. questo può portare alla duplicazione involontaria del codice
  3. aumenta in qualche modo la probabilità di errore di sintassi
  4. diminuisce la flessibilità di codifica, in quanto la maggior parte delle lingue verbose sono altamente strutturate e non hanno più modi di dire la stessa cosa.
  5. aumenta i tempi di codifica e compilazione
  6. può richiedere più spazio di archiviazione.

Un certo livello di verbosità è essenziale per la chiarezza, tuttavia ...

un livello minimo di verbosità è buono perché:

  1. è più facile per gli umani leggere e associare un valore semantico a un codice puramente simbolico
  2. Nella denominazione delle variabili e delle funzioni, semplifica il debug, il port e il mantenimento del codice
  3. nelle operazioni linguistiche di livello base e parole chiave di lingue complesse, porta a un minor numero di operazioni / assegnazioni di parole chiave errate.

Alcuni meravigliosi esempi di comandi troppo concisi per molte persone includono i vecchi standbys BASIC di val(x$), str$(x)e chr$(x)... restituiscono un numero dalla sua rappresentazione di stringa, restituiscono una stringa per un numero e restituiscono un singolo carattere con valore ASCII x come stringa.

O il puntatore C / C ++ e dagli operatori di riferimento &e *rispetto alla byrefparola chiave BASIC . In C / C ++, posso avere una variabile X e passare un puntatore a quella variabile, ma devo ricordare quale è il puntatore e quale è "usa il puntatore come variabile a cui punta"; in base, passo semplicemente il riferimento con una parola chiave byref nella chiamata di funzione, che è più chiara, ma meno flessibile:

def fn Foo(x byref as float) foo= (x += x+1)
...
Foo(x)

In questo codice, i contenuti di x vengono modificati a causa del flag byref. Alcuni sapori consentono il byref a chiamata, altri nella definizione, alcuni in entrambi.

La verbosità è importante per i programmatori occasionali per poter usare il simbolismo più facilmente; BASIC o Python sono più leggibili dall'uomo e più dettagliati di C / C ++ e quindi molto più utili per programmatori occasionali; la terseness di C / C ++ lo rende molto migliore per i programmatori più esperti, che hanno bisogno di vedere più codice e codice più complesso in una schermata, ma hanno dovuto imparare le varie convenzioni della struttura simbolica. In fondo c'è APL, che è quasi completamente illeggibile per l'uomo.

Un problema intimamente correlato è la chiarezza: il codice conciso è spesso poco chiaro e un codice eccessivamente dettagliato (come in AppleScript) può essere altrettanto poco chiaro. La familiarità con un determinato linguaggio aumenta la chiarezza del codice terse all'interno di quel linguaggio - un principiante grezzo, che affronta il codice C ++ è probabilmente in grado di analizzare solo le formule, e anche molto codice BASIC o Python funzionale è troppo conciso per la comprensione, ma applecript può essere perplesso, generalmente, senza ricorrere ai dizionari linguistici. Il meno chiaro che ho incontrato senza offuscamento intenzionale è Inform 7 ...

Ai vecchi tempi

Un'altra considerazione importante in passato, ma che non è più così importante per il programmatore hobby, è il funzionamento e lo spazio di archiviazione. (È ancora vitale nella fascia alta.) Tenendo presente che molte lingue sono state interpretate, in particolare i sapori BASIC, e molte altre sono state compilate in fase di esecuzione, lo spazio del codice era importante, soprattutto quando i dischi contenevano solo 128 KiB e le schede perforate individuali solo 80B.

Esistevano diverse soluzioni: la tokenizzazione era estremamente comune in BASIC; le parole chiave della singola lingua sono state ridotte a una parola di 1 o 2 byte nella parte superiore 128 o nello spazio dei caratteri di controllo. La tokenizzazione porta anche alla compilazione di bytecode (come in Inform e Z-Machine).

La compilazione e il collegamento di più file oggetto sono stati utilizzati anche per aggirare le limitazioni di spazio. Una sezione di codice Pascal da 100 KiB potrebbe essere compilata in soli 5 KiB; collegando più file compilati, è possibile creare applicazioni di grandi dimensioni senza avere accesso a unità di grande formato (ricordando che 10 MiB era sorprendentemente grande e acquistare una nuova auto costosa).

Linguaggi più concisi, tuttavia, ottennero più codice in un determinato blocco sia di disco che di ram, e quindi compilarono blocchi più grandi alla volta. Tenendo a mente: i "minicomputer" dei primi anni '70 potrebbero avere solo 64 KiB di ram (il Honeywell 800 aveva un'installazione base di 4 banchi ciascuno di 2048 parole di 8B ciascuno). APL e linguaggi simbolici simili si sono avvicinati a 1 B per istruzione più i suoi operandi, rispetto al 3B-10B molto più grande per istruzione più operandi. (È stato un incubo digitare su schede perforate, soprattutto perché i simboli erano essenzialmente un carattere sulla palla di tipo, e molti lanci di carte non avevano i simboli sui tasti ...)

Inoltre, tieni presente che le carte non possono essere cancellate ... e molti programmi sono stati inseriti nelle carte. Sebbene non sia individualmente costoso, più il codice potrebbe essere compresso sulla scheda, meno necessario e più grandi potrebbero essere i programmi o meno costosi. Questo è uno dei motivi per cui BASIC ha una concatenazione di più istruzioni per riga nella maggior parte dei gusti: è stato introdotto per risparmiare sulle schede perforate. (O almeno così dice il mio testo di programmazione Vax Basic.) Mentre non ho programmato per un lettore di schede, ho eseguito la perforazione della scheda per un Honeywell 800 in FORTRAN, BASIC, APL e un paio di altri linguaggi altamente simbolici.


La verbosità in molti casi aumenta la probabilità che errori tipografici vengano rilevati in fase di compilazione piuttosto che produrre semplicemente comportamenti errati.
supercat

-1

Come in tante altre cose, la risposta dipende dalla definizione concreta di "verbosità". Se la definizione è tale che la verbosità implica ridondanza, direi che è sempre negativo. Si noti che con una tale definizione il programma ciao mondo spesso citato Java non si qualificherebbe come "dettagliato", perché non contiene nulla che sia ridondante.


1
Le parentesi e i punti e virgola bilanciati sono ridondanti, in quanto in larga misura sono le dichiarazioni di tipo.
Marcin,

1
@Marcin: Sì, ma facilitano la scrittura di un parser / analizzatore per la lingua. Sono abbastanza convinto che tale sintassi esiste a vantaggio dell'implementatore della lingua, non del programmatore che usa la lingua.
ccoakley,

1
@Marcin - dipende interamente dalla lingua se le dichiarazioni di tipo sono o non sono necessarie. Alcuni sistemi di tipi semplicemente non sono decidibili, quindi .... per quanto riguarda parentesi e punti e virgola, beh, preferiresti una lingua con una grammatica non ambigua e un breve sguardo - altrimenti compilare anche piccoli programmi potrebbe richiedere ore e alla fine tu devi scegliere quale interpretazione del tuo programma preferisci.
Ingo,

1
@ingo Non sono a conoscenza di alcun linguaggio in cui tutte le variabili o funzioni debbano avere una dichiarazione di tipo a causa della complessità del sistema di tipi. In effetti, direi che le lingue con sistemi di tipo più potenti hanno maggiori probabilità di consentire l'omissione di tali dichiarazioni.
Marcin,

1
@Marcin, nessun motivo per arrabbiarsi. Hai detto che direi che le lingue con sistemi di tipi più potenti hanno maggiori probabilità di consentire l'omissione di tali dichiarazioni e ti ho dato un esempio, in cui un sistema di tipi più potente richiede più annotazioni di tipo. Se ritieni che ciò non contraddica la tua eliminazione, allora bene, così sia.
Ingo,

-1

I programmatori tendono ad apprezzare i linguaggi con potere espressivo in quanto consentono loro di codificare le cose semplici, che spesso devono essere fatte frequentemente, in piccoli pezzi di codice. I linguaggi dettagliati tendono a significare che molte, molte righe di codice devono essere usate per fare sempre la stessa cosa. Tuttavia, può esserci una sorta di prezzo da pagare con linguaggi espressivi in ​​quanto potrebbero non essere così veloci da eseguire come i linguaggi di alto livello più semplici. Se posso fare un esempio nel contrasto tra C e C ++. Il C ++ dà più potere espressivo agli scrittori di codice: possono incapsulare l'idea di oggetti del mondo reale nelle classi. I programmatori C possono ottenere le stesse cose ma hanno il potere espressivo del costrutto di classe per aiutarli - così spesso devono scrivere codice più lungo, più complicato (per capire). Ma quel codice potrebbe essere eseguito più velocemente (sebbene ciò dipenda fortemente dalla qualità del compilatore e così via) perché non usa il "late binding" di C ++ (cioè il refactoring del tempo di esecuzione) per eseguire il codice. C esegue semplicemente il codice compilato e collegato, C ++ deve prendere una decisione (in determinate circostanze) in fase di esecuzione su quali parti di codice eseguire.


Con questo "late binding" probabilmente intendi chiamate di funzione virtuale. Ma questo è solo un modo tra molti altri per ottenere il riutilizzo del codice. La digitazione dinamica è un altro, e probabilmente farebbe un esempio migliore per il tuo punto in quanto tende a venire con molto più overhead rispetto alle chiamate virtuali di C ++. Ma ci sono anche meccanismi che non influiscono affatto sulle prestazioni di runtime perché possono essere completamente risolti in fase di compilazione: nei moderni linguaggi orientati agli oggetti si hanno modelli / generici, nei polimorfismi parametrici dei linguaggi statici funzionali.
circa il

L'associazione tardiva è ciò che viene utilizzato per far funzionare le chiamate di funzione virtuale, quindi no non intendevo "chiamate virtuali", intendevo l'associazione tardiva. Le chiamate virtuali fanno parte della definizione della lingua, l'associazione tardiva è ciò che fa funzionare quella parte. E, sì, ovviamente ci sono altri esempi in altre lingue, stavo offrendo un esempio del potenziale di compromesso tra potenza espressiva e velocità, non raccomandando una lingua rispetto a un'altra.
Adrianmcmenamin

-1

Credo che ci sia una risposta alla domanda radicata in una questione più fondamentale e teorica della leggibilità e questa risposta è correlata alla teoria dell'informazione algoritmica fondata da Gregory Chaitin: http://en.wikipedia.org/wiki/Algorithmic_information_theory . Detto in poche parole, "il contenuto informativo di una stringa equivale alla lunghezza della rappresentazione autonoma più corta possibile di quella stringa", Ciò implica che il programma più breve (vale a dire in termini di lunghezza lessicografica) che risolva da vicino un dato problema corrisponde alla complessità intrinseca del problema a cui fornisce una soluzione e, quindi, dipende più dalla natura del problema e meno dalla rappresentazione del problema.

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.