FP per simulazione e modellazione

12

Sto per iniziare un progetto di simulazione / modellazione. So già che l'OOP è usato per questo tipo di progetti. Tuttavia, lo studio di Haskell mi ha fatto considerare l'utilizzo del paradigma FP per la modellazione di un sistema di componenti. Lasciatemi elaborare:

Diciamo che ho un componente di tipo A, caratterizzato da un insieme di dati (un parametro come temperatura o pressione, una PDE e alcune condizioni al contorno, ecc.) e un componente di tipo B, caratterizzato da un diverso insieme di dati (diversi o lo stesso parametro, diverse PDE e condizioni al contorno). Supponiamo anche che le funzioni / metodi che verranno applicati a ciascun componente siano gli stessi (ad esempio, un metodo di Galerkin). Lo stato mutabile dell'oggetto verrebbe utilizzato per i parametri non costanti.

Se dovessi utilizzare un approccio OOP, creerei due oggetti che incapsulerebbero i dati di ogni tipo, i metodi per risolvere la PDE (qui l'ereditarietà verrà utilizzata per il riutilizzo del codice) e la soluzione per la PDE.

D'altra parte, se dovessi utilizzare un approccio FP, ogni componente sarebbe suddiviso in parti di dati e le funzioni che agirebbero sui dati al fine di ottenere la soluzione per la PDE. Parametri non costanti sarebbero passati come funzioni di qualcos'altro (tempo per esempio) o espressi da un qualche tipo di mutabilità (emulazione di mutabilità, ecc.) Questo approccio mi sembra più semplice assumendo che le operazioni lineari sui dati sarebbero banali.

Per concludere, implementare l'approccio FP sarebbe più semplice e facile da gestire (aggiungere un diverso tipo di componente o un nuovo metodo per risolvere il pde) rispetto a quello OOP?

Vengo da uno sfondo C ++ / Fortran, inoltre non sono un programmatore professionista, quindi correggimi su tutto ciò che ho sbagliato.

    
posta heaptobesquare 02.10.2012 - 02:41
fonte

2 risposte

7

Buona domanda, ho pensato in modo simile. Storicamente, il paradigma OO nasce dalla necessità di simulazioni al computer - si veda la storia di Simula - e nonostante i primi linguaggi OO come < a href="http://en.wikipedia.org/wiki/Smalltalk"> Smalltalk prodotto da persone che sapevano cosa stavano facendo (ad es. Alan Kay), OO è ora discutibilmente sopraffatto e introduce troppa complessità accidentale .

In generale, i programmi in stile FP saranno più brevi, più facili da testare e più facili da modificare rispetto ai programmi OO. Come Rob Harrop ha messo nel suo discorso, È il futuro funzionale? , non puoi mai essere più semplice di funzioni e dati; i due compongono all'infinito, per costruire qualunque astrazione sia necessaria. Quindi, un modo per rispondere alla tua domanda (o lo sto semplicemente riaffermando?) È chiedere, qual è la funzione di livello più alto e i dati di input di livello più alto - > i dati di output sono simili? Quindi puoi iniziare a scomporre funzioni e tipi di dati "alfa" nel prossimo livello di astrazioni e ripetere se necessario.

Un'altra prospettiva (non proprio le risposte) sulla tua domanda è quella di guardare questo thread (disclaimer, l'ho iniziato) su StackOverflow, alcune delle risposte sono molto interessanti: link

La mia opinione a questo punto è, a meno che tu non stia modellando una situazione in cui ci siano davvero oggetti discreti che interagiscono solo in modi definiti (ad esempio un modello di una rete di computer) - e quindi mappali direttamente alle capacità di un pulito , message-passing-paradigm OO language - è più semplice andare su FP. Si noti che anche nella comunità di programmazione dei giochi, in cui le simulazioni sono molto diffuse e i requisiti di prestazione sono fondamentali, gli sviluppatori esperti si stanno allontanando dal paradigma OO e / o utilizzano più FP, ad es. guarda questa discussione HN o I commenti di John Carmack su FP

    
risposta data 02.10.2012 - 19:09
fonte
2

IMHO per quasi tutti i compiti di ragionevole complessità la domanda "è uno stile FP o OOP, la scelta migliore" non può essere risolta obiettivamente. In genere, in una situazione del genere la domanda non è "né FP né OOP", ma come combinare le parti migliori di entrambi i paradigmi per risolvere il problema.

Il problema che hai scartato sopra sembra essere molto matematico, e immagino che avrai bisogno di alcune operazioni con le matrici. OOP è molto utile per la modellazione di tipi di dati astratti e il calcolo matriciale può essere facilmente implementato come "oggetti matrice" con operazioni su matrici. L'implementazione di questo in un modo in cui tutte le operazioni della matrice fanno parte di una classe matrix ti aiuta a mantenere insieme le cose che appartengono insieme, mantenendo così una buona struttura generale.

D'altra parte, le PDE sono equazioni sulle funzioni e la soluzione potrebbe essere di nuovo funzione. Quindi utilizzare un approccio funzionale per quel tipo di "componenti" può sembrare naturale qui. Queste funzioni possono avere parametri di matrice, mostrando un esempio di come combinare OOP e FP. Un altro esempio potrebbe essere un'implementazione della classe matrice, che utilizza strumenti funzionali per mappare una determinata operazione su ogni elemento della matrice. Quindi, anche qui, non è "OOP contro FP" ma "OOP combinato con FP" che ti offre i migliori risultati.

    
risposta data 02.10.2012 - 13:10
fonte