Paradigma orientato agli oggetti
Il paradigma orientato agli oggetti (OO) ha preso forma dal concetto iniziale di un nuovo approccio di programmazione, mentre l'interesse per i metodi di progettazione e analisi è venuto molto più tardi. Il paradigma di progettazione e analisi OO è il risultato logico dell'ampia adozione dei linguaggi di programmazione OO.
Il primo linguaggio orientato agli oggetti è stato Simula (Simulation of real systems) che è stato sviluppato nel 1960 dai ricercatori del Norwegian Computing Center.
Nel 1970, Alan Kay e il suo gruppo di ricerca presso Xerox PARC ha creato un personal computer denominato Dynabook e il primo puro linguaggio di programmazione orientato agli oggetti (OOPL) - Smalltalk, per la programmazione del Dynabook.
Negli anni '80 Grady Boochha pubblicato un documento intitolato Object Oriented Design che presentava principalmente un progetto per il linguaggio di programmazione, Ada. Nelle edizioni successive, ha esteso le sue idee a un metodo di progettazione orientato agli oggetti completo.
Negli anni '90 Coad ha incorporato idee comportamentali in metodi orientati agli oggetti.
Le altre innovazioni significative sono state Object Modeling Techniques (OMT) di James Rum Baugh e Object-Oriented Software Engineering (OOSE) di Ivar Jacobson.
Introduzione al paradigma OO
Il paradigma OO è una metodologia significativa per lo sviluppo di qualsiasi software. La maggior parte degli stili o modelli di architettura come pipe e filtri, repository di dati e basati su componenti possono essere implementati utilizzando questo paradigma.
Concetti e terminologie di base dei sistemi orientati agli oggetti -
Oggetto
Un oggetto è un elemento del mondo reale in un ambiente orientato agli oggetti che può avere un'esistenza fisica o concettuale. Ogni oggetto ha -
Identità che lo distingue dagli altri oggetti del sistema.
Stato che determina le proprietà caratteristiche di un oggetto così come i valori delle proprietà che l'oggetto possiede.
Comportamento che rappresenta le attività visibili esternamente eseguite da un oggetto in termini di cambiamenti nel suo stato.
Gli oggetti possono essere modellati in base alle esigenze dell'applicazione. Un oggetto può avere un'esistenza fisica, come un cliente, un'auto, ecc .; o un'esistenza concettuale intangibile, come un progetto, un processo, ecc.
Classe
Una classe rappresenta una raccolta di oggetti con le stesse proprietà caratteristiche che mostrano un comportamento comune. Fornisce il progetto o la descrizione degli oggetti che possono essere creati da esso. La creazione di un oggetto come membro di una classe è chiamata istanziazione. Quindi, un oggetto è un fileinstance di una classe.
I componenti di una classe sono:
Un insieme di attributi per gli oggetti che devono essere istanziati dalla classe. Generalmente, diversi oggetti di una classe hanno qualche differenza nei valori degli attributi. Gli attributi sono spesso indicati come dati di classe.
Un insieme di operazioni che ritraggono il comportamento degli oggetti della classe. Le operazioni vengono anche chiamate funzioni o metodi.
Example
Consideriamo una classe semplice, Circle, che rappresenta il cerchio della figura geometrica in uno spazio bidimensionale. Gli attributi di questa classe possono essere identificati come segue:
- x – coord, per denotare la coordinata x del centro
- y – coord, per denotare la coordinata y del centro
- a, per indicare il raggio del cerchio
Alcune delle sue operazioni possono essere definite come segue:
- findArea (), un metodo per calcolare l'area
- findCircumference (), un metodo per calcolare la circonferenza
- scale (), un metodo per aumentare o diminuire il raggio
Incapsulamento
L'incapsulamento è il processo di associazione di attributi e metodi all'interno di una classe. Attraverso l'incapsulamento, i dettagli interni di una classe possono essere nascosti dall'esterno. Permette di accedere agli elementi della classe dall'esterno solo attraverso l'interfaccia fornita dalla classe.
Polimorfismo
Il polimorfismo è originariamente una parola greca che significa la capacità di assumere più forme. Nel paradigma orientato agli oggetti, il polimorfismo implica l'utilizzo di operazioni in modi diversi, a seconda delle istanze su cui stanno operando. Il polimorfismo consente a oggetti con diverse strutture interne di avere un'interfaccia esterna comune. Il polimorfismo è particolarmente efficace durante l'implementazione dell'ereditarietà.
Example
Consideriamo due classi, Circle e Square, ciascuna con un metodo findArea (). Sebbene il nome e lo scopo dei metodi nelle classi siano gli stessi, l'implementazione interna, ovvero la procedura di calcolo di un'area, è diversa per ciascuna classe. Quando un oggetto della classe Circle invoca il suo metodo findArea (), l'operazione trova l'area del cerchio senza alcun conflitto con il metodo findArea () della classe Square.
Relationships
Per descrivere un sistema, devono essere fornite sia le specifiche dinamiche (comportamentali) che quelle statiche (logiche) di un sistema. La specifica dinamica descrive le relazioni tra gli oggetti, ad esempio il passaggio di messaggi. E la specifica statica descrive le relazioni tra le classi, ad esempio aggregazione, associazione ed ereditarietà.
Passaggio del messaggio
Qualsiasi applicazione richiede una serie di oggetti che interagiscono in modo armonioso. Gli oggetti in un sistema possono comunicare tra loro utilizzando il passaggio di messaggi. Supponiamo che un sistema abbia due oggetti: obj1 e obj2. L'oggetto obj1 invia un messaggio all'oggetto obj2, se obj1 vuole che obj2 esegua uno dei suoi metodi.
Composizione o aggregazione
L'aggregazione o composizione è una relazione tra classi mediante la quale una classe può essere composta da qualsiasi combinazione di oggetti di altre classi. Consente di posizionare gli oggetti direttamente all'interno del corpo di altre classi. L'aggregazione è indicata come una relazione "parte-di" o "ha-una", con la capacità di navigare dall'intero alle sue parti. Un oggetto aggregato è un oggetto composto da uno o più altri oggetti.
Associazione
L'associazione è un gruppo di collegamenti aventi una struttura comune e un comportamento comune. L'associazione rappresenta la relazione tra gli oggetti di una o più classi. Un collegamento può essere definito come un'istanza di un'associazione. Il grado di un'associazione indica il numero di classi coinvolte in una connessione. Il grado può essere unario, binario o ternario.
- Una relazione unaria collega oggetti della stessa classe.
- Una relazione binaria collega oggetti di due classi.
- Una relazione ternaria collega oggetti di tre o più classi.
Eredità
È un meccanismo che consente di creare nuove classi a partire da classi esistenti estendendone e perfezionandone le capacità. Le classi esistenti sono chiamate classi base / classi padre / superclassi e le nuove classi sono chiamate classi derivate / classi figlio / sottoclassi.
La sottoclasse può ereditare o derivare gli attributi e i metodi della / e superclasse, a condizione che la superclasse lo consenta. Inoltre, la sottoclasse può aggiungere i propri attributi e metodi e può modificare qualsiasi metodo della superclasse. L'ereditarietà definisce una relazione "è - un".
Example
Da una classe Mammifero si possono derivare numerose classi come Umano, Gatto, Cane, Mucca, ecc. Gli esseri umani, i gatti, i cani e le mucche hanno tutti le caratteristiche distinte dei mammiferi. Inoltre, ognuno ha le sue caratteristiche particolari. Si può dire che una mucca "è - un" mammifero.
Analisi OO
Nella fase di analisi orientata agli oggetti dello sviluppo del software, i requisiti di sistema vengono determinati, le classi vengono identificate e le relazioni tra le classi vengono riconosciute. Lo scopo dell'analisi OO è comprendere il dominio dell'applicazione e i requisiti specifici del sistema. Il risultato di questa fase è la specifica dei requisiti e l'analisi iniziale della struttura logica e della fattibilità di un sistema.
Le tre tecniche di analisi utilizzate insieme per l'analisi orientata agli oggetti sono la modellazione a oggetti, la modellazione dinamica e la modellazione funzionale.
Modellazione a oggetti
La modellazione a oggetti sviluppa la struttura statica del sistema software in termini di oggetti. Identifica gli oggetti, le classi in cui gli oggetti possono essere raggruppati e le relazioni tra gli oggetti. Identifica inoltre gli attributi e le operazioni principali che caratterizzano ciascuna classe.
Il processo di modellazione degli oggetti può essere visualizzato nei seguenti passaggi:
- Identifica gli oggetti e raggruppali in classi
- Identifica le relazioni tra le classi
- Creare un diagramma del modello a oggetti utente
- Definire gli attributi di un oggetto utente
- Definisci le operazioni che dovrebbero essere eseguite sulle classi
Modellazione dinamica
Dopo aver analizzato il comportamento statico del sistema, è necessario esaminarne il comportamento rispetto al tempo e ai cambiamenti esterni. Questo è lo scopo della modellazione dinamica.
La modellazione dinamica può essere definita come "un modo per descrivere come un singolo oggetto risponde agli eventi, sia eventi interni innescati da altri oggetti, sia eventi esterni innescati dal mondo esterno".
Il processo di modellazione dinamica può essere visualizzato nei seguenti passaggi:
- Identifica gli stati di ogni oggetto
- Identifica gli eventi e analizza l'applicabilità delle azioni
- Costruisci un diagramma modello dinamico, comprendente diagrammi di transizione di stato
- Esprimi ogni stato in termini di attributi dell'oggetto
- Convalidare i diagrammi di transizione di stato disegnati
Modellazione funzionale
La modellazione funzionale è il componente finale dell'analisi orientata agli oggetti. Il modello funzionale mostra i processi che vengono eseguiti all'interno di un oggetto e come cambiano i dati, mentre si spostano tra i metodi. Specifica il significato delle operazioni di una modellazione a oggetti e le azioni di una modellazione dinamica. Il modello funzionale corrisponde al diagramma di flusso dei dati dell'analisi strutturata tradizionale.
Il processo di modellazione funzionale può essere visualizzato nei seguenti passaggi:
- Identifica tutti gli input e gli output
- Costruisci diagrammi di flusso di dati che mostrano le dipendenze funzionali
- Indicare lo scopo di ciascuna funzione
- Identifica i vincoli
- Specificare i criteri di ottimizzazione
Design orientato agli oggetti
Dopo la fase di analisi, il modello concettuale viene ulteriormente sviluppato in un modello orientato agli oggetti utilizzando la progettazione orientata agli oggetti (OOD). In OOD, i concetti indipendenti dalla tecnologia nel modello di analisi vengono mappati su classi di implementazione, vengono identificati i vincoli e vengono progettate le interfacce, risultando in un modello per il dominio della soluzione. L'obiettivo principale della progettazione OO è sviluppare l'architettura strutturale di un sistema.
Le fasi per la progettazione orientata agli oggetti possono essere identificate come:
- Definizione del contesto del sistema
- Progettare l'architettura del sistema
- Identificazione degli oggetti nel sistema
- Costruzione di modelli di design
- Specifica delle interfacce degli oggetti
OO Design può essere suddiviso in due fasi: progettazione concettuale e progettazione dettagliata.
Conceptual design
In questa fase vengono identificate tutte le classi necessarie per la realizzazione del sistema. Inoltre, a ciascuna classe vengono assegnate responsabilità specifiche. Il diagramma delle classi viene utilizzato per chiarire le relazioni tra le classi e il diagramma delle interazioni viene utilizzato per mostrare il flusso degli eventi. È anche conosciuto comehigh-level design.
Detailed design
In questa fase, attributi e operazioni vengono assegnati a ciascuna classe in base al diagramma di interazione. I diagrammi della macchina a stati sono sviluppati per descrivere gli ulteriori dettagli del progetto. È anche conosciuto comelow-level design.
Principi di progettazione
Di seguito sono riportati i principali principi di progettazione:
Principle of Decoupling
È difficile mantenere un sistema con un insieme di classi altamente interdipendenti, poiché la modifica in una classe può comportare aggiornamenti a cascata di altre classi. In un progetto OO, l'accoppiamento stretto può essere eliminato introducendo nuove classi o ereditarietà.
Ensuring Cohesion
Una classe coesiva svolge una serie di funzioni strettamente correlate. Una mancanza di coesione significa: una classe svolge funzioni non correlate, sebbene non influisca sul funzionamento dell'intero sistema. Rende l'intera struttura del software difficile da gestire, espandere, mantenere e modificare.
Open-closed Principle
Secondo questo principio, un sistema dovrebbe essere in grado di estendersi per soddisfare i nuovi requisiti. L'implementazione esistente e il codice del sistema non devono essere modificati a seguito di un'espansione del sistema. Inoltre, le seguenti linee guida devono essere seguite nel principio aperto-chiuso:
Per ogni classe concreta, devono essere mantenute interfacce e implementazioni separate.
In un ambiente multithread, mantenere privati gli attributi.
Ridurre al minimo l'uso di variabili globali e variabili di classe.