Programmazione orientata agli oggetti - Prima parte

di Riccardo Golia, in ASP.NET 2.0,


Questo articolo è tratto dal capitolo 4 (Programmazione orientata agli oggetti) del libro ASP.NET 2.0 per tutti di Daniele Bochicchio, Cristian Civera, Riccardo Golia e Stefano Mostarda.

Acquista la tua copia online!

La programmazione procedurale propria di linguaggi ormai datati come il Pascal o il C oppure di linguaggi di scripting più recenti come il VBScript si basa principalmente sull'organizzazione e suddivisione del codice in funzioni e procedure. A ciascuna operazione corrisponde una routine, che accetta un insieme di parametri e, in funzione di essi, produce eventualmente un risultato. Con un simile approccio, la separazione tra i dati e la logica applicativa risulta essere netta: una procedura riceve le informazioni utili all'esecuzione dell'operazione richiesta solamente sotto forma di parametri e il suo stato interno in genere viene del tutto perduto una volta terminata l'elaborazione. In molti casi questa netta separazione tra dati e codice rappresenta un vincolo importante tale da rendere questo paradigma di programmazione poco efficace.

La programmazione orientata agli oggetti (in modo abbreviato OOP, che in inglese corrisponde a Object Oriented Programming) introduce un modo diverso e, se si vuole, più efficiente per strutturare il codice e la logica applicativa. OOP è infatti un paradigma di programmazione che si basa sulla definizione e sull'utilizzo di una serie di entità tra loro collegate e interagenti, ciascuna delle quali è caratterizzata da un insieme di informazioni di stato e di comportamenti specifici. Queste entità sono denominate oggetti e ciascuna di esse può contenere contemporaneamente dati, funzioni e procedure. In questo modo una routine associata ad un oggetto può sfruttare lo stato interno dell'oggetto di appartenenza per ricavare le informazioni utili all'esecuzione dell'elaborazione prevista.

Il grosso vantaggio dell'approccio object-oriented rispetto agli altri paradigmi di programmazione consiste nel fatto che, per strutturare le applicazioni, lo sviluppatore si trova ad utilizzare una logica che è molto vicina a quella che è la percezione comune del mondo reale. Pensare ad oggetti significa infatti saper riconoscere gli aspetti che caratterizzano una particolare realtà e saper fornire di conseguenza una rappresentazione astratta in un'ottica OOP.

Per fare un esempio, si consideri la contabilità di un'azienda. Dal momento che le fatture o le bolle sono sicuramente elementi del mondo reale che riguardano l'amministrazione aziendale, un sistema gestionale realizzato secondo l'approccio OOP deve necessariamente includere una rappresentazione di queste entità sotto forma di oggetti. L'idea di fondo di OOP consiste infatti nell'individuare l'insieme degli oggetti che costituiscono e caratterizzano la realtà in esame e, al tempo stesso, nel definire il modo con cui essi interagiscono tra loro ed evolvono nel tempo. Ciascun oggetto individuato non necessariamente deve corrispondere ad un elemento del mondo reale; in taluni casi esso può essere una pura invenzione introdotta dallo sviluppatore per uno specifico scopo.

La struttura degli oggetti e l'insieme delle correlazioni tra essi esistenti concorrono a determinare l'architettura dell'applicazione.

Sia Visual C# 2005 che Visual Basic 2005 sono linguaggi fortemente tipizzati per la realizzazione di applicazioni che sfruttano il .NET Framework come ambiente di esecuzione. Entrambi sfruttano i principi della programmazione orientata agli oggetti e utilizzano le classi, di cui gli oggetti sono istanze particolari, come elementi fondamentali per l'organizzazione e la strutturazione del codice.

Principi fondamentali di OOP

Come si è avuto modo di dire nel corso del capitolo 1, i tipi (sia quelli di valore che di riferimento) sono gli elementi portanti di ogni applicazione che gira nell'ambito del Common Language Runtime. Oltre ai tipi built-in inclusi nella BCL del .NET Framework, lo sviluppatore può definire i suoi tipi personalizzati.

Le classi rappresentano i tipi di riferimento definiti dal programmatore. Gli elementi costitutivi di una classe (detti anche membri) possono essere sia dati, che funzioni e procedure.

I principi fondamentali su cui si fonda la programmazione orientata agli oggetti e che riguardano le classi sono sostanzialmente tre: ereditarietà, polimorfismo e incapsulamento. Avere dimestichezza con questi concetti è di fondamentale importanza per poter capire e, al tempo stesso, sfruttare al meglio i meccanismi che regolano la programmazione orientata agli oggetti.

Ereditarietà

Il principio di ereditarietà si basa sul fatto di poter definire un legame di dipendenza di tipo gerarchico tra classi diverse. Una classe deriva da un'altra se da essa ne eredita il comportamento e le caratteristiche. La classe figlia si dice classe derivata, mentre la classe padre prende il nome di classe base (o superclasse). La classe base contiene il codice comune a tutte le classi da essa derivate. Ogni classe derivata rappresenta invece una specializzazione della superclasse, ma eredita in ogni caso dalla classe base i comportamenti in essa definiti.

Per fare un esempio classico, si supponga di voler rappresentare il genere animale definendo una struttura di classi equivalente. È possibile individuare una prima classe base Animale, da cui tutte le altre devono derivare. A questo punto le classi derivate possono essere: Mammifero, Rettile, Anfibio, Pesce, Uccello. La classe Uomo deriva direttamente da Mammifero e indirettamente da Animale. La classe Rana deriva da Anfibio, mentre la classe Aquila deriva da Uccello; entrambe derivano indirettamente da Animale (vedi figura 4.1). Si noti che in tutti i casi vale la relazione "è un" (l'uomo è un mammifero, la rana è un anfibio, l'aquila è un uccello; l'uomo, la rana e l'aquila sono animali).

Figura 4.1

Figura 4.1 - La classe base Animale e le sue classi derivate

Polimorfismo

Il polimorfismo rappresenta il principio in funzione del quale diverse classi derivate possono implementare uno stesso comportamento definito nell'ambito della classe base in modo differente.

Riprendendo l'esempio proposto nel caso dell'ereditarietà, si considerino due comportamenti comuni a tutti gli animali: Respira e Mangia. È indubbio che nel mondo animale questi comportamenti vengano messi in atto secondo modalità peculiari a seconda delle specie: un carnivoro mangia in modo differente rispetto ad un erbivoro, un pesce respira in modo diverso rispetto ad un uccello. In base a queste considerazioni, i comportamenti Mangia e Respira definiti nelle diverse classi derivate da Animale possono essere implementati in modo specifico e del tutto indipendente dalle altre implementazioni (e, in particolar modo, da quello della classe base).

4 pagine in totale: 1 2 3 4
Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti