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;
}