Compatto o leggibile?

Dopo l’interessante dibattito scaturito dall’articolo "Ciao ciao while", ho deciso di dedicare un altro quesito riguardo alle variopinte tecniche di programmazione.
La maggioranza dei linguaggi di programmazione supporta l’uso dell’operatore condizionale (? : ) che permette di "sostituire" le funzionalità dei costrutti if-else quando questi presentano una sola riga di codice.

Inoltre, è possibile annidare più operatori condizionali uno dentro l’atro, in modo da ottenere un codice estremamante compatto: una sola riga invece di molte di più. Vediamo un esempio:

1
2
3
4
5
6
7
8
9
10
11
12
// istruzione if-else
if(item == 4)
  alert('The item is 4');
else
  if(item == 5)
    alert('The item is 5');
  else
    alert('the item isn\'t 4 and 5');
 
// operatore condizionale
(item == 4) ? alert('The item is 4') : (item == 5) ? alert('The item is 5') :
alert('The item isn\'t 4 and 5');

Come possiamo vedere, le righe di codice che si risparmiano sono parecchie, ma la leggibilità ne risente: il lettore (utente o programmatore) deve sicuramente impiegare più tempo per comprendere il risultato.

Secondo voi è consigliabile utilizzare l’operatore condizionale in sostituzione di if-else oppure è meglio continuare ad utilizzare quest’utlimo (che è molto probabilmente l’istruzione più diffusa ed utilizzata nelle applicazioni) anche se la riga di codice è una e solo una?

14 commenti:

  1. Alka, 28 Novembre 2007

    Sinceramente non ho mai preso confidenza con l’operatore condizionale… quindi io vado a favore dell’ if ;)

     
  2. Cristiano, 29 Novembre 2007

    Ne avevamo accennato qualcosa nel precedente post.

    La leggibilità al primo posto: quando si scrive il codice è necessario pensare che, prima o poi, per un qualunque frangente, esso potrebbe essere letto o utilizzato da terzi, quindi è anche necessario “codificare” nella cosidetta modalità “fool proof” ;-

    In seconda istanza, scrivere il codice è un pò come scrivere in un qualunque linguaggio naturale: si può scrivere bene o male, ma la qualità e la leggibilità dello scritto comportano di concerto il giudizio più o meno positivo da parte del lettore.

    Infine, dal punto di vista della traduzione in codice eseguibile non cambia nulla: il codice prodotto è perfettamente lo stesso, anche in virtù del fatto che l’operatore (?:) non è altro che una macro (infatti il compilatore o l’interprete in fase di analisi lo trattano esattamente come se fosse un if … then … else)

     
  3. nunziofiore, 29 Novembre 2007

    Non son completamente d’accordo sul discorso leggibilità o meno. Io penso che il codice debba girare, è vero, e andare in mani diverse dal creatore prima o poi, ma non andrà mai in mano a quel popolo di conoscitori del linguaggio con cui è stato scritto.
    Estremizzo e spiego il mio ragionamento con una metafora che calza: quando in Matrix, Neo chiede all’operatore come fa a capire cio’ che sta scorrendo sul monitor, l’operatore dice che lui non vede scritte che corrono su un monitor, ma una donna bionda, un uomo etc etc…
    Anche noi, con la nostra professionalità, leggiamo if then else, laddove c’è un ?…. è il decompilatore che abbiamo incluso nei nostri ragionamenti in fase di comprensione del linguaggio. Come quando si impara una lingua straniera, non chiediamo a un testo tecnico di essere scritto con il vocabolario di parole che abbiamo a disposizione ma impariamo a inserire sempre nuovi costruitti nelle nostre capacità espressive…
    Ammazza che discorsone che ho fatto :) Un saluto a Riccardo e alle sue iniziative,
    Nunzio

     
  4. GoGo, 29 Novembre 2007

    Ciao a tutti, non sono un esperto di operatori condizionali (sinceramente vado sempre per if o simili), ma volevo porre a Cristiano una domanda: da quanto ho capito da quello che hai scritto, in termini di “peso” non cambia nulla tra l’uso di if piuttosto che dell’ operatore condizionale, anche se le righe di codice sono molte di meno?

    Allora MooTools, che è denominato “the compact framework” e che ha un codice altamente compatto (avrebbe potuto avere 200 righe righe in più) ma anche piuttosto leggibile, non ricava benefici da questo tipo di scrittura?

     
  5. nunziofiore, 29 Novembre 2007

    devo smetterla di inviare prima di rileggere…

     
  6. Cristiano, 29 Novembre 2007

    @ nunziofiore: se vuoi essere un programmatore a 360°, devi scrivere in modo leggibile per tutti, novizi e/o professionisti, indipendentemente dal target. Se poi vuoi sviluppare codice per una ristretta cerchia di appassionati, allora scrivi come vuoi, con lo stile che vuoi, usando lo “slang” preferito, ma condiviso dai suoi estimatori. E una tua scelta. :-)
    @ GoGo: “compatto” non significa più “veloce”. Esistono tecniche di programmazione che, a discapito di un quantitaivo di righe di codice maggiore, producono codice più veloce e più snello, ma questo è un altro discorso. In Javascript, produrre codice più compatto favorisce la velocità di caricamento della pagina, il suo traferimento in memoria ed il peso complessivo della pagina in toto. Spero di averti risposto… ;-)

     
  7. nunziofiore, 29 Novembre 2007

    Capisco cio che intendi Cristiano. Pero’, proprio per agganciarmi a Mootools. Io produco tool che aiutano programmatori senza nessuna competenza java a creare ambienti desktop web … recentemente mi sono accostato a Mootools, e sono riuscito ad evolvere in breve tempo da una programmazione javascript di medio livello a una di piu alto proprio perche mi sono messo a studiare direttamente il codice funzione per funzione imparando parecchio da istruzioni compatte e pulite nella loro complessita che da altro.
    Aggiungo, per concludere, che in realta condivido ciò che scrivi Cristiano, soprattutto per quanto riguarda lo scopo per cui scrivi il codice in un modo o in un altro pensando a chi andrà in mano… la mia è più che altro voglia di filosofeggiare un po con qualcuno che mastica la mia lingua dato che appunto, a forza di parlare con esclusivamente novizi ho perso un po di costrutti e proprieta’ di linguaggio…

     
  8. GoGo, 29 Novembre 2007

    @Cristiano: appunto, era proprio quello che intedevo :) Devo dire però che concordo anche con Nunzio.

    Mi spiego subito: a parte l’operatore condizionale con cui ho già detto che non ho molta esperienza, leggendo e rileggendo codici “avanzati” come quelli dei framework o plug-in, posso dire che si impara a prendere confidenza con nuovi costrutti che prima venivano magari evitati o semplicimente poco utilizzati.

    Questo è un po un distaccamento dalla programmazione più tradizionale, e ha il contro di perdere magari l’abitudine di utilizzare tecniche standard che sono alla base dei linguaggi, poichè ogni libreria o script usa costrutti/compattezza/tecniche differenti.

    Questo è il grande dibattito tradizione vs novità che ne scaturisce… ;)

     
  9. RD, 29 Novembre 2007

    @tutti: questa discussione sta diventando interessante, sono contento delle vostre opinioni.
    @GoGo: ovviamente MooTools e qualsiasi altro script Javascript trae benefici dalla compattezza del codice, perchè, come ha detto giustamente Cristiano, favorisce la velocità di caricamento della pagina diminuendo il carico sulla memoria.

    Attenzione però: MooTools non usa semplicemente gli operatori condizionali per compattare il codice, ma "the compact framework" utilizza molti altri costrutti scritti (o riscritti da quelli nativi) appositamente per gravare il meno possibile sulla memoria.

    @Cristiano: concordo con il fatto che la leggibilità del codice debba essere sempre in prima linea.  Dici che non esistono programmatori che  leggono più agilmente un codice compattato?

    Infine sono d’accordo con Nunzio quando incita allo scambio di idee e devo dire che la metafora è piacevole :)
    A proposito, che tipo di tool desktop sviluppi?

     
  10. Cristiano, 30 Novembre 2007

    @ nunziofiore: ;-)
    @ GoGo: :-) Sappi però che la macro ? esisteva gà ai tempi del C di Kerninghan e Ritchie (1978 circa) e convalidata poi nell’ANSI C del 1990 (che, orrore, contiene anche il GOTO) …

    @ Riccardo: il mio giudizio è minato dal fatto che pubblico sul mio blog in via del tutto didattica, per renderlo il più comprensibile possibile ai miei lettori (che, sembra incredibile, per il 95% non sono programmatori), e che mi “diletto” a scrivere codice almeno in una 15ina tra linguaggi, dialetti, scripting e quant’altro.
    Comunque codice compatto non vuol dire illeggibile. ;-)

     
  11. RD, 30 Novembre 2007

    @Cristiano: concordo, infatti se un programmatore è abituato ad un certo stile di scrittura del codice, sicuramente si troverà meglio a seguire/leggere questo suo metodo, compatto o non che sia ;)

     
  12. Panoramix, 1 Dicembre 2007

    Salve a tutti gli opinionisti di questa discussione. Mi permetto di andare contro il parere di Cristiano quando afferma che la scrittura di codice è come quella un libro: a mio parere invece, l’eleganza e la qualità del codice si misura, a parità di risultato, con la quantità che si scrive.

    Un buon codice, sopratutto nei linguaggi che “rubano” lavoro ai browser, non è sctitto con l’occorrenza di essere leggibile come un libro, ma deve essere il più compatto e sintetico possibile in modo da ridurre il carico di lavoro.

     
  13. Cristiano, 1 Dicembre 2007

    @ Panoramix: non mi sembra di aver parlato di “libri”. ;-) A ogni buon conto, pur rispettando il tuo punto di vista, ti invito a rileggere attentamente tutti i commenti perchè forse ti è sfuggito qualche passaggio: infatti è stato ribadito, e non solo da me, ma anche dagli altri partecipanti, che lo stile di scrittura del codice è dipendente dal contesto.
    Se didattico, sarà impostato sulla chiarezza e leggibilità, se improntato alla “produzione” dovrà essere ottimizzato, ma non necessariamente compatto.

    Concludo ricordando a tutti che, anche per javascript, esistono i compressori, per cui, la dimensione del prodotto finale può essere ridotta qualunque sia lo stile di codifica.

    Un saluto :-)

     
  14. Panoramix, 3 Dicembre 2007

    Cristiano sono d’accordo che il codice per essere valutato deve essere dipendente dal contesto, ma la mia opinione riguardava il codice primario, ovvero quello da produrre, da eseguire; non quello didattico. Era inoltre indipendente dai compressori, che, a dire la verità, non mi aggradano molto.

     

Scrivi un commento: