Come vincere!
- Individua il tipo di struttura dati (interfaccia, classe astratta o classe concreta?)
Interfaccia:
- Scrivi bene l'overview se non c'è già
- Definisciti il typical element prima di tutto
- Se è un modificatore che ha oggetti come parametri, NullPointerException!
- Pensa ad utilizzare i vari metodi in modo malevolo per trovare altre eccezioni
- Il Typical Element aiuta: è un array? ricorda che la dimensione deve essere maggiore di 0!
- La REQUIRES e la THROWS sono strettamente collegati
- Formalizza l'overview per ricavarti la EFFECTS
- MODIFIES solo nei modificatori; è sempre this, a meno che il Typical Element non sia una funzione(es. f: int -> [0..n])
- RESULT solo negli osservatori (return this.qualcosa o f.qualcosa)
- Ricorda poi di definire le eccezioni checked in fondo
Classe astratta:
- Scrivi bene l'overview se non c'è già
- Definisciti il typical element prima di tutto
- Metodi abstract? Puoi usarli per implementare i metodi sottostanti!
- Attento bene a implementare(se richiesto) solo i metodi senza la dicitura abstract!
Classe concreta:
- Ricavati la FA dagli attributi concreti della classe!
- Quando funziona la classe? Scriviti l'invariante di rappresentazione in italiano basandoti sulle REQUIRES, poi riscrivila in modo formale.
- Le nuove REQUIRES dei metodi sono le stesse dell'interfaccia (o della classe abstract) adattate al tipo di struttura dati concreta usata.
- Potrebbero esserci nuove eccezioni, aiutati con la struttura dati concreta per scoprirle.
- Se usi le eccezioni checked già dichiarate nell'interfaccia, non ridichiararle!
Parole chiave:
- Collection/Set: --> Insieme o funzione
- Lista/Coda/Stack: --> Lista o array (Vector, ArrayList ecc..)
- Mappa/Tabella: --> Albero o tabella hash, eventualmente anche funzione se hanno chiave + dato/i (HashTable o TreeMap)
- Stai creando una sottoclasse? Se ci sono nuove eccezioni il principio di sostituzione non vale!
- Se l'invariante di rappresentazione non è più rispettata, non vale il principio di sostituzione!
- Stai rafforzando le precondizioni nel sottotipo? non vale il principio di sostituzione!
- Stai indebolendo le postcondizioni nel sottotipo? non vale il principio di sostituzione!
- Utilizza le regole dei metodi SOLO SE quanto sopra elencato non funge
- Non fare troppo affidamento sulla logica di Hoare! Usa il cervello, alcune condizioni sono 'fittizie'
- Ricordati bene come capire il Dynamic Dispatching
- Rileggi tutto, ma dopo una pausa (se hai tempo)
- Hai vinto? Ahahahah buon progettino allora, mbecille!