Nella pagina 839 della seconda edizione, Steve McConnell sta discutendo su tutti i modi in cui i programmatori possono "conquistare la complessità" nei grandi programmi. I suoi consigli culminano con questa affermazione:
"La programmazione orientata agli oggetti fornisce un livello di astrazione che si applica a algoritmi e dati allo stesso tempo , una sorta di astrazione che la sola decomposizione funzionale non ha fornito."
Accoppiato con la sua conclusione che "ridurre la complessità è probabilmente la chiave più importante per essere un programmatore efficace" (stessa pagina), questa sembra quasi una sfida per la programmazione funzionale.
Il dibattito tra FP e OO è spesso inquadrato dai proponenti di FP attorno alle questioni di complessità che derivano specificamente dalle sfide della concorrenza o della parallelizzazione. Ma la concorrenza non è certamente l'unico tipo di complessità che i programmatori di software devono conquistare. Forse concentrarsi sulla riduzione di un tipo di complessità aumenta notevolmente in altre dimensioni, così che per molti casi il guadagno non vale il costo.
Se spostassimo i termini del confronto tra FP e OO da problemi particolari come la concorrenza o la riusabilità alla gestione della complessità globale, come sarebbe il dibattito?
Modifica
Il contrasto che volevo sottolineare è che OO sembra incapsulare e astratto lontano dalla complessità di dati e algoritmi, mentre la programmazione funzionale sembra incoraggiare a lasciare i dettagli di implementazione delle strutture di dati più "esposti" in tutto il programma.
Vedi, per esempio, Stuart Halloway (un sostenitore di Clojure FP) qui che afferma che "l'eccessiva specificazione dei tipi di dati" è "conseguenza negativa dello stile OOM idiomatico" e favorisce la concettualizzazione di un AddressBook come semplice vettore o mappa invece di un oggetto OO più ricco con ulteriori (non-vector & ; non-maplike) proprietà e metodi. (Inoltre, i sostenitori di OO e Domain-Driven Design possono dire che esporre un AddressBook come un vettore o una mappa sovraesposta i dati incapsulati a metodi che sono irrilevanti o addirittura pericolosi dal punto di vista del dominio).