Incapsulamento di parti mobili in OO vs Minimizzazione di parti mobili in FP

5

I am from background OO hanno appena iniziato a imparare il paradigma FP. È arrivato su quote di Michael Feathers - " OO rende il codice comprensibile incapsulando parti in movimento." FP rende il codice comprensibile minimizzando parti in movimento "

Che cosa intendeva esattamente con " moving parts "? La mia ipotesi è che spostando le parti intendeva " state mutation " perché FP promuove immutability e quindi riduce al minimo la mutazione dello stato mentre OO non scoraggia la mutazione di stato ma piuttosto incapsula i dati (incapsulando quindi lo stato mutante dell'oggetto)

Riesco a sentire come le pure funzioni di FP che promuovono l'immutabilità e nessun effetto collaterale possano portare a una migliore chiarezza del codice, rendendolo così più comprensibile e più dichiarativo rispetto all'imperativo. In qualche modo i benefici di natura simile non mi sono molto evidenti in OO quando lo stato di muting è incapsulato.

Ad esempio sotto l'oggetto adattatore si accede solo tramite interfacce pubbliche, ma sento ancora che il suo stato non è incapsulato perché ogni passo assume una transizione di stato nel passaggio precedente e quindi il metodo execute ha un carattere imperativo.

void Execute(IdataAdapter adapter) {
  adapter.ReadFromSource();
  adapter.ProcessData();
  adapter.WriteToDestination();
}

La definizione di OO intorno agli incapsulamenti parla principalmente di nascondere e diffondere i dati otteniamo come cambiare la struttura interna dei dati senza che si rompano i client, ecc. Ma mi piacerebbe capirlo meglio nel contesto della dichiarazione fatta sopra da Michael Feathers. La mia domanda è fondamentalmente - Incapsulando lo stato di muting in OO il codice diventa comprensibile allo stesso modo di FP minimizzando la mutazione di stato?

    
posta Rahul Agarwal 03.12.2018 - 15:25
fonte

2 risposte

5

Sì, entrambi sono approcci a un problema comune.

I programmi software hanno necessariamente un sacco di parti per andare da "Ho un sito web che condivide i video dei gatti!" (o qualsiasi altra cosa) a "Posso fare alcune operazioni su 1 e 0!". Perché fondamentalmente, ogni programma finisce come alcune operazioni di base su 1 e 0.

Se non fornisci alcuna astrazione, se non fornisci alcuna struttura ai tuoi programmi allora sono mazzi enormi e imperscrutabili di grande manipolazione. La programmazione orientata agli oggetti fornisce astrazione e struttura tramite oggetti. I programmi funzionali forniscono l'astrazione e la struttura tramite le funzioni. E, naturalmente, ognuno tende ad avere un po 'di altri, oltre a una programmazione imperativa per buona misura.

Ma la motivazione di base è la stessa.

    
risposta data 03.12.2018 - 16:44
fonte
1

Somehow benefits of similar nature is not very apparent to me in OO when mutating state is encapsulated.

Dopo aver fatto il commento sopra, mostri il codice in cui lo stato è non decisamente incapsulato. Ovviamente non si vedono i benefici in questo caso.

Nel codice OO ben scritto, scoprirai che i metodi delle classi sono più relativi alla narrazione di un oggetto quanto accaduto piuttosto che dirgli cosa fare, ( viewDidLoad , buttonTapped , serverRespondedWith , ecc.)

Nell'esempio che mostri, la tua funzione sta dicendo esplicitamente all'adattatore cosa fare, e, soprattutto, la classe che usa l'adattatore deve conoscere lo stato dell'adattatore per chiamare i metodi senza errori (anche se non controlla esplicitamente lo stato.)

    
risposta data 24.12.2018 - 18:40
fonte