Scatole nere
§ Scatola nera: qualcosa che svolge quasi magicamente i
propri compiti
§ Dispositivo di cui non si conoscono i meccanismi interni
di funzionamento
§ Dà luogo a incapsulamento, cioè nasconde i dettagli che
non sono importanti.
§ Va identificato il giusto concetto che rappresenti una
certa scatola
nera
Scatole nere
§ I concetti vengono identificati durante il processo di
astrazione.
§ Astrazione: processo di eliminazione delle caratteristiche
inessenziali, finché non rimanga soltanto l’essenza del
concetto.
§ Nella programmazione orientata agli oggetti (“objectoriented”)
le scatole nere con cui vengono costruiti i
programmi
vengono chiamate oggetti.
Livelli di astrazione:
un esempio dalla vita reale
Livelli
di astrazione
nella progettazione di automobili
Livelli di astrazione: un esempio concreto
§ I guidatori non hanno bisogno di capire come funzionano le
scatole
nere
§ L’interazione di una scatola nera con il mondo esterno è
ben
definita:
§ I guidatori interagiscono con l’auto usando pedali,
pulsanti,ecc.
§ I meccanici controllano che i moduli di controllo
elettronico
mandino il giusto segnale d’accensione alle candele
§ Per i produttori di moduli di controllo elettronico i
transistori e i
condensatori sono scatole nere magicamente costruite da un
produttore di componenti elettronici
§ L’incapsulamento porta all’efficienza:
§ Un meccanico si occupa solo di moduli per il controllo
elettronico
senza preoccuparsi di sensori e transistori
§ I guidatori si preoccupano solo di interagire con l’auto
(mettere
carburante nel
serbatoio) e non dei moduli di controllo elettronico
Livelli di astrazione: progettazione
del software
Livelli
di astrazione
nella
progettazione del software
Livelli di astrazione: progettazione
del software
§ Ai primordi dell’informatica, i programmi per computer
erano in grado di manipolare tipi di dati primitivi, come i
numeri e i caratteri.
§ Con programmi sempre più complessi, ci si trovò a dover
manipolare quantità sempre più ingenti di questi dati di
tipo primitivo, finché i programmatori non riuscirono più a
gestirli.
§ Soluzione: incapsularono le elaborazioni più frequenti,
generando “scatole nere” software da poter utilizzare
senza occuparsi di ciò che avviene all’interno.
Livelli di
astrazione: progettazione
del software
§ Fu usato il processo di astrazione per inventare tipi di
dati a un
livello superiore rispetto a numeri e caratteri.
§ Nella programmazione orientata agli oggetti gli oggetti
sono
scatole nere.
§ Incapsulamento: la struttura interna di un oggetto è
nascosta al
programmatore, che ne conosce però il comportamento.
§ Nella progettazione del software si utilizza il processo
di
astrazione per definire il comportamento di oggetti non ancora
esistenti e, dopo averne definito il comportamento, possono
essere realizzati (o “implementati”).
Progettare l’interfaccia pubblica
di una classe
§ Progettare la classe BankAccount
§ Procedimento di astrazione:
§ operazioni irrinunciabili per un conto bancario
§ versare denaro
§ prelevare denaro
§ conoscere il saldo attuale
Progettare l’interfaccia pubblica
di una classe: i metodi
§ Metodi della classe BankAccount: deposit
withdraw
getBalance
§ Vogliamo che i metodi possano funzionare nel modo
seguente:
harrysChecking.deposit(2000);
harrysChecking.withdraw(500);
System.out.println(harrysChecking.getBalance());
Progettare l’interfaccia pubblica
di una classe: definizione di metodo
Ogni definizione di metodo contiene
§ uno specificatore
di accesso (solitamente public)
§ il tipo
di dati restituito (come void or double)
§ il nome del metodo (come deposit)
§ un elenco dei parametri del metodo,
racchiusi fra parentesi
(come double amount)
§ il corpo
del metodo: enunciati racchiusi fra
parentesi graffe
{ }
Esempi:
public void deposit(double
amount) { . . . }
public void withdraw(double
amount) { . . . }
public double getBalance() { . . . }
Sintassi 3.1: Definizione di metodo
specificatoreDiAccesso
tipoRestituito nomeMetodo(tipoParametro
nomeParametro, ...)
{
corpo del metodo
}
Esempio:
public void deposit(double amount)
{
.
. .
}
Obiettivo:
Definire
il comportamento di un metodo.
Progettare l’interfaccia pubblica
di una classe: definizione di costruttore
§ I costruttori contengono istruzioni per inizializzare
gli oggetti.
§ Il nome di un costruttore è sempre uguale al nome
della classe.
public BankAccount()
{
// corpo, che verrà
riempito più tardi
}
Progettare l’interfaccia pubblica
di una classe: definizione di costruttore
§ Il corpo del costruttore è una sequenza di enunciati che
viene eseguita quando viene costruito un nuovo oggetto.
§ Gli enunciati presenti nel corpo del costruttore
imposteranno i valori dei dati interni dell’oggetto
che è in fase di costruzione.
§ Tutti i costruttori di una classe hanno lo stesso nome,
che è il nome della classe.
§ Il compilatore è in grado di distinguere i costruttori,
perché richiedono parametri diversi.
Sintassi 3.2: Definizione di costruttore
specificatoreDiAccesso
nomeClasse(tipoParametro
nomeParametro,
...)
{
corpo del costruttore
}
Esempio:
public BankAccount(double
initialAmount)
{
. . .
}
Obiettivo:
Definire il comportamento di un costruttore
Interfaccia pubblica
§ I costruttori e i metodi pubblici di una classe
costituiscono la sua interfaccia pubblica:
public class BankAccount
{
// Costruttori
public BankAccount()
{
// corpo, che verrà
riempito più avanti
}
public BankAccount(double initialBalance)
{
// corpo, che verrà
riempito più avanti
}
// Metodi
public void deposit(double
amount)
Interfaccia pubblica
{
// corpo, che verrà
riempito più avanti
}
public void withdraw(double
amount)
{
// corpo, che verrà
riempito più avanti
}
public double getBalance()
{
// corpo, che verrà
riempito più avanti
}
// campi privati,
}
Sintassi 3.3: Definizione di classe
specificatoreDiAccesso
class nomeClasse
{
costruttori
metodi
campi
}
Esempio:
public class BankAccount
{
public
BankAccount(double initialBalance) { . . . }
public
void deposit(double amount) { . . . }
. . .
}
Obiettivo:
Definire una classe, la sua interfaccia pubblica e i
suoi dettagli realizzativi.
Commentare l'interfaccia pubblica
/**
Preleva denaro dal conto bancario.
@param amount l'importo da prelevare
*/
public void withdraw(double
amount)
{
// realizzazione
(completata in seguito)
}
/**
Ispeziona il saldo attuale del conto corrente.
@return il saldo attuale
*/
public double getBalance()
{
// realizzazione
(completata in seguito)
}
Commento per la classe
/**
Un conto bancario ha un saldo che può essere
modificato da depositi e prelievi.
*/
public class BankAccount
{
. . .
}
§ Scrivete commenti di documentazione
§ per ogni classe,
§ per ogni metodo,
§ per ogni parametro,
§ per ogni valore restituito
e scrivetela prima (!!!) di scrivere l'implementazione.
Riassunto dei metodi generato da javadoc
Un
riassunto dei metodi generato da javadoc
javadoc
BankAccount.java
Dettaglio di metodi generato da javadoc
Dettaglio
di metodi generato da javadoc
Nessun commento:
Posta un commento