codice:
import java.util.*;
public class Involucro{
/** OVERVIEW: Involucro rappresenta una collezione dinamica di stringhe del tipo <s1, s2, s3,...., sn> tali che
s_i è completamente contenuta in s_(i+1).
V = {{s1,s2,s3,...,sn>: Per ogni i s_i è una stringa ed s_i è interamente contenuto in s_(i+1)}}
O = inserisci: Se l'oggetto che si vuole inserire è coerente con la rappresentazione della collezione
(è una stringa) e con lo stato attuale della collezione (i valori già presenti nella
collezione), allora lo inserisce nella collezione modificandola
fondi: Date collezioni S e T se s_n è interamente contenuto in t_1 allora fonde le due collezioni nel
seguente modo: S = <s1,s2,s3,...,sn> T = {t1,t2,t3,...,tn} --> {s1,s2,s3,...,sn,t1,t2,t3,..,tn}
get(i): Accede in maniera posizionale all'i-esimo elemento della collezione */
Vector collStr; // Rappresenta la collezione di stringhe
/** FUNZIONE DI ASTRAZIONE: F_a(): STATO CONCRETO ----> STATO ASTRATTO
F_a([a, ab, abc, abcd]) ------> {<a, ab, abc, abcd>}
ma anche: F_a([a, b(a), (ba)f, z(baf), (zbaf)e]) ---> {a, ba, baf, zbaf, zbafe}
INVARIANTE DI RAPPRESENTAZIONE: è un predicato I: C ---> boolean che è vero per gli stati concreti che sono
rappresentazioni leggittime di uno stato astratto:
I(collStr): collStr != NULL (il Vector deve essere sempre diverso da NULL)
Per ogni i: v.get(i) deve essere incluso in v.get(i+1) (la i-esima stringa deve
sempre essere interamente contenuta nella (i+1)-esima stringa della collezione */
/** COSTRUTTORE:
EFFECTS: Crea un nuovo oggetto di tipo Involucro che rappresenta la collezione vuota
@param: void:
@return: Il riferimento ad un oggetto di tipo Involucro
Il costruttore soddisfa l'invariante di rappresentazione in quanto: 1) Viene assegnata alla variabile di istanza
collStr il riferimento ad un nuovo Vector quindi no è mai null. 2) Il costruttore crea una collezione vuota che
rappresenta la stringa vuota contenuta in ogni stringa, quindi qualsiasi sia il primo elemento va bene */
public Involucro(){
collStr = new Vector(); // Crea la collezione vuota assegnando a collStr il riferimento ad un nuovo Vector vuoto
}
/** Metodo inserisci()
EFFECTS: Se il parametro può essere inserito nella collezione (se contiene completamente l'ultima stringa della
collezione, allora viene inserito nella collezione rappresentata dall'oggetto ricevente, altrimenti viene
sollevata una StringaNonValidaException
MODIFIES: this
@param: Un oggetto di tipo String
Il metodo inserisci() soddisfa l'invariante di rappresentazione in quanto se la collezione è vuota permette
l'inserimento di una stringa qualsiasi, se invece nella collezione è già presente qualcosa prima di inserire il
parametro controlla che il parametro contiene completamente l'ultima stringa presente nella collezione. Se ciò è
verificato la inserisce, altrimenti no e la collezione rimane sempre coerente con la sua definizione */
public void inserisci(String str){
int dimensione = collStr.size() ; // Contiene la dimensione del Vector collStr
if(dimensione == 0) // Se la collezione è vuota
collStr.addElement(str); // Aggiungi la stringa parametro in prima posizione
else{ // Altrimenti, se nella collezione ci sono già degli elementi
if(str.contains(collStr.elementAt(dimensione))) // Se i parametro contiene l'ultima stringa della collezione
collStr.addElement(str); // Aggiungi la stringa parametro in prima posizione
else throw new StringaNonValidaException(); // altrimenti solleva un'eccezione
}
}
}
Eccezione: