Pakiet programów do zdalnego nauczania Programowania Orientowanego Obiektowo
Dzisiaj jest
Poniedziałek, 16 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



Makropolecenie i polecenia puste

Przedstawiony przykład zawiera kilka ograniczeń i wad wynikających z użycia ograniczonej liczby typów poleceń.

Po pierwsze do każdego przycisku można przypisać tylko jeden obiekt polecenia co w dużej części przypadków może nie być wystarczające. Rozwiązaniem tego problemu mogłoby być definiowanie za każdym razem osobnego obiektu polecenia, w którym implementacja metody wykonaj() dokonywałaby większej ilości działań. Jest to kłopotliwe, ponieważ dla każdego nowego działania należy stwarzać osobne klasy. Co więcej elastyczne przypisywanie działań do przycisków w czasie działania programu jest w tym wypadku ograniczone.

Lepszym rozwiązaniem przedstawionego problemu jest stworzenie tzw. makropolecenia. Taki rodzaj polecenia składa się z pod-poleceń, wykonywanych kolejno na skutek zażądania przez klasę wywołującą metody wykonaj(). Odpowiednie polecenia mogą być dodawane i usuwane do makropolecenia w czasie działania programu. Co więcej makropolecenia mogą być budowane w postaci drzew o większej liczbie poziomów (makropolecenie może składać się z makropolecenia itd), co sprawia że są one również kompozytami.

Deklaracja klasy makropolecenia może być następująca:

class PolecenieMakro : public Polecenie {
public:
	PolecenieMakro (ZestawUruchomieniowy * zestaw);
	virtual ~PolecenieMakro ();
	virtual void wykonaj ();
	PolecenieMakro * dodajPolecenie(Polecenie * polecenie);
private:
	std::vector<Polecenie *> s_polecenia;
};

Klasa zawiera metodę wykonaj(), która wykonuje po kolei wszystkie pod-polecenia z listy s_polecenia. Dodatkowo klasa posiada metodę dodajPolecenie() umożliwiającą dodanie nowego pod-polecenia (również makropolecenia). Aby istniała możliwość dodawania poleceń w jednym łańcuchu typem zwracanym jest wskaźnik do egzemplarza klasy makropolecenia.

Odpowiadające deklaracji definicje:

PolecenieMakro::PolecenieMakro (ZestawUruchomieniowy * zestaw)
	: Polecenie(zestaw)
{
}
	
PolecenieMakro::~PolecenieMakro () {
	std::for_each(s_polecenia.begin(), s_polecenia.end(), ObiektFunUsun());
}

void PolecenieMakro::wykonaj () {
	std::for_each(s_polecenia.begin(), s_polecenia.end(), std::mem_fun(&Polecenie::wykonaj));
}

PolecenieMakro * PolecenieMakro::dodajPolecenie(Polecenie * polecenie) {
	if (polecenie)
		s_polecenia.push_back(polecenie);

	return this;
}

Adamik Łukasz, Politechnika Śląska w Gliwicach (AEiI) - 2010/11