Академический Документы
Профессиональный Документы
Культура Документы
di programmazione
ad oggetti
Introduzione
Programmi semplici e non orientati agli oggetti possono constare di una
lunga lista di istruzioni (statements). Programmi pi complessi
raggruppano spesso piccoli blocchi di istruzioni in funzioni o subroutines, ciascuna delle quali realizza un obiettivo particolare. Per
programmi cos strutturati piuttosto comune che qualche dato sia
globale e cio accessibile e modificabile da qualsiasi sezione del
programma. Con l'aumento della dimensione dei programmi, permettere
ad ogni funzione di modificare qualsiasi dato rende inevitabile la
propagazione di numerosi errori (bugs).
Larchitettura Software
Larchitettura software di un programma informatico linsieme di dati
strutturali necessari per ragionare su di esso: tali dati comprendono gli
elementi del software, le relazioni che intercorrono tra di essi e le
propriet degli uni e delle altre. Per definizione, larchitettura software
linsieme di regole pratiche, criteri e schemi di progettazione che
regolano:
la suddivisione del problema e del sistema informatico che si deve
costruire per risolverlo in moduli discreti;
le tecniche per creare interfacce fra tali moduli;
le tecniche per gestire la struttura generale ed il flusso del programma;
oggetto, una per ogni controparte del mondo reale con cui il programma ha a che fare. Per esempio ci potrebbe essere un oggetto calciatore
per ciascun calciatore reale della serie A e ciascuno di essi sarebbe simile agli altri dal punto di vista dei metodi disponibili per manipolare
o leggere i suoi dati, i quali sarebbero per diversi per ogni specifico
atleta (nome, et, ruolo, ).
Si pu immaginare che gli oggetti siano una serie di dati impacchettati in
una serie di funzioni progettate per far s il loro utilizzo sia al contempo
semplice ed appropriato.
Un oggetto pu inoltre essere in grado di mettere a disposizione semplici metodi standardizzati per eseguire determinate operazioni sui
suoi dati e ci senza rendere accessibile al resto del programma il
modo in cui tali operazioni vengono realizzate.
Oggetti
Un oggetto un entit che pu eseguire, o sulla quale si pu eseguire,
uninsieme di attivit ad essa correlate: tali attivit definiscono
il suo comportamento. Gli oggetti sono le entit fondamentali che
vengono utilizzate in un sistema orientato agli oggetti al momento
dellesecuzione del programma (runtime): essi interagiscono tra di loro
scambiandosi informazioni e ci anche senza essere a conoscenza di
codice o dati relativi.
Gli oggetti sono caratterizzati da due propriet:
1. identit: le caratteristiche di un oggetto che permettono di
distinguerlo da altri;
2.
Classi
Una classe la rappresentazione generale di una certa tipologia di oggetti.
In OOP, una classe un costrutto usato come stampo (progetto, prototipo), che definisce le variabili e i metodi comuni a tutti gli oggetti
di una certa specie, utilizzato per ottenere, al momento di esecuzione
del programma, delle realizzazioni specifiche della classe stessa (istanze
della classe, oggetti della classe o semplicemente oggetti).
Una classe definisce dei membri costitutivi che consentono a tali istanze
di avere uno stato (attributi) ed un comportamento (metodi).
Come le sue istanze, di cui una generalizzazione, una classe consta
di un nome, di una serie di attributi e di una serie di metodi.
Nel mondo reale si incontrano spesso parecchi elementi
dello stesso genere. Possono esistere, per esempio, migliaia di motociclette dello stesso tipo ciascuna delle quali, nel linguaggio OOP,
unistanza della classe motocicletta. Una classe pu essere rappresentata schematicamente come segue:
Teacher
- age: int
- name : string
+ Teacher (): void
+ DoTeach (object): boolean
<<property>>
+ Name () : string
+ Age () : int
Ci che rende un progetto rigido, fragile ed immobile linterdipendenza dei moduli al suo interno.
La rigidit dipende dal fatto che un singolo cambiamento in modulo
di un software, i cui moduli siano fortemente dipendenti tra di loro,
provoca una cascata di cambiamenti in moduli dipendenti.
Un programma fragile se un singolo e semplice cambiamento provoca linsorgere di problemi in aree che non sembrerebbero correlate
a quella in cui si realizzato il cambiamento stesso. Nellovviare a
questi problemi se ne provocano dei nuovi di modo che la manutenzione del software diventa praticamente impossibile.
Un progetto immobile quando i suoi moduli, che si vogliano eventualmente riutilizzare in un altro progetto, dipendono strettamente da
altri, che non sono richiesti, di modo che risulta pi conveniente ri-
prevedibile e non riutilizzabile. Le classi quindi devono essere costruite in modo tale da non cambiare mai e le eventuali nuove richieste, cui deve andare incontro un programma, devono essere soddisfatte non modificando il codice vecchio, gi funzionante, ma aggiungendone del nuovo.
Il principio dellinversione della dipendenza: le classi di livello gerarchico superiore, che hanno caratteristiche pi astratte e generali, non
devono dipendere da quelle di livello inferiore, con carattere pi concreto e specifico, ma deve essere il contrario: ci per impedire che
una modifica a livello particolare si rifletta a livello generale.
Per identificare correttamente una classe necessario riconoscere ed
elencare fino al livello pi elementare tutte le funzioni (operazioni)
che il sistema informatico dovr essere in grado di eseguire.
Car
aggregazione:
Pond
Carburetor
Duck
// Composition
class Car
{
private:
Carburetor* carb;
public:
Car() : carb(new Carburetor()) { }
virtual ~Car() { delete carb; }
};
// Aggregation
class Pond
{
private:
std::vector<Duck*> ducks;
};
Laggregazione differisce dalla composizione in quanto non implica
il possesso. Nella composizione se loggetto possessore viene distrutto quelli posseduti subiscono la stessa sorte.
Per esempio una universit possiede diversi dipartimenti (chimi-ca,
fisica, ) e ogni dipartimento ha un certo numero di professori. Se
luniversit chiude, i dipartimenti smettono di esistere ma i professori continuano la loro esistenza. Quindi ununiversit pu essere
Department
Professor
Classe A
Classe B
Classe A
Classe B
A meno che non sia diversamente specificato, lassociazione bidirezionale, anche se pu essere limitata ad una sola direzione (in UML
ci viene rappresentato con una linea continua e, rispettivamente, con
una freccia che punta in direzione della classe che viene utilizzata.
Per i principianti il concetto di associazione pu generare confusione,
dovuta non solo a questo concetto, ma anche ai due concetti di
aggregazione e composizione.
Academy
- academySecretary : Secretary
Secretary
- name : string
<<property>>
+ academySecretary () : Secretary
Course
- name : string
- academySecretary : Secretary
<<property>>
+ academySecretary () : Secretary
Secretary
- name : string
Nel caso che non esista interdipendenza tra la durata di vita di diverse
classi, la relazione sar di tipo aggregazione piuttosto che di tipo
composizione.
Se se si desidera, pertanto, che due classi siano legate da una
relazione di composizione, il modo migliore per ottenere ci consiste
nel definire luna allinterno dellaltra: in questo modo la classe
esterna pu realizzare le sue funzionalit ed il ciclo di vita della classe
interna legato a quello della classe esterna.
In sintesi, si pu affermare che l'aggregazione un tipo particolare di
associazione e che la composizione un tipo particolare di aggregazione.
Astrazione e generalizzazione
Lastrazione consiste nel mettere laccento sulle caratteristiche essenziali tralasciando i dettagli specifici e le precisazioni.
Limportanza dellastrazione, essenziale nello sviluppo software,
consiste nel fatto che essa consente di omettere i dettagli irrilevanti e
di utilizzare nomi per gli oggetti di riferimento.
Essa mette laccento su ci che un oggetto o fa, piuttosto di come
rappresentato o di come funziona e questo approccio fondamentale
per controllare la complessit di grandi programmi.
Mentre lastrazione diminuisce la complessit eliminando i dettagli
irrilevanti, la generalizzazione ottiene lo stesso risultato rimpiazzando una serie di entit che realizzano funzioni simili con un unico co-
strutto informatico.
La generalizzazione amplia unapplicazione in modo che possa comprendere un insieme pi esteso di oggetti dello stesso tipo o di tipo
diverso.
I linguaggi di programmazione realizzano la generalizzazione
tramite variabili, parametrizzazione, tipi generici e polimorfismo.
Si accentuano le somiglianze tra gli oggetti e ci aiuta a tenere sotto
controllo la complessit, raccogliendo entit individuali in gruppi e
fornendo unentit rappresentativa che si pu usare per specificare
ogni componente individuale di un gruppo.
Lastrazione e la generalizzazione sono spesso usate di concerto.
Le entit astratte vengono generalizate tramite parametrizzazione per
aumentarne lutilit.
Classi astratte
Le classi astratte, dichiarate con la parola chiave abstract, non possono essere istanziate.
Possono essere utilizzate solamente come superclassi per altre classi
che estendono la classe astratta.
La classe astratta un concetto la cui realizzazione si completa nel
momento in cui esso viene realizzato da una sottoclasse.
Inoltre una classe pu ereditare solo da una classe astratta (pu per
realizzare diverse interfacce), deve sovrascrivere tutti i suoi metodi
e le sue propriet astratti e pu sovrascrivere i suoi metodi e le sue
propriet virtuali.
Le classi astratte sono lideale nella realizzazione di strutture di base.
Interfacce
Ogni classe realizza uninterfaccia fornendo una struttura (dati e
stato) ed un codice che specifica il funzionamento dei metodi.
C una differenza tra la definizione di uninterfaccia e la sua implementazione. Nella maggior parte dei linguaggi, questa differenza non
netta in quanto la dichiarazione di una classe definisce uninterfaccia
e contemporaneamente la realizza.
Tuttavia, taluni linguaggi presentano caratteristiche che aiutano a
separare la definizione di uninterfaccia dalla sua realizzazione.
Per esempio una classe astratta pu definire uninterfaccia senza implementarla. I linguaggi che supportano leredit tra classi consentono ad una classe di ereditare uninterfaccia da una classe da cui siano derivate.
metodi stessi.
Un televisore ha una serie di attributi (le dimensioni, lo schermo al
plasma o a cristalli liquidi etc.) che tutti insieme ne costituiscono la
struttura. Una classe la descrizione completa di un televisore, che
comprende sia i suoi attributi (struttura), che i bottoni
(interfaccia).
In sintesi, linterfaccia definisce la struttura isolandone la realizzazione,
concetto molto utile qualora sia necessario che limplementazione
(realizzazione) sia intercambiabile.
Oltre a ci, uninterfaccia molto utile nel caso che limplementazione cambi frequentemente.
Uninterfaccia pu essere impiegata per definire un modello generico
e una o pi classi astratte che definiscano le realizzazioni parziali del-
Interfacce
la definizione di uninterfaccia inizia con la parola
chiave inteUface che ne caratterizza il tipo (interfaccia);
non hanno implementazione ma devono essere implementate;
possono avere solo la dichiarazione, implicitamente
pubblica ed astratta, dei metodi e dati, implicitamente
pubblici e statici;
possono ereditare pi interfacce;
possono essere utili quando limplementazione varia;
rendono le implementazioni intercambiabili;
aumentano la sicurezza mantenendo nascosta limplementazione.
Classi astratte
sono dichiarate per mezzo della parola chiave abstract
che le caratterizza come classi;
i metodi delle classi astratte possono essere implementati e devono essere estesi;
i metodi non possono avere implementazione solo se
sono dichiarati astratti;
possono implementare pi di uninterfaccia ma ereditare da una sola classe;
devono sovrascrivere tutti i metodi astratti e possono
sovrascrivere quelli virtuali;
possono essere utili nella realizzazione di un modello;
possono essere impiegate per fornire un comportamento per default per una classe base;
rappresentano un modo ideale per creare gerarchie di
eredit pianificate ed inoltre sono utilizzabili come termini ultimi nelle gerarchie di classi.
Ereditariet
il processo grazie al quale un oggetto acquista le propriet di un altro oggetto, il che alla base della classificazione gerarchica.
Senza limpiego delle gerarchie, ogni oggetto richiederebbe una dichiarazione esplicita di tutte le sue propriet. Grazie allereditariet,
invece, sufficiente definire solo le caratteristiche delloggetto che lo
rendono unico allinterno della sua classe.
La classe derivata o sottoclasse pu ereditare tutti i suoi attributi generali
dalle classi gerarchicamente superiori da cui deriva.
La creazione di una classe nuova per estensione di una classe gi esistente viene definita ereditariet.
Exception
IOException
sono generalizzate in Exception, ma che differisca da essa per le caratteristiche che sono specializzate in SecurityExceptions.
In altri termini, Exception generalizza le caratteristiche comuni a IOException ed a SecurityException, mentre IOException e SecurityException specializzano le proprie caratteristiche ed i propri comportamenti.
In OOP, la relazione di specializzazione implementata tramite il
principio di ereditariet e questo il modo pi diffuso, pi naturale e
pi largamente accettato di realizzare questa relazione.
Polimorfismo
Polimorfis o un termine generico che significa
a molte forme.
i esattam
mente in OOP
{
return new Complex(c1.Real+ c2.Real, c1.Imaginary +
c2.Imaginary);
}
Nellesempio di cui sopra stata estesa limplementazione delloperatore + nella classe Complex . Questa classe possiede un metodo
sovrascritto denominato ToString, che sovrascrive limplementazione per default del metodo standard ToString per supportare la
corretta conversione in stringa di un numero complesso.
Complex num1 = new Complex(5, 7);
Complex num2 = new Complex(3, 8);
// Somma due numeri complessi utilizzando loperatore +
sovraccaricato
Complex sum = num1 + num2;