Buono sconto 4% su Toner e Cartucce agli utenti AZpoint. SU Iomiricarico.it!!
|
Si ringrazia Claudio De Sio per la concessione del materiale pubblicato in questo articolo.
|
Programmazione ad oggetti utilizzando Java:
Incapsulamento ed Ereditarietà
Obiettivi:
Il Lettore al termine di questo capitolo dovrà essere in grado di
- Comprendere le ragioni della nascita della programmazione ad oggetti (unità 5.1).
- Saper elencare i paradigmi ed i concetti fondamentali della programmazione ad oggetti (unità 5.2).
- Saper definire ed utilizzare il concetto di astrazione (unità 5.2)
- Comprendere l’utilizzo e l’utilità dell’incapsulamento (unità 5.3, 5.4).
- Comprendere l’utilizzo e l’utilità del reference this (unità 5.4).
- Comprendere l’utilizzo e l’utilità dell’ereditarietà (generalizzazione e specializzazione)(unità 5.5, 5.6).
- Conoscere la filosofia di Java per quanto riguardo la semplicità di apprendimento (unità 5.3, 5.5).
- Conoscere le conseguenze dell’utilizzo contemporaneo di incapsulamento ed ereditarietà (unità 5.6).
Unità didattica 5.1)
- Breve storia della programmazione ad oggetti
Scrivere un programma, significa in qualche modo simulare su di un computer concetti e modelli fisici. Nei primi tempi, la programmazione era concepita come una serie di passi lineari. Invece di considerare lo scopo del programma nella sua interezza creandone un modello astratto, si cercava di arrivare alla soluzione del problema superando passaggi intermedi. Questo modello di programmazione orientato ai processi, con il passare del tempo, e, con il conseguente aumento delle dimensioni dei programmi, ha chiaramente mostrato i suoi difetti. Infatti, aumentando il numero delle variabili e delle iterazioni tra esse da gestire, un programmatore in difficoltà, aveva a disposizione strumenti come le variabili globali, ed il comando goto. In questo modo, agli inizi degli anni ottanta, per la programmazione procedurale fu coniato il termine dispregiativo "spaghetti code", dal momento che i programmi crescendo in dimensioni, davano sempre più l’idea di assomigliare ad una massa di pasta aggrovigliata.
La programmazione orientata agli oggetti nasce ufficialmente sin dagli anni sessanta con il linguaggio Simula-67. In realtà non si trattava di un linguaggio orientato agli oggetti "puro", ma con esso furono introdotti fondamentali concetti nella programmazione quali le classi e l’ereditarietà. Fu sviluppato da nel 1967 da Kristen Nygaard dell’università di Oslo e Ole Johan Dahl del Centro di Calcolo Norvegese, ed a dispetto dell’importanza storica, non si può parlare di un vero e proprio successo presso il grande pubblico. Nei primi anni ’70 nacque lo Smalltalk, sviluppato inizialmente da Alan Kay all’Università dello Utah, e successivamente, da Adele Goldberg e Daniel Ingalls allo Xerox Park, centro di ricerca di Palo Alto in California. Smalltalk si può considerare un linguaggio ad oggetti "puro", introdusse l’incapsulamento e la release Smalltalk-80 ebbe anche un discreto successo negli Stati Uniti. A lungo andare però, sebbene considerato da molti come ideale ambiente di programmazione, rimase confinato (come Simula) nei centri di ricerca universitari di tutto il mondo, considerato come oggetto di studio più che d’utilizzo. L’introduzione nel mondo della programmazione dei concetti di classe e di oggetto, che, di fatto, rendono i programmi più facilmente gestibili, non provocò quindi immediatamente una rivoluzione nell’informatica. Ciò fu dovuto al fatto che proprio agli inizi degli anni settanta, linguaggi come il C, ottenevano i migliori risultati implementativi, come ad esempio il sistema operativo Unix, tutt’oggi ancora utilizzatissimo. Negli anni ’80 però, ci si rese conto della limitatezza della programmazione strutturata, il che fu essenzialmente dovuto ad una progressiva evoluzione dell’ingegneria del software, che iniziava a realizzare i programmi con una filosofia incrementale. Linguaggi come il C, come abbiamo già detto, per apportare modifiche al software offrono strumenti come le variabili globali e il comando goto che si possono considerare ad alto rischio. Ecco che allora fu provvidenzialmente introdotta l’estensione del linguaggio C, realizzata da Bjarne Stroustrup, nota con il nome di C++. Questo nuovo linguaggio effettivamente ha rivoluzionato il mondo della programmazione. Essendo un’estensione del C, un qualsiasi programma scritto in C deve però poter essere compilato da un compilatore C++. Ciò, anche se ha favorito la migrazione in massa dei programmatori C verso il C++, si è rivelato anche il limite essenziale del C++. Infatti, si possono scrivere programmi che fanno uso sia della filosofia ad oggetti sia di quella procedurale, abbassando così le possibilità di buon funzionamento dei programmi stessi. Da qui l’idea di realizzare un nuovo linguaggio che doveva essere "veramente" orientato agli oggetti. Java, infatti, ci propone uno stile di programmazione che quasi ci "obbliga" a programmare correttamente ad oggetti. Inoltre, rispetto al C++, sono state eliminate tutti gli strumenti "ambigui" e "pericolosi", come ad esempio il famigerato comando goto, l’aritmetica dei puntatori, e, di fatto, per utilizzare una variabile globale, ci si deve proprio impegnare! Mentre il C++ ha il merito di aver fatto conoscere al grande pubblico la programmazione ad oggetti, Java ha il merito di averne fatto apprezzare l’utilizzo.
La programmazione orientata agli oggetti, è una scienza, o meglio, una filosofia adattabile alla programmazione. Essa si basa, su concetti esistenti nel mondo reale, con i quali abbiamo a che fare ogni giorno. È già stato fatto notare al lettore che gli esseri umani posseggono da sempre i concetti di classe e di oggetto. L’astrazione degli oggetti reali in classi, fa superare la complessità della realtà. In questo modo possiamo osservare oggetti completamente differenti, riconoscendo in loro caratteristiche e funzionalità che li accomunano, e quindi associarli ad una stessa classe. Per esempio, sebbene completamente diversi, un sassofono ed un pianoforte, appartengono entrambi alla classe degli strumenti musicali. La programmazione ad oggetti inoltre, utilizzando il concetto di incapsulamento, rende i programmi composti da classi che nascondono i dettagli di implementazione dietro ad interfacce pubbliche, le quali permettono la comunicazione tra gli oggetti stessi che fanno parte del sistema. È favorito il riuso di codice già scritto, anche grazie a concetti quali l’ereditarietà ed il polimorfismo, che saranno prossimamente presentati al lettore.
|