giovedì, marzo 09, 2006

Ingegneria del software: 17 marzo 2005

Object Orientation
Programmazione modulare:
Astrazione
Incapsulamente (e information hiding)

Esistono delle relazioni fra moduli:
Una relazione fra moduli é un vettore che unisce una coppia di moduli (prodotto cartesiano sull'insieme degli oggetti)
2 relazioni:
USES:
IS_COMPONENT_OF: l'opposto di USES (se A uses B, allora B is_component_of A)
Una classe é definita da un contratto: garantisce delle funzionalità che vengono racchiuse al suo
interno.

Approcci ai moduli:
Procedurale: raccolta di funzioni
Data Pool: dati comuni (raccolta di variabili globali)

Abstract Object: Vengono messe insieme le procedure ed i dati. Ad esempio: gestione dei files: il risultato della chiamata a funzioni varia a seconda dello stato dell'oggetto.
Abstract Data Type: Viene definito un modello raggruppando le parti comuni a delle istanze per garantire all'utente (programmatore)
Generic: Template parametrici rispetto al tipo di una loro parte (ad esempio: array)

OBJECT ORIENTATION:
Abstract Data Type: le classi
Nuove relazioni:
Ereditarietà (generalizzazione: un tipo deriva da un altro tipo e ne estende le funzionalità)
Aggregazione: (IS_PART_OF)
Nuovi concetti e principi:
Polimorfismo: una classe può "spacciarsi per un altro tipo". 2 tipi di polimorfismo: di ereditarietà: un oggeto di tipo mela può essere "spacciato" per un oggetto di tipo frutta; di interfaccia: rondine e aereo possono essere spacciati per "IFlingObject"
Dynamic Binding: In fase di esecuzione si sostituisce la corretta implementazione di un metodo per ogni oggetto.
Ad esempio: se un metodo viene ridefinito si deciderà se chiamare quello "nuovo" o quello della classe base a seconda del tipo di oggetto su cui lo si chiama.
Le classi:
Sono il "progetto di costruzione" di un oggetto
Possono essere un progetto "incompleto": (classi astratte) definiscono solo una parte di comportamento di un oggetto
Le classi implementano una o più interfacce: contratti delle classi
In UML il diagramma delle classi é la "vista statica"
Definita in 3-4 parti:
Nome della classe, attributi (campi), metodi ed eventualmente proprietà
A sinistra posso porre: + (publico), - (privato), # internal (protected): disponibile solo per la classe e le sue derivate
I metodi in corsivo sono quelli astratti. Se il nome della classe é in corsivo la classe é astratta.
Cercare di fare sempre privato il più possibile

Generalizzazione (ereditarietà):IS_LIKE_A, CAN_BE_A
E' possibile definire una parte di oggetto.
Classi derivate sono polimorfiche rispetto alle classi base (se quadrupede eredita da animale un
oggetto di tipo quadrupede é anche istanza di animale)
Permette riuso di codice (in generale le classi derivare dovrebbero estendere le funzionalità (e NON ridurle))
Generalizzazione può essere anche multipla (una classe può ereditare da più di una classe base). Problema di ereditarietà multipla: (una classe potrebbe derivare 2 volte da un'altra (che implementazione dei metodi devo usare?)
In UML la generalizzazione é rappresentata con una freccia con il triangolo bianco
Non riscrivo i metodi ereditati a meno che non ne vada a cambiare l'implementazione (override)

Relazioni tra classi in UML:
Una riga collega le due classi.
Una label sulla riga spiega l'interazione.
All'attacco della riga viene specificata la molteplicità: può essere un numero o un range (1..* indica 1 o più)
All'attacco della riga posso anche specificare il ruolo: ad esempio un'acquisto da persona a persona dovrà specificare quale dei 2 é nel ruolo di venditore e quale di acquirente.

Se c'é una freccia APERTA (a V) indica che la classe da dove parte la freccia deve conoscere l'altra, ma non per forza il viceversa. Sostanzialmente la presenza della riga di congiunzione indica che la classe ha un attributo del tipo dell'altra classe
Ovviamente si possono mettere più relazioni fra le stesse classi, o relazioni riflessive.
E' sempre bene stabilire la direzione quando possibile

Composizione
Vuole dire che un oggetto fa strettamente parte di un altro oggetto (ad esempio un motore di un aereo)
Gli oggetti "componenti" (motori) possono interagire verso l'esterno SOLO tramite l'oggetto composito
(aereo), si indica con una linea iniziata da un rombo (dalla parte dell'oggetto composito)

Per raggruppare più classi posso usare il package:

Dipendenza
E' una dipendeza non statica (non presuppone la conoscenza)... ???
E' una relazione che non viene rimappata su un attributo/prorpietà di classe
Poco usata
Si esprime con una freccia tratteggiata terminata da una freccia a V


Interfacce
Sono delle classi astratte senza implementazione di alcun metodo. Possono venire implementate (multiple) anche dai linguaggi che non prevedono ereditarietà multipla.

Nessun commento: