Progettazione C ++: programmazione funzionale vs OOP

6

Domanda di progettazione

Recentemente, ho fatto sempre più FP in C ++, principalmente sotto forma di modelli di funzioni e lambda e sovraccarico pesante di un singolo nome di funzione. Mi piacciono molto le FP per alcune operazioni ben definite, ma ho anche notato che, come con OOP, si potrebbe facilmente cadere in anti-pattern di spaghetti code se non si presta attenzione (ad esempio, le dipendenze circolari, che è un problema più grande per codice basato sullo stato).

La mia domanda è, quando si pensa di aggiungere nuove funzionalità, come si decide tra l'uso di un paradigma FP o un paradigma OOP?

Sento che potrebbe avere a che fare con l'identificazione degli invarianti nel problema o nel design, ma non ne sono sicuro.

Ad esempio, senza un modello OOP / semplificazione del mondo reale, potrebbe non essere immediatamente ovvio cosa sia una classe Dog o Cat (quali sono i suoi stati? Quali sono i suoi metodi?). Otoh, da un POV FP, una funzione Eat () consente semplicemente ad un animale di trasformare il cibo in cacca ed energia. È più difficile immaginare che Eat () sia qualcos'altro (almeno per me).

Sto cercando più risposte C ++, ma questa domanda potrebbe applicarsi a qualsiasi sottomodulo in qualsiasi linguaggio in grado di gestire più paradigmi.

    
posta kfmfe04 24.12.2012 - 11:42
fonte

1 risposta

3

Penso che OOP si presti meglio quando hai dichiarato che non puoi distruggere e ricreare per un capriccio, o dove questo è un cattivo modello - per esempio, se consideri il rendering 3D, allora lo stato del il renderer non è banalmente distrutto e ricreato, e sarebbe un suicidio per la tua performance fare ogni fotogramma.

In C ++, è necessario aggiungere il fatto che non ha la garbage collection e molte tecniche FP dipendono da quella per prestazioni accettabili da remoto.

Otoh, from a FP POV, a Eat() function simply allows an Animal to turn Food into Poop and Energy. It's harder to imagine Eat() being anything else (for me, at least).

Questo è completamente equivalente alla variante OOP. Non c'è una differenza significativa tra

struct Animal { ... };
std::tuple<Poop, Energy> Eat(Animal*, Food);

e

class Animal {
public:
    std::tuple<Poop, Energy> Eat(Food);
};

Una variazione funzionale restituirebbe un nuovo animale che ha mangiato.

Tipicamente, divido ricorsivamente il mio programma per ottenere moduli / sottomoduli / classi / funzioni e funzioni membro, quindi spesso cerco di implementare queste funzioni o funzioni membro funzionalmente se possibile.

    
risposta data 24.12.2012 - 12:50
fonte

Leggi altre domande sui tag