Perché le operazioni con mappa concatenata in stile funzionale sono considerate difficili da leggere?

3

Nei commenti a una risposta di un'altra domanda , ho proposto il seguente codice Java come un modo migliore di scrivere un variante più procedurale della stessa operazione:

employeeService.getEmployee()
    .map(Employee::getId)
    .ifPresent‌​(System.out::println‌​); 

(dove getEmployee() restituisce un Optional<Employee> )

Una risposta a risposta a questo commento suggerisce che questo "riduce drasticamente la leggibilità del codice" e che il commentatore lo rifiuterà nella revisione del codice.

Non capisco questa posizione: per me il codice sembra leggibile, o anche più leggibile, rispetto al codice di stile procedurale alternativo che era destinato a sostituire. Eppure almeno due spettatori di quel commento credono che sia difficile da leggere. Perché? Cosa rende questo codice difficile da leggere (almeno per alcuni lettori)?

    
posta Jules 20.01.2018 - 18:25
fonte

4 risposte

10

Tutti parlano della leggibilità del codice come positivo, ma nessuno in realtà è d'accordo su cosa significhi. Il problema è la leggibilità dipende dalla persona che legge .

Il tuo codice usa un approccio particolare, che sta mappando su un valore Optional , al fine di eseguire qualche codice solo se è presente il valore opzionale. Questo approccio sarebbe molto familiare a chiunque provenga da Haskell, dove questo è un idioma comune. In Java questo idioma è meno comune anche perché Opzionale è solo una recente aggiunta al linguaggio, e ci sono già altri idiomi stabiliti per queste cose. Quindi, per molti sviluppatori Java, l'intenzione del codice non sarà immediatamente evidente, e quindi la leggibilità ne risentirà. Ma dipende davvero dal pubblico per il codice, e quali idiomi e convenzioni sono stabiliti per la base di codice in questione.

Personalmente trovo il tuo esempio meno leggibile di un convenzionale if perché rompe alcune convenzioni che mi aspetterei. Ad esempio, le operazioni di streaming sono funzionali e non hanno effetti collaterali.

    
risposta data 20.01.2018 - 19:09
fonte
3

Ciò danneggia la leggibilità perché richiede più "spazio di memoria" mentale per il programmatore. Per i programmi procedurali, ogni affermazione può essere considerata in relativo isolamento. Alcune operazioni funzionano su alcuni input, forse hanno alcuni effetti collaterali e forse cambiano alcuni stati. Con operazioni concatenate, la persona che legge il codice ha bisogno di accumulare mentalmente tutte le operazioni e gli effetti collaterali fino alla fine della dichiarazione, per evitare che qualcosa di intelligente venga posto alla fine che non esegua la serie di operazioni subito.

Ma quello è un reclamo relativamente minore.

Il problema più grande con questo modo di programmazione è che è un problema e un mezzo di debug poiché la maggior parte degli strumenti rende difficile vedere i passaggi intermedi dell'istruzione.

    
risposta data 20.01.2018 - 19:14
fonte
1

Ciò a cui ti riferisci è noto come stile "point-free". La sua leggibilità non è universalmente considerata negativa.

Vantaggi dello stile point-free:

  • Rende più leggibile la struttura del calcolo.
  • Meno nomi delle variabili = > meno possibilità di sbagliare.

Leggibilità dello stile point-free:

A seconda del caso:

La mia regola empirica per i principianti: se lo stile elimina una variabile temporanea che sarebbe stata chiamata senza senso [come "x", "tmp", "temp", "result"], allora meglio usare il point-free stile. Altrimenti come piace a te e ai tuoi colleghi.

Per me stesso: la versione più breve è solitamente più leggibile.

A seconda della persona:

Normalmente lo stile point-free richiede un po 'di tempo per abituarsi. Alcune persone [molte dal mondo della programmazione imperativa] non la amano. Ma ci si abitua molto rapidamente con la pratica.

    
risposta data 20.01.2018 - 21:26
fonte
1

Prendi anche in considerazione lo sfondo delle persone che eseguono le tue revisioni di codice. Se, ad esempio, sono esperti ingegneri del software che hanno lavorato con C / C ++ per la maggior parte della loro vita (diciamo 20-30 anni), qualsiasi cosa che non sia imperativa e che muti di stato potrebbe sembrare strana e non necessaria per loro come leggibilità dipende da ciò che la persona usata sta vedendo. Pensa a tutti quei casi in cui il codice degli spaghetti in vecchi progetti maturi ti sembra orribile ma è "perfetto" per i veterani. È facile diventare di parte.

Leggibilità imho. si tratta di tutto ma l'esperienza - il codice leggibile dovrebbe essere compreso intuitivamente senza troppi sforzi.

    
risposta data 20.01.2018 - 23:46
fonte

Leggi altre domande sui tag