Quando utilizzare l'approccio alla programmazione funzionale e quando no? (in Java)

5

supponiamo di avere un'attività per creare un Set di nomi di classi. Per rimuovere la duplicazione delle chiamate al metodo .getName() per ogni classe, ho usato org.apache.commons.collections.CollectionUtils e org.apache.commons.collections.Transformer come segue:

Snippet 1:

Set<String> myNames = new HashSet<String>();
CollectionUtils.collect(
        Arrays.<Class<?>>asList(My1.class, My2.class, My3.class, My4.class, My5.class),
        new Transformer() {
            public Object transform(Object o) {
                return ((Class<?>) o).getName();
            }
        }, myNames);

Un'alternativa sarebbe questo codice:

Snippet 2:

Collections.addAll(myNames, My1.class.getName(), My2.class.getName(), My3.class.getName(), My4.class.getName(), My5.class.getName());

Quindi, quando si utilizza l'approccio alla programmazione funzionale è sovraccarico e quando non lo è e perché?

Il mio utilizzo dell'approccio alla programmazione funzionale in snippet 1 non è un overhead e perché?

    
posta dhblah 03.10.2012 - 09:25
fonte

5 risposte

6

Come altri hanno notato, non si può davvero usare un approccio funzionale in Java, perché è troppo prolisso e semplicemente manca di molte funzionalità necessarie. Quindi il codice risultante apparirà di solito più complesso e brutto. A volte vale ancora la pena, perché l'alternativa includerebbe ancora più duplicazioni e / o altre brutture, a volte non lo è. È necessario decidere caso per caso. Prova diversi approcci e scegli quello che risulta nel codice più pulito e semplice. E non preoccuparti troppo delle etichette. :-) Scrivere codice in stile "funzionale" non è superiore di per sé rispetto a qualsiasi altro stile, solo se il tuo codice è effettivamente più breve, più pulito, più facile da mantenere ed estendere e / o più efficiente in modo significativo.

Questo ci porta ad un altro punto importante. Anche se sei riuscito a implementare un pezzo di codice in un modo "funzionale" in modo molto succinto, devi guardarlo dal punto di vista dei futuri manutentori. Un programmatore Java medio capirà il tuo pezzo di codice se è così diverso dagli idiomi Java tradizionali e ben noti? Molto probabilmente no, il che aumenta la probabilità che introducano bug durante lo sviluppo / manutenzione futuri. Il tuo codice deve avere vantaggi molto forti e dimostrabili per controbilanciare questo, e devi documentarlo bene.

    
risposta data 03.10.2012 - 10:50
fonte
5

Java non è stato progettato per la programmazione funzionale e quindi, mentre puoi usare uno stile di programmazione funzionale in Java (stato immutabile, ricorsione, composizione di funzioni, funzioni di alto livello, ...), ti mancheranno spesso certe caratteristiche che facilitano programmazione funzionale (costrutti sintattici ad-hoc, currying, operatore di composizione delle funzioni, ottimizzazione del tail-call, ...).

Pertanto, anche se uno stile funzionale in Java può rendere il tuo codice (a volte) più leggibile o (più spesso) più robusto, se vuoi davvero usarlo pesantemente è meglio usare un linguaggio che è stato progettato per questo. Per JVM è possibile utilizzare Scala o Clojure ( qui è un breve articolo, che tratta anche di Groovy). Altrimenti, puoi provare Haskell, Common Lisp, Scheme, F #, Ocaml e altri.

    
risposta data 03.10.2012 - 11:15
fonte
2

L'approccio funzionale di solito ti offre un codice più breve e dall'aspetto migliore. Ma occuparsi dell'immutabilità può comportare una penalizzazione delle prestazioni. Penso che il primo snippet assomigli a un sovraccarico perché la sintassi funzionale in Java è troppo prolissa.

    
risposta data 03.10.2012 - 10:14
fonte
1

Teoricamente, un approccio funzionale è più semplice, più versatile, più verificabile e più facile da capire a colpo d'occhio. Se ciò che si finisce non colpisce almeno uno di questi obiettivi, allora forse non è l'approccio migliore per le circostanze.

Si noti che il funzionale è, come accennato in precedenza, un po 'di portata per Java. Ma non per la JVM. Scala e Groovy sono un po ' più flessibile a tale riguardo e consente di esprimere concetti funzionali in modo molto più succinto. E se vuoi rendere tutto più funzionale, c'è sempre Clojure . Tutti questi mirano alla JVM e dovrebbero integrarsi abbastanza bene in un progetto Java esistente.

Se sei bloccato con un ambiente Java (JVM) ma sei stanco della lingua stessa, ti consiglio di provare Scala o Groovy. È un po 'come Java con una sintassi più moderna (o Jython se senti un pizzico di invidia pitone).

    
risposta data 03.10.2012 - 11:21
fonte
1

Imparare qualcosa sulla programmazione funzionale può migliorare il modo in cui scrivi software orientato agli oggetti. Ad esempio il valore degli oggetti immutabili, la mancanza di effetti collaterali e nuovi modi di vedere e apprezzare le astrazioni - favorendo i "verbi" rispetto ai "nomi". Ma come altri hanno notato, java non ha un linguaggio funzionale e potresti rendere difficile la vita ad altri programmatori che leggono il tuo codice quando usano paradigmi inaspettati.

Dai un'occhiata a ciò che gli autori di google guava hanno da dire sugli idiomi funzionali costruito nella loro biblioteca.

    
risposta data 03.10.2012 - 13:47
fonte

Leggi altre domande sui tag