Il concetto di programmazione ad oggetti è un concetto molto esteso e fino a questo momento abbiamo toccato solo alcuni aspetti abbastanza superficiali tant’è che, magari, un programmatore devoto alla programmazione procedurale potrebbe non averne ancora apprezzato i vantaggi. Diciamo che elemento essenziale della programmazione ad oggetti è l’astrazione ovvero il processo per il quale descriviamo in maniera essenziale una certa cosa. Abbiamo usato l’astrazione nel definire la classe "Numeri" con gli attributi "numeroX" e "numeroY" e abbiamo usato l’astrazione anche ogni qual volta abbiamo scritto uno dei metodi della classe "OperazioniSuNumeri" ovvero i metodi "somma" e "sottrazione" nei quali abbiamo espresso un concetto ben definito. Diciamo che l’astrazione è la base di tutto e se combinata con altri elementi fondamentali della programmazioni ad oggetti quali l’incapsulamento, ereditarietà e il polimorfismo si arriva all’essenza finale della programamzione ad oggetti ovvero la possibilità del riuso del codice per lo sviluppo di altro software.
Ogni software house oggi esistente sfrutta proprio la proprietà del riuso del codice per velocizzare il processo produttivo e per l’implementazione delle nuove funzionalità. Quindi la base del codice sarà la prima versione e quelle successive saranno solo ed esclusivamente una estensione delle funzionalità previste inizialmente e, se il codice è stato scritto con intelligenza, sarà possibile aggiungere funzionalità senza andare, in nessun modo, a modificare i pezzi di codice scritti precedentemente. Non a caso, negli ultimi anni, molti linguaggi web come per esempio il PHP (nato come linguaggio di programmazione puramente precedurale) è diventato, con l’introduzione della versione 5, un vero e proprio linguaggio orientato agli oggetti per poter sfruttare i benefici sopra esposti. I tre concetti di incapsulamento, ereditarietà e polimorfismo, verranno trattati in maniera approfondita durante la trattazione della guida.
Incapsulamento
A questo punto occupiamoci del concetto di incapsulamento. Grazie a questo concetto il codice di una classe risulta più robusto (ovvero meno esposto ad errori derivanti dall’errato utilizzo dell’applicazione da parte dell’utente) e conferisce una migliore manutenzione del codice in caso di modifiche o di migliorie da introdurre in un secondo momento. L’idea di base dell’incapsulamento è quella di controllare l’accesso degli attributi di una classe utilizzando dei metodi per la gestione degli stessi.
Dunque la prima cosa è quella di rendere gli attributi della classi non modificabili direttamente dall’esterno e creare dei metodi con modificatore public affinchè possano essere utilizzati per l’accesso ai dati. Dal punto di vista dell’implementazione, dunque, l’utente chiamerà semplicemente il metodo per l’inserimento di un valore in un attributo di una classe senza preoccuparsi di cosa faccia questo metodo all’atto pratico. In definitiva si da la disponibilità all’utente di utilizzare delle interfacce pubbliche per l’accesso ai dati. Sarà compito del programmatore scrivere un codice robusto per queste interfacce pubbliche implementando opportuni controlli relativi all’input inserito dall’utente. Nel caso in cui l’interfaccia pubblica necessiti di alcune migliorie o controlli aggiuntivi sarà sufficiente quindi modificare il codice relativo all’interfaccia senza modificare niente dal punto di vista dell’utente. L’utente userà la stessa interfaccia senza essere al corrente che sono state apportate modifiche.
Questa logica di programmazione è applicata nella vita reale per molte operazioni che noi effettuaiamo ogni giorno. A tutti sarà capitato di mettere in moto un automobile e a questo punto vi chiedo: dal punto di vista del guidatore che differenza fa tra mettere in moto una macchina con motore a benzina ed un’altra a motore Diesel? Assolutamente nessuna. La nostra interfaccia pubblica è la fessura nella quale noi giriamo la chiave, poi sarà compito dell’interfaccia pubblica gestire l’avvio della macchina a seconda che si tratti di un motore a benzina o Diesel.
Nella prossima lezione vedremo in che modo, dal punto di vista del codice, è possibile implementare il concetto dell’incapsulamento.