Prima di tutto, "OOP moderno" non è una deviazione da OOP di Alan Kay. Kay potrebbe aver coniato il termine stesso, ma "OOP" in stile Smalltalk è una deviazione significativa dall'effettiva programmazione di classe e oggetto come esisteva prima di Smalltalk. Il sistema originale OOP si chiamava Simula ed era un dialetto esteso di ALGOL i cui concetti OOP si sarebbero sentiti a proprio agio in linguaggi moderni come Delphi, Java o C #. Lo stile Smalltalk è l'aberrazione, ed è stato un fallimento ovunque sia stato provato. (Con la piccola eccezione di Objective-C, la cui popolarità è dovuta nella sua interezza a Apple che spinge giù la gola degli sviluppatori iOS, al di fuori dell'ecosistema Apple la sua quota di mercato è essenzialmente nulla.)
Per quanto riguarda la domanda, la ragione principale per cui molte persone criticano è semplice, "uva acerba" vecchio stile. Guardando l'articolo di Wikipedia collegato, i critici che nomina non sono oggettivi: uno è uno dei principali protagonisti di ML, l'altro è il protagonista di Erlang, entrambi linguaggi che hanno fallito nel "mercato delle idee" mentre OOP ha conquistato il mondo.
Luca Cardelli has claimed that OOP code is "intrinsically less efficient" than procedural code, that OOP can take longer to compile, and that OOP languages have "extremely poor modularity properties with respect to class extension and modification", and tend to be extremely complex.
Intrinsically less efficient
? Forse, ma è anche molto più potente. La principale inefficienza intrinseca deriva dal polimorfismo: il dispatch virtuale richiede più cicli di CPU e la cache è inefficiente, ma può ottenere alcune astrazioni incredibilmente utili in cambio di questo compromesso di progettazione. E dubito che chiunque cerchi di ottenere la stessa cosa in un linguaggio procedurale senza supporto linguistico possa farlo in un modo che risulti essere notevolmente più efficiente, quindi è una specie di lamentela stupida.
that OOP can take longer to compile
? Ha! Prova a dirlo a uno sviluppatore Delphi. Può letteralmente compilare il codice più velocemente di quanto il disco rigido possa offrire.
that OOP languages have "extremely poor modularity properties"
? Prova a dirlo a qualsiasi sviluppatore Delphi, Java o .NET che utilizzi il ricco ecosistema di codice modulare che è stato costruito nel corso degli anni su base giornaliera. Questo semplicemente non è vero.
tend to be extremely complex
? Bene sicuro; stanno risolvendo problemi complessi. Non puoi far scomparire la complessità essenziale; puoi aggiungere l'astrazione e spazzarla sotto il tappeto, ma tornerà a morderti a un certo punto, garantito.
Bottom line: se OOP non funzionasse bene, non funzionerebbe bene. E quindi nessuno lo userebbe perché semplicemente non funziona. Ma un semplice sguardo alla realtà del mondo della programmazione mette la menzogna su quel concetto.