Dal tuo blog, sembra che tu abbia familiarità con la programmazione sia imperativa che funzionale e che tu abbia familiarità con i concetti di base coinvolti nella programmazione orientata agli oggetti, ma non hai mai avuto davvero "clic" su ciò che lo rende utile. Cercherò di spiegare in termini di tale conoscenza e spero che ti sia utile.
Alla base, OOP è un modo per utilizzare il paradigma imperativo per gestire meglio alti livelli di complessità creando strutture di dati "intelligenti" che modellano il dominio problematico. In un programma (standard procedurale non orientato agli oggetti), hai due cose fondamentali: variabili e codice che sa cosa farne. Il codice prende l'input dall'utente e varie altre fonti, lo memorizza in variabili, lo opera e produce dati di output che vanno all'utente o in varie altre posizioni.
La programmazione orientata agli oggetti è un modo per semplificare il programma prendendo quel modello di base e ripetendolo su scala ridotta. Proprio come un programma è una grande raccolta di dati con codice che sa cosa farne, ogni oggetto è un piccolo pezzo di dati associato a codice che sa cosa farne.
Suddividendo il dominio problematico in parti più piccole e assicurando che quanti più dati possibili siano associati direttamente al codice che sa cosa farne, si rende molto più facile ragionare sul processo nel suo insieme e anche sul sottotitolo problemi che compongono il processo.
Raggruppando i dati in classi di oggetti, è possibile centralizzare il codice relativo a tali dati, semplificando la ricerca e il debug del codice rilevante. E incapsulando i dati dietro gli identificatori di accesso e accedendoli solo attraverso metodi (o proprietà, se la tua lingua li supporta), riduci notevolmente il potenziale di corruzione dei dati o la violazione degli invarianti.
E utilizzando l'ereditarietà e il polimorfismo, è possibile riutilizzare le classi preesistenti, personalizzandole in base alle proprie esigenze specifiche, senza dover modificare gli originali o riscrivere tutto da zero. (Il che è una cosa che non dovresti mai fare , se puoi evitarlo.) Fai solo attenzione a capire il tuo oggetto base o potresti finire con canguri assassini .
Per me, questi sono i principi fondamentali della programmazione orientata agli oggetti: gestione della complessità, centralizzazione del codice e migliore modellizzazione del dominio dei problemi attraverso la creazione di classi di oggetti, eredità e polimorfismo e maggiore sicurezza senza sacrificare il potere o il controllo attraverso l'uso dell'incapsulamento e proprietà. Spero che questo ti aiuti a capire perché così tanti programmatori lo trovano utile.
EDIT: in risposta alla domanda di Joel nei commenti,
Puoi spiegare cosa contiene un "programma orientato agli oggetti" (oltre a queste fantasiose definizioni che hai delineato) che è fondamentalmente diverso da un programma imperativo? Come "fai rotolare la palla?"
Un piccolo disclaimer qui. Il mio modello di "un programma orientato agli oggetti" è fondamentalmente il modello Delphi, che è molto simile al modello C # /. NET da quando sono stati creati da ex membri del team Delphi. Quello che sto dicendo qui potrebbe non essere applicabile, o non applicare altrettanto, in altre lingue OO.
Un programma orientato agli oggetti è uno in cui tutta la logica è strutturata attorno agli oggetti. Naturalmente questo deve essere avviato da qualche parte. Il tipico programma Delphi contiene un codice di inizializzazione che crea un oggetto singleton chiamato Application
. All'inizio del programma, chiama Application.Initialize
, quindi una chiamata Application.CreateForm
per ogni modulo che si desidera caricare in memoria dall'inizio, e quindi Application.Run,
visualizza il modulo principale sullo schermo e avvia il ciclo di input / evento che costituisce il nucleo di qualsiasi programmi per computer interattivi.
L'applicazione e i moduli eseguono il polling per gli eventi in arrivo dal sistema operativo e li traducono in chiamate di metodo sull'oggetto. Una cosa molto comune è l'uso di gestori di eventi o "delegati" in .NET-speak. Un oggetto ha un metodo che dice "fai X e Y, ma controlla anche se questo particolare gestore di eventi è assegnato e chiamalo se lo è". Un gestore di eventi è un puntatore a metodo - una chiusura molto semplice che contiene un riferimento al metodo e un riferimento all'istanza dell'oggetto - utilizzato per estendere il comportamento degli oggetti. Ad esempio, se ho un oggetto pulsante nel mio modulo, personalizzo il suo comportamento collegando un gestore eventi OnClick, che fa sì che altri oggetti eseguano un metodo quando si fa clic sul pulsante.
Quindi, in un programma orientato agli oggetti, la maggior parte del lavoro viene eseguita definendo oggetti con determinate responsabilità e collegandoli insieme, tramite puntatori di metodo o mediante un oggetto che chiama direttamente un metodo definito nell'interfaccia pubblica di un altro oggetto. (E ora siamo tornati all'incapsulamento.) Questa è un'idea a cui non avevo idea di tornare prima di prendere lezioni di OOP al college.