sabato 24 maggio 2014

Programmazione: Capitolo 3, Parte 1

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