Wprowadzenie do programowania w języku C++ Rozdział I Modelowanie obiektowe Witold Bartkiewicz
Złożoność Problem: Rosnąca złożoność modelowanych zjawisk
Dekompozycja Rozbicie problemu na mniejsze. Rozbicie problemu na obiekty. Podział obiektów na mniejsze obiekty składowe i rozproszenie obszaru odpowiedzialności oryginalnego obiektu między te składowe. Na przykład samochód jest obiektem składającym się z prostszych komponentów, takich jak silnik, system paliwowy, układ sterowniczy, itp.
Znajdowanie obiektów 1 Ludzie, miejsca i rzeczy Jan Kowalski fabryka budynek samolot pojazd książka
Znajdowanie obiektów 2 Role pełnione przez osoby i organizacje doktor pacjent nauczyciel posiadacz konta pracownik dział
Znajdowanie obiektów 3 Wypadki i zdarzenia lot wypadek ruch myszą załamanie się systemu wezwanie obsługi
Znajdowanie obiektów 4 Interakcje sprzedaż małżeństwo spotkanie w interesach produkcja przyznanie kredytu
Interfejs i implementacja Interfejs: Widok zewnętrzny obiektu Pokazuje jedynie co dany obiekt może zrobić, ukrywając szczegóły tego jak operacje te są wykonywane. Umożliwia to użytkownikowi korzystanie z usług obiektu w sposób prosty Implementacja: Wewnętrzny obraz obiektu. Sposób w jaki sposób obiekt wykonuje swoje zadania. Przykład: bankomat – prosty interfejs pozwalający na wykonanie skomplikowanych operacji, bez konieczności analizowania sposobu w jaki są one realizowane.
Abstrakcja Abstrakcja polega na wyodrębnieniu cech istotnych z punktu widzenia celów modelowania i ignorowanie nieistotnych szczegółów. Z punktu widzenia sprzedawcy samochodów istotne są jego takie cechy jak cena, wygląd, parametry działania nie musi on znać np. szczegółów działania poszczególnych układów. Odmiennie jest z punktu widzenia mechanika: cena, wygląd mają mniejsze znaczenie. Niezbędna jest natomiast szczegółowa znajomość budowy i sposobu działania.
Pojęcie: Samochód Czy to jest samochód?
Pojęcie: Samochód Czy to jest samochód?
Pojęcie: Samochód Czy to jest samochód?
Pojęcie: Samochód Czy to jest samochód?
Pojęcie: Samochód Czy to jest samochód?
Pojęcie: Samochód Czy to jest samochód?
Obiekty Atrybuty – opisują cechy obiektu. Mogą być utożsamiane z danymi przechowywanymi przez obiekt. Np. stan konta jest atrybutem obiektów konta. Metody – reguły zarządzające zachowaniem obiektu, w odpowiedzi na przesyłane do niego sygnały. Np. obiekt konta może mieć takie metody jak wpłata i wypłata. Wartości atrybutów mogą się zmieniać. Stan konta może być odmienny dla różnych kont. Metody są niezmienne. Wpłata zawsze realizowana jest tak samo: dodaje wpłacaną kwotę do stanu konta. Wypłata podobnie. Sprawdza czy stan konta przekracza wypłacaną kwotę, jeśli tak to dokonuje wypłaty, zmniejszając stan konta. W przypadku przeciwnym operacja jest odrzucana i stan konta pozostaje bez zmian.
Hermetyzacja Hermetyzacja oznacza, że newralgiczne części obiektu, są ukryte i niedostępne dla świata zewnętrznego. Dotyczy to zwykle (ale nie tylko) atrybutów obiektu. Jedynym sposobem otrzymania informacji o obiekcie, lub wykonania jakiejś jego operacji jest wysłanie do niego komunikatu.
Tożsamość obiektów Różne obiekty mogą mieć jednakowe wartości atrybutów. Np. wiele kont bankowych może mieć w danym momencie jednakowy stan konta. Każdy obiekt powinien więc posiadać jednoznaczny identyfikator, odróżniający go od innych obiektów. Np. numer konta dla obiektu konta.
Atrybuty atrybuty opisujące - dostarczają faktów nieodłącznie związanych z każdym obiektem (egzemplarzem klasy) atrybuty nazywające - etykiety i nazwy utrzymywane przez każdy obiekt atrybuty referencyjne - powiązania między obiektami
Protokół przesyłania komunikatów Nazwa metody. Rodzaj dodatkowych wartości, zwanych argumentami, jakie muszą towarzyszyć wysyłanemu komunikatowi. Jakie warunki wstępne muszą być spełnione, przed przesłaniem komunikatu. Jakie warunki końcowe muszą być spełnione po przesłaniu komunikatu. Jakiego rodzaju wartość zwracana jest przez metodę przetwarzającą komunikat.
Protokół przesyłania komunikatów Wypłata Argument: wartość rzeczywista, wypłacana kwota Warunki wstępne: Parametr kwota powinien być dodatni. Warunki końcowe: Jeśli środki na koncie są wystarczające dla pokrycia wypłacanej kwoty zaktualizuj stan konta i zwróć 0. W przypadku przeciwnym nie zmieniaj stanu konta i zwróć 1. Wartość zwracana: wartość całkowita 1 lub 0.
Protokół przesyłania komunikatów Zewnętrzny widok obiektu, interfejs jest więc zbiorem wspólnych protokołów przesyłania komunikatów dla wszystkich obiektów klasy. Zdolność do odniesienia jednego protokołu przesyłania komunikatów do różnych metod nazywamy polimorfizmem. Zdolność odniesienia jednego interfejsu do obiektów różnych klas nazywamy zachowaniem polimorficznym obiektów.
Formowanie pojęć Świat zjawisk Postrzeganie
Formowanie pojęć Pojęcie 1 Pojęcie 2 Pojęcie 3 Pojęcie n Świat zjawisk Postrzeganie
Pojęcie: Samochód Przykłady Tak Nie
Pojęcia są abstrakcjami zjawisk świata rzeczywistego, które: Współdzielą wspólną charakterystykę Współdzielą wspólne reguły zachowania
Pojęcia są abstrakcjami zjawisk świata rzeczywistego, które: Współdzielą wspólną charakterystykę Współdzielą wspólne reguły zachowania
Pojęcia i C++ Pojęcie Class (Klasa) Egzemplarz Obiekt Zmienna obiektowa (Obiekt) Egzemplarz
Klasa obejmuje: Interfejs klasy. Strukturę atrybutów (schemat reprezentacji). Metody obiektów do niej należących. Klasa obejmuje strukturę atrybutów, ale nie ich wartości. Mogą być one odmienne dla różnych obiektów należących do niej. Zestawienie aktualnych wartości atrybutów nazywamy stanem obiektu.
Fabryki i klienci Wewnętrzne części klasy: metody oraz strukturę atrybutów nazywamy fabryką. Tak więc klasa definiowana jest poprzez fabrykę oraz interfejs. Klienci korzystają z usług obiektów utworzonych przez fabrykę, wysyłając do nich komunikaty. Interfejs klasy działa jak kontrakt między fabryką a klientem. Fabryka gwarantuje, że obiekt będzie działał zgodnie ze specyfikacjami, jeśli klient korzysta z odpowiedniego protokołu przesyłania komunikatów, określonego w interfejsie. Fabryka wie również w jaki sposób utworzyć obiekt. Nie wie jednak w jaki sposób zostanie on użyty. Może również nie znać liczby obiektów jaka zostanie skonstruowana.
class TBankAccount { //szczegóły pominięte float _balance; float _interestYTD; TClient* _owner; int _accountNumber };
class TBankAccount { // szczegóły pominięte float _balance; float _interestYTD; TClient* _owner; int _accountNumber }; struct TBankAccount { //szczegóły pominięte float balance; float interestYTD; struct TClient*owner; int accountNumber };
class TBankAccount { //many details omitted float _balance; float _interestYTD; TClient* _owner; int _accountNumber }; struct TBankAccount { //many details omitted float balance; float interestYTD; struct TClient* owner; int accountNumber }; // całe mnóstwo kodu int MakeDeposit( long acntNo, float amount}; float WithDraw( long acntNo, float amount}; float Print(long acntNo);
class TBankAccount { // szczegóły pominięte float _balance; float _interestYTD; TClient* _owner; int _accountNumber public: void MakeDeposit( float amount); float WithDraw( float amount); void Print(); }; struct TBankAccount { // szczegóły pominięte float balance; float interestYTD; struct TClient* owner; int accountNumber }; // całe mnóstwo kodu void MakeDeposit( long acntNo, float amount}; float WithDraw( long acntNo, float amount}; void Print(long acntNo);
Relacje między klasami Relacja „jest”, zwana również dziedziczeniem: obiekt jednej klasy należy również w pewnym sensie do innej, bardziej podstawowej klasy. Np. każdy obiekt należący do klasy „Student” jest również obiektem klasy „Osoba”. Relacja „ma: obiekt jednej klasy posiada obiekt innej klasy jako jedną ze swoich składowych. Np. Obiekt „Portfel” posiadać może jako jedną ze swoich składowych obiekt „Obligacja”.
Dziedziczenie („jest”) Dziedziczenie dotyczy w sytuacji w której obiekty jednej klasy mają wszystkie cechy obiektów drugiej klasy jak również ewentualne własne cechy dodatkowe. Np. każdy obiekt klasy „Student” ma wszystkie cechy obiektu klasy „Osoba” oraz pewne dodatkowe atrybuty i metody. Mówimy wówczas, że klasa „Student” dziedziczy wszystkie właściwości klasy „Osoba”. Dziedziczenie odzwierciedla związek generalizacji, między pojęciem (klasą) ogólniejszą (taką jak „Osoba”) i pojęciem (klasą) bardziej szczegółową (taką jak „Student”). Klasę ogólniejszą nazywamy klasą podstawową (lub bazową), klasę która z niej dziedziczy - klasą pochodną.
Hierarchie dziedziczenia Pojęcia układają się w pewne naturalne hierarchie generalizacji / uszczegółowiania. Struktury te mają przy tym charakter drzewiasty, tzn. jedno pojęcie (klasa) ogólniejsze może służyć jako podstawa większej liczby pojęć bardziej szczegółowych. Osoba StudentPracownik NauczycielPrac. inżynieryjny AsystentAdiunktProfesorSprzątaczkaPortier
Metody wirtualne (polimorficzne) Dziedziczone są nie tylko atrybuty klasy podstawowej, ale również jej metody. Metody w klasie pochodnej mogą wykonywać operację odziedziczoną z klasy podstawowej w inny sposób. Np. „Konto oszczędnościowe” i „Konto rozliczeniowe” są pochodnymi klasy „Konto”. W każdej z tych klas operacja wypłaty będzie realizowana nieco inaczej. Będzie to jednak zawsze operacja wypłaty. Takie metody nazywamy wirtualnymi lub polimorficznymi. Mogą one wykonywać operacje w różny sposób, muszą jednak zachowywać ten sam protokół przesyłania komunikatów.
Dekompozycja obiektu („ma”) Obiekt może zostać zbudowany z mniejszych części, poprzez użycie mniejszych obiektów jako komponentów składowych większego. Rodzajem tego typu związku „ma” są tzw. kontenery. Obiekty klas kontenerowych zarządzają zbiorem obiektów należących do innych klas.
6. Utworzenie środowiska dla budowy nowych klas nazwa_klasy.h – plik zawierający interfejs klasy (tzw. plik nagłówkowy). nazwa_klasy.cpp – plik zawierający metody klasy. plik zawierający kod klienta testującego klasę. Obecny etap rozpoczyna fazę implementacji systemu w języku C++. Tym niemniej podobne kroki wykonane muszą być również w przypadku wykorzystania innego języka programowania. Pierwszym krokiem jest utworzenie środowiska dla nowo tworzonych klas. Każda klasa wymaga utworzenia trzech plików:
6. Utworzenie środowiska dla budowy nowych klas (c.d.) class Konto { }; #include"konto.h"#include"konto.h" int main() { return 0; } konto.hkonto.cppkntmain.cpp
7. Implementacja i testowanie interfejsu klasy Implementacja interfejsu: class Konto { public: Konto(void); ~Konto(void); int Wyplata(double kwotaWyplaty); void Wplata(double kwotaWplaty); double PodajStanKonta(void); };
7. Implementacja i testowanie interfejsu klasy (c.d.) Implementacja zalążków metod: int Konto::Wyplata(double kwotaWyplaty){ return 0; } int Konto::Wplata(double kwotaWplaty) { return; }
7. Implementacja i testowanie interfejsu klasy (c.d.) #include "konto.h" int main(){ Konto mojeKonto; mojeKonto.Wplata(199.99); return 0; } Dodanie scenariusza testującego:
8. Implementacja atrybutów klasy class Konto { public: Konto(void); ~Konto(void); int Wyplata(double kwotaWyplaty); void Wplata(double kwotaWplaty); double PodajStanKonta(void); private: double StanKonta; };