Projektowanie klas
Transkrypt
Projektowanie klas
Projektowanie klas programowanie obiektowe – nowe podejście do programowania oparte na pojęciu obiektu – abstrakcji fragmentu rzeczywistości opisującej stany i zachowanie zapis tej abstrakcji – klasa powinna ona być kompletna (zawierać potrzebne dane i sposoby ich modyfikacji) istnieje wiele metodologii pozwalających na wyodrębnienie w rozważanym problemie potrzebnych klas, określenie ich zawartości i oddziaływania ogólne wskazówki dotyczące projektowania klas: o wyodrębnienie klasy – odpowiedź na potrzeby życia (obsługa rozwiązania konkretnego problemu) o zwykle nie uda się utworzyć idealnej definicji – jej precyzowanie następuje w trakcie pracy o zachowuj prostotę – zaczynaj od małych i prostych obiektów o oczywistym przeznaczeniu o zacznij programować – sprawdź w działaniu proponowany projekt Projektowanie klas – przykład cel: napisanie programu ułatwiającego zarządzaniem portfelem papierów wartościowych pytanie – jak reprezentować takie papiery – co ma być podstawowym obiektem opisu; możliwości: o obiekt reprezentuje pojedynczy udział o obiekt – zapis puli udziałów jednej spółki przez będących w posiadaniu jednej osoby wybór drugiej możliwości – klasa Akcje; operacje wykonywane na udziałach: o nabycie udziałów nowej spółki o sprzedaż pewnej ilości udziałów o zakup pewnej ilości udziałów o aktualizacja wartości pojedynczego udziału o wyświetlenie informacji o posiadanych udziałach powyższa lista określa podstawowy publiczny interfejs klasy Akcje lista informacji, które powinny zawierać obiekty klasy o nazwa spółki o liczba posiadanych udziałów o wartość jednostkowa udziału o łączna wartość akcji danej spółki w posiadaniu danej osoby deklaracje klasy Akcje: class Akcje // deklaracja klasy { private: char firma[30]; int udzialy; double cena; double wart_calk; void ustal_wart() { wart_calk = udzialy * cena; } public: void nabycie(const char* co,int ile, double po_ile); void sprzedaj(int ile, double po_ile); void kupuj(int ile, double po_ile); void aktualizyj(double nowa_cena); void pokaz(); }; cechy deklaracji klasy: o dane ukryte, niedostępne poza klasą o publiczne funkcje składowe – pośrednik między programem a obiektem klasy (publiczny interfejs) o oddzielenie publicznego interfejsu od szczegółów implementacji (zazwyczaj implementacja metod klasy – poza ciałem klasy, w oddzielnym pliku) o ukrywanie danych – zwolnienie użytkowników od konieczności znajomości wewnętrznej reprezentacji danych o prywatna metoda klasy : ustal_wart() Implementacja metod: void Akcje::nabycie(const char * co, int ile, double po_ile) { strncpy(firma, co, 29); firma[29] = '\0'; if (ile < 0) { std::cerr << "Liczba udzialow nie moze byc ujemna; " << "ustalam liczbe udzialow " << firma << " na 0.\n"; udzialy = 0; } else udzialy = ile; cena = po_ile; ustal_wart(); } void Akcje::kupuj(int ile, double po_ile) { if (ile < 0) { std::cerr << "Liczba nabywanych udzialow nie moze byc ujemna " << "Transakcja przerwana.\n"; } else { udzialy += ile; cena = po_ile; ustal_wart(); } } void Akcje::sprzedaj(int ile, double po_ile) { using std::cerr; if (ile < 0) { cerr << "Liczba sprzedawanych udzialow nie moze byc ujemna. " << "Transakcja przerwana.\n"; } else if (ile > udzialy) { cerr << "Nie mozesz sprzedac wiecej udzialow, niz posiadasz! " << "Transakcja przerwana.\n"; } else { udzialy-= ile; cena = po_ile; ustal_wart(); } } void Akcje::aktualizuj(double pr) { cena = pr; ustal_wart(); } void Akcje::pokaz() { using std::cout; using std::endl; cout << "Spolka: " << firma << " Liczba udzialow: " << udzialy << endl << " Cena udzialu: " << cena << " zl" << " Laczna wartosc udzialow: " << wart_calk << " zl" << endl; } int main() { using std::cout; using std::ios_base; Akcje p1; p1.nabycie("CocaCola", 20, 12.50); cout.setf(ios_base::fixed); // format #.## cout.precision(2); // format #.## cout.setf(ios_base::showpoint); // format #.## p1.pokaz(); p1.kupuj(15, 18.25); p1.pokaz(); p1.sprzedaj(400, 20.00); p1.pokaz(); return 0; }