Esercizio 1: listino prezzi Si progetti una applicazione che gestisce gli articoli in vendita presso un rivenditore mediante un listino. Il listino contiene tutti gli articoli in vendita e consente di eseguire diverse operazioni su di esso. Alcune operazioni vengono eseguite allo stesso modo sia durante i periodi ordinari che durante i periodi promozionali. Altre operazioni vengono invece eseguite in maniera differente durante i periodi promozionali. In particolare, durante i periodi promozionali viene applicato uno sconto. Di conseguenza, le operazioni che coinvolgono il ritrovamento del prezzo devono tenere conto dello sconto.
Esercizio 1: listino prezzi Ciascun articolo è descritto da: 1. nome 2. prezzo 3. tipologia di articolo (standard o superior) Sul listino si devono poter svolgere le seguenti operazioni: 1. inserimento di un articolo 2. ritrovamento di un articolo (sulla base del nome) 3. ritrovamento del prezzo di un articolo (sempre per nome) 4. stampa di tutto il listino con prezzi
Esercizio 1: listino prezzi Le operazioni 3 e 4 devono essere svolte in modo appropriato a seconda del periodo (promozionale o no). Qualora si applichi lo sconto, è necessario ritrovare sia il prezzo originale che quello scontato. Analogamente per la stampa di tutto il listino con prezzi. In particolare, lo sconto applicato varia a seconda della tipologia di articolo: per articoli standard, sconto del 30% per articoli superior, sconto del 10%
Esercizio 1: modellare il problema Cosa modello con l interfaccia? Interfaccia per i comportamenti Classi per le entità concrete Cosa modello con la classe astratta? Metodi astratti Implementati dalle sottoclassi Implementare l applicazione usando una interfaccia o una classe astratta. Perché si sceglie l una o l altra?
Esercizio 1: note Note per l implementazione: - Il ritrovamento dell articolo consiste nel restituire l oggetto così come è nel listino, quindi in maniera indipendente dagli sconti. - Il ritrovamento del prezzo, al contrario, prevede di visualizzare il prezzo da applicare all articolo qualora lo si venda (quindi con lo sconto, se c è). - La stampa del listino prevede di visualizzare tutte le informazioni sull articolo, incluso l eventuale prezzo scontato.
Esercizio 1: interfaccia listino Vediamo come si può risolvere il problema usando una interfaccia. Si definisca un oggetto Item (l articolo) con gli attributi visti prima. Si definisca l interfaccia PriceList, che gestisce un array di Item e dichiara i metodi visti prima: - inserimento di un articolo - ritrovamento articolo/prezzo - stampa listino Si implementi l interfaccia in due classi: PriceList_Impl e DiscountPriceList_Impl. La seconda implementa opportunamente i metodi che coinvolgono il prezzo in modo da visualizzare il prezzo scontato, senza alterare il prezzo nel listino.
Esercizio 1: classe astratta listino Vediamo ora come risolvere il medesimo problema usando una classe astratta. Definito l oggetto Item, si definisca la classe astratta PriceList che gestisce l array di Item ed implementa i metodi: - inserimento di un articolo - ritrovamento articolo (con prezzo originale) Gli altri metodi, invece, sono astratti (e rendono quindi la classe astratta). Si definiscano due sottoclassi di PriceList, OrdinaryPriceList e DiscountPriceList, che implementano opportunamente i metodi: - ritrovamento prezzo - stampa listino
Listino: interfaccia o classe astratta? Alcune domande: - Cosa succede se aggiungo un metodo all interfaccia? Ad esempio, un metodo che ordina gli articoli per nome. - E se lo aggiungo alla classe astratta? - Cosa succede se non implemento un metodo dell interfaccia? - E se non implemento un metodo della classe astratta? - Cosa succede se PriceList_Impl implementa anche un altra interfaccia? - E se voglio che OrdinaryPriceList erediti anche da un altra classe?