Pakiet programów do zdalnego nauczania Programowania Orientowanego Obiektowo
Dzisiaj jest
Środa, 18 Lipiec 2018
Zarejestrowanych użytkowników: 4
Dostępnych pytań testowych: 102
HOME
Strona tytułowa pracy dyplomowej
NAUKA
Materiały dydaktyczne związane z OOP
TESTY
Sprawdzenie poziomu zdobytej wiedzy
ZASOBY
Literatura i zasoby sieciowe o OOP
ŹRÓDŁA
Zbiór projektów dydaktycznych z OOP
KONTO
Możliwość śledzenia własnych postępów
INFO



Przykład (symulacja silnika – wzorzec stan)

Przedstawiony przykład, mimo iż pozwolił na poprawną implementację symulacji silnika nie wykorzystuje w pełni technik obiektowych. Przez konieczność każdorazowego sprawdzania bieżącego stanu za pomocą instrukcji warunkowych w każdej metodzie publicznej dostępnej dla klienta zrozumienie i modyfikacja kodu może sprawiać trudności.

Alternatywnym rozwiązaniem jest reprezentowanie stanów poprzez osobne klasy. Klasa Silnik posiada w takim wypadku odwołanie do klasy stanu i wszelkie wywołania deleguje do niej. Dzięki temu kod odpowiedzialny za działanie silnika w określonym stanie nie jest rozproszony w instrukcjach warunkowych, ale znajduje się w jednej klasie. Zrozumienie, jak również i modyfikacja kodu staje się dla klienta łatwiejsza i mniej podatna na błędy.

Przy wykorzystaniu implementacji wzorca projektowego Stan deklaracja klasy Silnik została znacząco uproszczona. Pojawia się tylko jeden składnik przechowujący stan, nie ma także stałych składników statycznych określających maksymalne przyrosty prędkości dla poszczególnych stanów – będą one zdefiniowane jako stałe w pliku nagłówkowym z deklaracjami klas stanów.

class Stan;

class Silnik {
public:
	Silnik ();
	~Silnik ();
	int symuluj ();
	void zmniejszPredkosc (unsigned int deltaP);
	void zwiekszPredkosc (unsigned int deltaP);
	void zatrzymaj ();
	void ustawRuchPrawoskretny ();
	void ustawRuchLewoskretny ();
private:
	void zmienStan (Stan * nowyStan);
	
	int s_predkoscBiezaca;
	Stan * s_stan;

	friend class Stan;
};

Implementacja konstruktora i destruktora jest bardzo prosta. Ogranicza się odpowiednio do zainicjowania pierwszego stanu oraz zwolnienia pamięci obiektu stanu.

Silnik::Silnik ()
	: s_predkoscBiezaca(0)
{	
	s_stan = new Zatrzymany(this);
}
	
Silnik::~Silnik () {
	delete s_stan;
}
Adamik Łukasz, Politechnika Śląska w Gliwicach (AEiI) - 2010/11