lezione 2 informatica

Transcript

lezione 2 informatica
PROGRAMMAZIONE A OGGETTI (OOP) Lezione 2 prj Mesa (Prof. Ing N. Muto)
Introduzione e concetti di base
Per poter seguire con profitto questa lezione è necessario che chi legge abbia già acquisito i concetti di programmazione imperativa strutturata, che conosca quindi i concetti di variabile, funzione, parametri formali, parametri reali, compilatore, codice, memoria centrale, CPU.
La programmazione inizialmente sviluppata nel mondo informatico è consistita in una serie
di istruzioni, strutturata secondo i 3 costrutti fondamentali della programmazione imperativa: sequenza (l'ordine delle istruzioni), la selezione (quale sequenza eseguire in base al valore logico-matematico di una espressione usata come condizione) e l'iterazione (quante volte ripetere
una sequenza in base al valore logico di una condizione, sempre espressa come espressione).
Questa organizzazione è andata bene finché i progetti software da realizzare sono rimasti
di ridotte dimensioni. Appena si è passati allo sviluppo di applicazioni complesse, che andavano ben oltre qualche migliaio di righe di codice si è avvertita come irrinunciabile l'esigenza del
classico “divide et impera” e questo per una serie di motivi:
gestione della complessità
gestione dei tempi di sviluppo (time to market)
gestione della manutenzione
Come prima risposta a queste esigenze si è cercato di organizzare il codice già sviluppato in
“pezzi” riutilizzabili, capaci di rispettare uno standard di comunicazione prefissato fra tutti gli
sviluppatori del progetto complesso. Questi “pezzi” di codice, denominati sottoprogrammi,
funzioni o procedure a seconda dei linguaggi e delle caratteristiche relative a come avveniva il
passaggio dei dati su cui lavorare (parametri), sono stati poi raggruppati in raccolte,
denominate librerie. In questo modo sono nate librerie per scopi diversissimi: dalle librerie di
servizio come quelle di input/output tastiera/video a quelle grafiche o matematiche. In questo
modo il programmatore risparmia molto lavoro perché non deve reinventare codice già eistente
e può concentrarsi sulla implementazione di nuovi algoritmi.
Librerie
Funzioni
Dati in entrata
(opzionali)
Dati in uscita
(opzionali)
Codice
Elaborazione
(necessaria!)
Schema di un'applicazione complessa
SENZA OOP
Schema di una funzione o subroutine
classica
La precedente metodologia, pur consentendo un miglioramento della situazione nell'industria informatica mantiene molti limiti e problemi quando si vuole gestire in tempi rapidi lo sviluppo di applicazioni complesse o quando si tratta di manutenere il codice, per cui la ricerca
universitaria e le imprese sviluppatrici di software hanno cercato soluzioni alternative.
La soluzione attualmente dominante è chiamata OOP “Object Oriented Programming” ed
ha origine alla fine degli anni 60, ha avuto una fase di messa a punto fino agli anni 80 e fra gli
80 e 90 si è affermata definitivamente.
Essa parte dal concetto che NON è più il codice ad essere centrale nella programmazione
ma i dati. Cambia perciò il modo di pensare al software da sviluppare ed il codice diventa una
dipendenza delle necessità di elaborazione che hanno i dati stessi.
D'altra parte se pensiamo che il termine informatica deriva dalle parole ”information electronique ou automatique” ossia trattamento automatico o elettronico dell'informazione, mettere al
centro i dati, ossia le informazioni, è proprio l'essenza dell'informatica stessa.
Nel pensare a “oggetti” quindi il programmatore deve individuare le entità “informatiche”
coinvolte nel progetto, definire per ognuna di esse le strutture di memorizzazione necessarie
(variabili semplici e complesse) e sviluppare gli algoritmi necessari per le elaborazioni richieste.
Dopo queste fasi entra in gioco il concetto di INCAPSULAZIONE, uno dei tre fattori base
della programmazione a oggetti, (che vedremo nella seconda lezione), vale a dire che sia le
strutture di memorizzazione (variabili semplici e complesse) che il codice che realizza gli algoritmi (tecnicamente diciamo “implementa” gli algoritmi), vengono raggruppati in un unico oggetto contenitore che prende il nome tecnico di “classe”.
La “classe” può essere vista quindi come una “ricetta” che descrive sia gli ingredienti che le
azioni necessarie per arrivare a creare la “torta”. Proprio come una ricetta, che rimane astratta
finché non viene usata, la classe ha bisogno di essere trasformata in “torta” ossia di diventare
concreta nelle strutture del calcolatore, ha bisogno che le sue strutture dati occupino locazioni
di memoria RAM, che le istruzioni del suo codice vengano memorizzate in memoria centrale e
che siano eseguite poi dalla CPU. Questa azione è chiamata tecnicamente “istanza” della classe e genera ciò che esiste realmente nel calcolatore, ossia l'oggetto.
Un altro modo di vedere la classe è quello che parte dall'analogia con un chip elettronico:
una classe è l'analogo software di un chip: ha degli ingressi, delle uscite e svolge delle azioni:
possiamo usarla nel nostro software come un componente, anche senza conoscere minimamente cosa contiene. Ciò che conta è sapere come “interfacciarlo”, ossia collegarlo con il resto
del codice.
Sempre allo scopo di comprendere appieno ciò che una classe è, possiamo ancora dire
che definire una classe è come creare un nuovo “tipo di dato”, che può essere molto complesso, ricco di funzionalità e quindi potente nel senso delle funzioni che può svolgere. Il tipo così
creato è originale, pensato dal programmatore appositamente per svolgere compiti specializzati
al meglio, potendo contare su proprio variabili, semplici e complesse e su codici che implementano algoritmi ottimizzati.
Riassumendo possiamo allora dire che la programmazione ad oggetti consiste nell'affrontare il problema informatico da risolvere con i seguenti passi:
1. individuare le entità di informazione: Classi;
2. definire quali sono le strutture dati che servono per ogni classe: Attributi;
3. scrivendo le istruzioni per le elaborazioni necessarie: Metodi.
Nella prossima lezione affronteremo le tre caratteristiche portanti della programmazione a
oggetti, per ora chiudiamo dicendo che esistono vari linguaggi di programmazione che possono
essere usati per la “Object Oriented Programming” e che sia pur con qualche differenza di termini sono abbastanza equivalenti. Occorre però ricordare che alcuni linguaggi sono stati pensati ad oggetti mentre altri lo sono diventati successivamente con una sorta di adattamento. In
particolare nascono ad oggetti il C++, Java, C# mentre lo è diventato il Visual Basic che fino
alla versione 4 (1995) non dava alcune possibilità di scrivere classi e che non ha supportato
tutte le caratteristiche di un vero linguaggio OOP fino alla versione Visual Basic.Net (2006)