Quali sono state le condizioni storiche che hanno portato la programmazione orientata agli oggetti a diventare un importante paradigma di programmazione?


14

Quali sono stati alcuni dei fattori economici (e altri storici) che hanno portato all'influenza dei linguaggi di programmazione orientati agli oggetti? So che Simula ha iniziato le cose, ma è stata l'adozione delle lingue OOP a causa delle sempre crescenti esigenze del business? O l'adozione era dovuta più alle nuove cose che si potevano fare con le lingue OOP?

Modifica Sono molto interessato al fatto che esistano alcuni fattori esterni alle lingue stesse che hanno permesso loro di prendere piede.


Ciò ha senso, ma immagino di essere più interessato alle circostanze esterne che si stavano verificando durante lo sviluppo. Potrebbe benissimo essere che i fattori esterni abbiano avuto un effetto limitato.

Ti garantisco che anche per una domanda relativa a fattori esterni, programmers.stackexchange è un luogo migliore. Ha un sacco di persone che lavorano attivamente nel settore e molti che hanno lavorato da quando il settore è decollato. Avrai molte più probabilità di trovare lì una persona che abbia un'ottima risposta alla tua domanda rispetto a qui.
Opt

2
Smalltalk non lo ha avviato. Simula ha creato i concetti di base dell'orientamento agli oggetti. Ciò che Smalltalk ha fatto è stato prendere quelle idee e trasformarle in un modello molto diverso e appropriarsi del nome. Ma vale la pena notare che nessun linguaggio che segue il modello Smalltalk di OO ha mai avuto molto successo nella creazione di programmi. (Ad eccezione di Objective-C, che è un caso speciale: Apple lo spinge giù per la gola di tutti dalla loro parte, ma nessuno al di fuori dell'ecosistema Apple lo usa.) Tutti i linguaggi OO di successo: C ++, Delphi, Java, C #, ecc., usa il modello Simula.
Mason Wheeler

1
I mattoncini giocattolo Lego potrebbero adattarsi come influenza esterna ...
Jamie F

1
@ Mason: non so cosa divide i modelli Simula e Smalltalk. Dove metteresti Ruby? LUA? Pitone? Javascript?
Kevin Cline

Risposte:


10

Risposta breve

Penso che sia stata la sfornata di progetti software prima dei giorni di OO. OO ha aiutato aggiungendo il concetto fondamentalmente critico: modellare il mondo reale .


Il primo linguaggio di programmazione orientato agli oggetti era Simula nel lontano 1967. Tuttavia, a quel tempo lo sviluppo del software era ancora nei laboratori e la maggior parte dei paradigmi era ancora più vicina al caso hardware .

In oltre un altro decennio di sviluppo di software per applicazioni aziendali, altre applicazioni commerciali sono cresciute e lo sviluppo del software in generale è aumentato negli anni '70. Le lingue che sopravvivono ancora oggi di quell'età (prima del 1980) erano C, Cobol, Fortran e altri simili. La maggior parte di queste lingue sono procedurali. Lisp esisteva anche da quel giorno - tuttavia, non sono sicuro che fosse un linguaggio di uso generale di primo piano per lo sviluppo commerciale. Il famoso termine modello Cascata fu coniato anche all'inizio degli anni '70.

Nella maggior parte degli ambienti commerciali, l'elemento più importante emerso nello sviluppo del software è stata la gestione dei progetti. C'era la disperata necessità di budget ristretti e almeno prevedibili e di gestione dei requisiti da congelare per garantire che il progetto raggiungesse il traguardo rispettabilmente. Durante questo periodo fu anche uno dei mitici manmonth del 1975.

Immagino che alla fine degli anni '70 le persone fossero esaurite, dato che i linguaggi procedurali non mantenevano tali promesse. E un nuovo paradigma orientato agli oggetti che esisteva da allora lo ha reso grande. Sebbene le persone potrebbero non essere d'accordo, penso che il C ++ che aiuti la familiarità e l'esperienza comprovata e di C, e la Promessa di orientamento agli oggetti (originariamente con il nome C con Classi) nel 1983 sia stata una pietra angolare per il successo della programmazione orientata agli oggetti.

Qualche riferimento per ulteriori prospettive: http://journal.thedacs.com/issue/43/88

Allora perché OO?

Penso a quei tempi (se si guarda al punto di vista del successo del progetto) - aveva senso che ciò che si capisce meglio sarebbe meglio gestibile. La metodologia orientata agli oggetti con una promessa "... tutto nella vita è un oggetto" sembrava più un buon senso prima ancora che si dimostrasse significativo. Il successo pratico di questo fattore è stato il concetto stesso di modellare sufficientemente il mondo reale e il problema attuale prima di saltare la pistola, cosa che penso sia qualcosa di fondamentalmente nuovo che OO ha offerto e che nessun altro paradigma ha offerto fino a quella data. E sicuramente dato che questo paradigma ti ha costretto a pensare un po ' prima di codificare più dei linguaggi procedurali, ha mostrato un successo visibile sui progetti software che hanno impiegato e da allora hanno preso piede!

EDIT
Aggiungerei anche che i linguaggi di programmazione si sono evoluti simultaneamente in parallelo a tali concetti fondamentali (paradigma OO, aspetto, macchine virtuali). Ogni nuovo concetto e pensiero nuovo sono emersi solo quando un nuovo linguaggio di programmazione nuovo lo ha dominato - mantenere solo la familiarità ma cambiare i fondamenti da nucleo! Allo stesso tempo, questi nuovi concetti e nuove lingue sono emerse solo a causa di nuovi problemi commerciali. Anni '80 - OO per software su larga scala, 1990 Java nell'era di Internet, PHP / ASP e molti altri per il web. Anche l'innovazione nei linguaggi di programmazione è stata guidata principalmente dalle esigenze discontinue del mercato.

In sintesi, all'inizio degli anni '80 era l'epoca in cui il software commerciale su larga scala decollava - mentre i progetti con linguaggi procedurali avevano i loro problemi, OO mostrava la luce migliore e rendeva i progetti più efficaci.


Quali sono stati i caratteri del turno e dove andare? Fine degli anni '70. Cosa capiscono gli sviluppatori faked che è ora di andare? Stanco delle procedure, sì, ma ci devono essere ben dousins ​​di alternative?
Indipendente dal

@Jonas - ok - ha modificato la risposta.
Dipan Mehta,

Per quanto riguarda il successo storico che stiamo valutando, possiamo sicuramente affermare che la familiarità gioca un ruolo. C (era il successore di B), C ++ era un C migliore anche se OO era presumibilmente un cambio di paradigma. Anche Java è stato un salto immediato dal C ++ (che era più simile al C ++ senza problemi di C ++. Memoria e portabilità). La maggior parte di questi linguaggi ha attraversato gli abissi acquisendo lo spazio esistente in modo più efficace anche se avevano qualcosa di più fondamentale in essi. Inoltre, perché ogni lingua acquisirà alcuni programmatori che già conoscono altri linguaggi di programmazione. MA questo potrebbe non essere sempre vero!
Dipan Mehta,

1
Vorrei anche aggiungere che i linguaggi di programmazione si sono evoluti simultaneamente in parallelo a tali concetti fondamentali (paradigma OO, aspetto, macchine virtuali). Ogni nuovo concetto e pensiero nuovo sono emersi solo quando un nuovo linguaggio di programmazione nuovo lo ha dominato - mantenere solo la familiarità ma cambiare i fondamenti dal nocciolo ! Allo stesso tempo, questi nuovi concetti e nuove lingue sono emerse solo a causa di nuovi problemi commerciali. Anni '80 - OO per software su larga scala, 1990 Java nell'era di Internet, PHP / ASP e molti altri per il web. Anche l'innovazione nei linguaggi di programmazione è stata guidata principalmente dalle esigenze discontinue del mercato.
Dipan Mehta,

1
"Modellare il mondo reale" sembra decisivo, ma nella maggior parte dei casi non succede. La Customerclasse non ha metodi come eatLunch, goToWorko sleep, se questo è ciò che i clienti fanno nel mondo reale . La Productclasse ha diversi metodi, sebbene la maggior parte dei prodotti non abbia esattamente alcun comportamento nel mondo reale . Pertanto, direi che il modello OO corrisponde (più o meno) solo in termini di proprietà, ma per nulla in termini di comportamento, con il mondo reale. Ma non hai bisogno di OO per avere un modello di dati corrispondente agli oggetti del mondo reale. I tipi di record sono tutto ciò che serve.
user281377

6

Penso che il motivo principale sia stato il successo di interfacce utente grafiche come X e Windows. Una GUI è composta da diversi oggetti che hanno un comportamento autonomo, qualcosa che OO è in grado di rappresentare da vicino.

D'altra parte, un'interfaccia utente di base di testo (che non tenta di assomigliare a una GUI) spesso segue semplicemente un modello di risposta al comando, che può essere facilmente implementato in un linguaggio procedurale. Regole aziendali e cose simili sono state implementate con linguaggi procedurali per decenni, senza troppi problemi, e ancora oggi molti programmi OO per applicazioni aziendali sono piuttosto procedurali; con oggetti stupidi che contengono i dati e oggetti apolidi che contengono le regole aziendali; il primo potrebbe essere un record in una lingua procedurale, il secondo potrebbe essere, beh, procedure.


4

Vedo OOP come un naturale passo evolutivo dal codice procedurale:

  1. Codice di procedura: dire alla macchina di fare A, quindi di fare B.
  2. OOP: impacchettare le istruzioni procedurali in blocchi molto riutilizzabili, definendo interfacce / input / output. (Attenzione: semplificazione.)

Sono sicuro che qualcuno con una visione più ampia entrerà in azione, ma sembra che questa sia stata una naturale progressione nel consentire semplicemente ai programmatori di produrre codice più velocemente: cioè consentire un maggiore riutilizzo del codice.

In questa prospettiva, il più grande fattore esterno era il costo ridotto della potenza del processore (rispetto al costo del lavoro dello sviluppatore per creare programmi tipici): il sovraccarico di elaborazione nell'uso delle classi OOP divenne meno preoccupante del risparmio di tempo dello sviluppatore. (Questo stesso compromesso tra spese della CPU e spese del programmatore ha influenzato molti altri aspetti della programmazione.)


2

All'inizio c'era una programmazione imperativa (se potessi chiamarla così). Semplici istruzioni che dicevano al mainframe cosa e come dovrebbe essere calcolato. Quei linguaggi di programmazione utilizzavano salti incondizionati e altre istruzioni "non strutturate", molte delle quali esotiche per gli standard odierni.

Quindi qualcuno ha inventato strutture per la programmazione. Il per, mentre, facciamo tempo e foreach che conosciamo oggi. È stata una grande innovazione poiché ora le applicazioni con un flusso relativamente complesso potevano essere scritte e comprese facilmente. Nacque così la programmazione strutturata.

Poi sono arrivate altre persone che hanno detto che dovevi ripetere molto codice qua e là ed è stato un incubo mantenere quindi un modo di riutilizzare il codice dovrebbe essere inventato. Le persone hanno escogitato procedure e funzioni per delimitare bit riutilizzabili di codice. Ciò ha anche dato vita all'incapsulamento e ai principi di responsabilità unica.

Quindi alcuni accademici hanno affermato che la funzionalità dovrebbe essere strettamente associata ai dati su cui sta lavorando. Quindi hanno aggiunto i concetti di eredità per il riutilizzo del codice e il polimorfismo per abbinare il modo logico in cui la classificazione ha funzionato nella vita reale. Così nacquero i linguaggi di programmazione di terza generazione e OOP.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.