Java 2 – Programmazione Orientata agli Oggetti (OOP)



La programmazione orientata agli oggetti è un paradigma di programmazione basato sul concetto di classe, che permette la definizione di oggetti (che rappresentano sostanzialmente dei tipi di dato) creati secondo le caratteristiche definite all’interno della classe stessa.

Una classe è caratterizzata essenzialmente dagli attributi (che sono i “dati” della classe: ad esempio, per la classe autovetture gli attributi potrebbero essere colore, velocità, cilindrata, etc.) e dai metodi (che sono le “azioni” che possono essere compiute dagli oggetti della classe: tornando alla classe autovetture, potrebbero essere accelerare, sterzare, frenare e via dicendo); l’oggetto rappresenta una specifica istanza della classe (per istanza si intende un “esemplare” di oggetto di quella classe: tornando alla classe autovetture, diverse istanze sono una Ferrari Testarossa, una Cinquecento, una Mini Cooper e così via).

Le caratteristiche portanti della OOP sono tre: l’incapsulamento, l’ereditarietà ed il polimorfismo.

L’incapsulamento ha lo scopo principale di “nascondere” i dati dell’oggetto al resto del programma: questi saranno accessibili solamente mediante opportuni metodi con cui ci si potrà interfacciare con l’esterno. Questa feature serve essenzialmente a semplificare la vita ad un programmatore che voglia utilizzare una classe appartenente ad una libreria esterna: questo non dovrà sapere come funziona il codice specifico della classe, ma soltanto come interfacciarsi con esso.

L’ereditarietà permette invece di costruire nuove classi a partire da un’altra classe, chiamata superclasse. Un esempio banale è rappresentato dalla solita classe autovetture, che rappresenta la superclasse delle classi auto sportive, monovolume, SUV, e via dicendo. L’ereditarietà è una caratteristica importantissima, che permette la definizione di classi anche molto complesse senza il dover necessariamente riscrivere porzioni importanti di codice.

Grazie al polimorfismo, invece, lo stesso codice può comportarsi in maniera differente a seconda della situazione. Di solito, il concetto di polimorfismo subentra nei meccanismi di ereditarietà tra classi: in questi casi è possibile che gli oggetti che appartengono alle varie sottoclassi derivate da un’unica superclasse rispondano in maniera differente alle stesse istruzioni. Ad esempio, nella gerarchia autovetture – Ferrari/Cinquecento avremo che gli oggetti definiti nelle sottoclassi Ferrari e Cinquecento avranno tutti il metodo cambiaMarcia(), soltanto che per la Ferrari questo restituirà la stringa “premi il pulsante del cambio automatico” mentre per la Cinquecento restituisce la stringa “premi la frizione e modifica la posizione del cambio manuale”.

La OOP ha permesso di superare alcune dei limiti tipici della programmazione strutturata, come ad esempio l’estrema ridondanza del codice, introducendo però alcuni problemi come ad esempio un certo overhead (sovraccarico) in termini di consumo di CPU e memoria. Ecco perché alcuni linguaggi, tra cui Java, utilizzano un approccio ibrido alla OOP, permettendo di non considerare alcuni tipi di dati primitivi come oggetti. Altre critiche alla OOP sono di tipo concettuale (viene a volte sottolineata una certa debolezza strutturale, soprattutto in alcune situazioni, della proprietà del polimorfismo) e pratico (il codice risulta essere comunque molto complicato da scrivere in maniera corretta).

Annunci sponsorizzati:
Condividi su Facebook Condividi su Twitter!
Pinterest