Ho sempre avuto la tendenza a incolpare la popolarità di C sulla necessità di un linguaggio di assemblaggio universale. La combinazione di specificità a livello di macchina, standardizzazione ed estrema portabilità consentono a C di funzionare come quel linguaggio di assemblaggio universale di fatto , e per questo motivo sospetto che il suo ruolo continuerà indefinitamente.
Devo dire che sono sempre un po 'sorpreso quando OOP viene presentato nei corsi di programmazione come una sorta di "modello finale" che è l'unico endpoint possibile per una buona programmazione. Come molti altri aspetti della programmazione, il valore di OOP è un compromesso tra molti fattori concorrenti, tra cui il modo in cui il cervello umano ha organizzato le informazioni, in che modo i gruppi sociali supportano il software a lungo termine e, nel caso della programmazione orientata agli oggetti, alcuni aspetti piuttosto profondi di come funziona l'universo stesso.
E quell'ultimo punto vale la pena martellare un po '. Leggi di più se sei interessato a un'esplorazione a livello di fisica del perché esistono alcuni stili di programmazione, come funzionano insieme e dove il mondo potrebbe essere diretto in futuro mentre espandiamo ulteriormente su tali concetti ...
Un oggetto in fisica è tutto ciò che mantiene coerente la coerenza nel tempo. Ciò a sua volta consente a semplici creature come noi di cavarsela con la rappresentazione dell'oggetto usando solo un piccolo numero di bit, senza mettere in pericolo la nostra sopravvivenza troppo male. Ma in termini di fisica in generale, il numero di cose che devi fare esattamente per rendere quel tipo di semplificazione facile e comune è notevolmente grande. Come umani non pensiamo a tutto questo perché, francamente, non saremmo qui se non fosse vero.
Sembra troppo astratto? Non lo è davvero. Immagina, ad esempio, di provare a guidare la strada verso la casa del tuo amico se invece di automobili incontrassi campi di plasma che oscillano rapidamente e condensazioni momentanee di materia che si muovono con un'enorme gamma di velocità. Uno scenario del genere potrebbe tagliare piuttosto profondamente le opportunità di socializzazione, sì? Abbiamo bisogno di oggetti, ci sono oggetti, e l'esistenza di oggetti ci fornisce un livello enorme e fondamentale importanza della semplificazione del contesto che ci circonda.
Quindi riportiamo tutto al software. Che cosa hanno da dire gli oggetti nel mondo reale sugli oggetti in termini di programmazione?
Bene, per prima cosa significa che ciò che definisce un oggetto "buono" nel software dovrebbe davvero essere se il tipo di dati che stai gestendo supporta prontamente l'idea di persistenza riconoscibile nel tempo .
Con la definizione, le forme più semplici di OOP sono facili da riconoscere. Sono quelli che coprono un po 'usando solo i dati che sono già "allegati" o definiti da un oggetto reale, veramente fisico come una persona, una casa o un'auto. Ancora oggi, questa è ancora troppo spesso l' unica definizione di oggetti che la gente ottiene nei corsi di software. È un peccato, perché anche programmi banali orientati agli oggetti hanno bisogno di una definizione più ampia di quella.
La seconda e molto più interessante categoria di oggetti consiste in quelli che chiamerò eventi del mondo reale immortalati . Per "immortalato" intendo cose che almeno brevemente esistono come entità ben definite o raccolte nel mondo reale, ma che poi si disperdono e cessano di esistere come raccolte fisicamente significative. Un simposio è un ottimo esempio: il simposio esiste per un breve periodo come una raccolta decentemente ben definita di luoghi e persone. Ma purtroppo, anche le migliori conferenze devono finire e le singole parti che le hanno costituite passano ad altre attività.
Ma utilizzando computer e reti, possiamo far sembrare un simposio così transitorio come un oggetto a lungo termine catturandone e conservandone una memoria come oggetto software. Molte delle cose che facciamo con computer e database equivalgono a questo tipo di immortalizzazione di eventi transitori, in cui in effetti cerchiamo di arricchire il nostro universo reale catturandolo ed estendendolo in modi che non possono esistere fisicamente. Ad esempio, hai visto un vero Pandora ultimamente? Tali acquisizioni ed estensioni di pezzi del mondo reale aiutano ad arricchire ed estendere le nostre vite, economie e scelte in modi straordinari. Questo per me è il cuore della programmazione orientata agli oggetti, il luogo in cui ha avuto e continua ad avere gli impatti più notevoli.
Un'ultima categoria di OOP è costituita da oggetti che non hanno una stretta connessione con eventi esterni, ma sono invece l' infrastrutturanecessario per supportare la nostra continua estensione della realtà usando oggetti immortalati dal mondo reale. È qui che puoi scendere fino al (semi) metallo del computer, creando pezzi di realtà persistente che come gli elementi chimici del mondo reale possono essere combinati rapidamente e in modi interessanti per costruire nuovi mondi interni. Il mobile computing ha contribuito a promuovere la crescita di questo tipo di approccio altamente ricombinatorio, che ancora una volta in molti modi imita le caratteristiche ricombinatorie del mondo fisico. È anche difficile: quella che può sembrare una buona scelta potrebbe rivelarsi nel tempo inaspettatamente cattiva, di solito perché finisce per bloccare la diversità e l'espansione invece di supportarla.
Quest'ultima categoria indica anche i rischi dell'utilizzo di un solo modello per la programmazione, poiché, proprio come nel mondo reale, anche i mondi programmati hanno bisogno di processi che noncorrisponde bene ad oggetti relativamente immutabili. La Terra è piena di oggetti, ma il sole è pieno di flussi di energia altamente dinamici che alla fine sono necessari per "guidare" gli oggetti e le attività sulla terra a energia più bassa. Allo stesso modo, nella creazione di mondi informatici ci sono casi in cui è necessario gestire flussi e trasformazioni e contesti in rapida evoluzione che, sebbene non molto simili agli oggetti in sé, sono comunque assolutamente critici per consentire gli oggetti più semplici e più rispettosi dell'uomo utilizzati a livelli più alti . Non è un caso che gran parte della programmazione fatta a livello di kernel non sia evidentemente simile ad un oggetto, o che tende a fare molto affidamento su linguaggi come C che sono più orientati all'elaborazione. Questi sono i domini più profondi che completano l'affascinante diversità che vediamo più in alto nei mondi generati dal computer.
L'altra area in cui OOP può andare storto si sta concentrando troppo sui vecchi concetti di oggetti.
Gli oggetti nel mondo reale, e in particolare gli oggetti viventi , hanno un livello assolutamente sorprendente di capacità di interagire con i loro ambienti in modi complessi e sottili. Widget componibili che si guardano l'un l'altro, eseguono alcuni controlli di compatibilità e sanità mentale e forse addirittura escogitano alcuni nuovi modi di interagire avvicinandosi molto al concetto biologico di oggetti del mondo reale rispetto ai semplici quadri e ai semplici schemi ereditari che tendiamo concentrarsi (di solito per necessità!) a livello di codice. Questa è una delle aree di crescita degli oggetti nel mondo cibernetico, più approcci "simili agli agenti" in cui la reattività all'ambiente è la norma anche all'interno della programmazione stessa.
E tanto per la mia "critica" di OOP! Tuttavia, spero di aver sottolineato il motivo per cui creare un mondo cibernetico più ricco significa abbracciare la diversità degli stili di programmazione, piuttosto che supporre che "solo uno" sia tutto ciò che serve. La mia sensazione è che le cose davvero interessanti debbano ancora venire, non importa quanto banale di ciò che facciamo ora sia!