Ingegneria del Software – Esercitazione 3

Prima parte

Implementare una classe generica (o template) chiamata SimpleQueue<T> che rappresenti una coda di tipo FIFO, ovvero una coda First In First Out.

La classe deve implementare i tre seguenti metodi pubblici:

+ Enqueue(element : T) : void

+ Dequeue() : T

+ Clear() : void

ove il primo permette di inserire un elemento nella coda, mentre il secondo estrae e restituisce il primo elemento inserito nella coda tra quelli non ancora estratti. Il terzo metodo, Clear(), consente di svuotare immediatamente la coda senza dover estrarre gli elementi uno alla volta.

Inoltre la classe implementa anche una proprietà a sola lettura - ovvero dotata del solo selettore get e priva del modificatore set - chiamata Count che restituisce il numero degli elementi attualmente presenti in coda.

 

Nota 1: per l'implementazione interna della coda, usare un array di elementi di tipo generico T la cui dimensione viene definita mediante un parametro intero, chiamato capacity, passato al costruttore della classe. Se il numero degli elementi inseriti supera la capacità della coda (ovvero la dimensione dell'array interno), il metodo Enqueue() deve generare una eccezione. Altresì, il metodo Dequeue() deve generare una eccezione qualora si provi ad estrarre un elemento quando la coda è vuota.

Si consiglia anche di aggiungere una seconda proprietà a sola lettura chiamata Capacity (con iniziale maiuscola), che restituisce la dimensione del suddetto array interno.

 

Realizzare inoltre una classe di test distinta, su un file differente rispetto a quello della suddetta classe, per verificare il corretto funzionamento della coda.

 

Nota 2: può essere conveniente usare l'array interno come se fosse circolare, sfruttando adeguatamente l'operazione di modulo (%) e un attributo che tenga conto della attuale posizione del primo elemento che sarà estratto dalla lista, oltre all'attributo usato come contatore del numero degli elementi presenti nella coda.

 

Seconda parte

Modificare la precedente classe facendo in modo che nel momento in cui viene raggiunta la capacità massima (attraverso il metodo Enqueue()), non venga più propagata una eccezione, ma venga creato un nuovo array interno, più capiente, nel quale verranno copiati i dati precedentemente memorizzati nel vecchio array.

 

Finalità dell’esercizio

Gestione delle eccezioni

Generics

Strutturazione di collezioni personalizzate


 

Soluzione