Języki Programowania Laboratorium Ćwiczenia 11

Transkrypt

Języki Programowania Laboratorium Ćwiczenia 11
Języki Programowania
Laboratorium
Ćwiczenia 11-14
Programowanie obiektowe i klasa kontenerowa
Termin oddania zadania: 17 styczeń 2010
Zadanie Nr 4:
Zadanie polega na wcieleniu się w rolę architekta, inżyniera oprogramowania oraz inżyniera
testowania. Twoim zadaniem jest wykonie projektu i realizacja Automatu z Napojami, według
informacji podanych w poniższej specyfikacji:
•
Napój jest obiektem, który posiada cenę oraz nazwę. Napoje są kilku rodzajów sprzedawane w Puszkach lub Kubkach
•
Automat jest pojemnikiem (kontenerem) na obiekty klasy Napój.
•
Automat przed użyciem wymaga uzupełnień Napojami, ale jest bardzo pojemny, tzn. że
rozmiar nie jest z góry ograniczony przez specyfikację
•
Automat pozwala na dodanie elementu Napój za pomocą operatora + (S=S+C)
•
Automat pozwala na usunięcie elementu Napój za pomocą operatora - (S=S-C)
•
Dwa, lub więcej Automaty można połączyć ze sobą za pomocą operatora +. Wtedy
zawartość drugiego staje się zawartością pierwszego (S=S_1+S_2+S_3)
•
Możliwe jest przyrównanie dwóch Automatów, w celu sprawdzenia czy ich zawartości są
równe (S==S1)
•
Możliwe jest przyrównanie dwóch Automatów, w celu sprawdzenia, która z jest bardziej
pełny (S<S1)
•
Możliwe jest sklonowanie Automatu (w odróżnieniu od rzeczywistości) S=S1
•
Możliwe jest zapytanie, czy Automat jest pusty?
•
Możliwe jest zapytanie, czy Automat posiada określony Napój?
•
Możliwe jest zapytanie ile Napojów (Puszek lub Kubków) określonego rodzaju jest w
Automacie?
•
Możliwe jest zapytanie ile Napojów określonego rodzaju Automat może wydać za
określoną kwotę pieniędzy.
•
Zawartość Automatu można wypisać na standardowe wyjście (ostream << S )
•
Automat można uzupełnić ze standardowego wejścia (istream >> S) - zaprojektuj format
wprowadzania Napojów
Pracę podziel na etapy:
1. Projektowanie - jako projektant powinieneś przygotować koncepcję programu w oparciu o
specyfikację. Określ jak będą wyglądały klasy i jakie będą posiadać metody, jakie będą ich
przykłady użycia (use case scenario). Wykonaj dokumentację do interfejsu
programistycznego aplikacji (API) w postaci komentarzy opisujących klasy i ich metody.
Projektując pamiętaj o tym, że powierzone Ci zadanie może być tylko częścią większego
projektu, dlatego powinieneś dostarczyć odpowiednie pliki nagłówkowe, pozwalające na
skorzystanie z Twoich klas w innych przypadkach (kieruj się zasadą PPPP - Proper
Preparation Prevents Pathetic Performance).
2. Wykonanie - napisanie właściwego kodu realizującego projekt, pamiętając o dobrych
praktykach takich jak formatowanie kodu, adekwatne nazwy klas, metod i zmiennych,
czytelność (jedna metoda/funkcja ma zajmować nie więcej niż jeden ekran), redukowanie
zagnieżdżeń pętli i wyrażeń warunkowych (dobrze jest pamiętać o zasadzie KISS -Keep It
Stupid Simple). Przygotuj plik Makefile.
3. Testowanie - przygotowanie zestawu funkcji testujących (tzw. unit testing) poprawność
wykonywania operacji (tylko tych podanych w specyfikacji). Funkcja main powinna
zawierać wyłącznie wywołania do funkcji testujących. Jedna funkcja testowa dla każdej z
funkcjonalności, lub scenariusza użycia klasy. Program nie powinien zawierać interfejsu
użytkownika.
Przykładowy kod testujący klasę Adder posiadającą metodę Adder::add(int a, int b) dodającą dwie
liczby całkowite do siebie, może być napisany w następujący sposób:
/**
* Tests Adder::add(int, int)
*/
void testAdd()
{
Adder adder();
assert( adder.add(1, 2) == 3 );
assert( adder.add(1,-1) == 0 );
}
int main()
{
testAdd();
}