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



Idiom Pimpl

W języku C++ zmiana definicji dowolnego składnika klasy (w tym chronionego i prywatnego) wymusza ponowną kompilację zarówno kodu klasy, jak również klas które z niej korzystają. Może to powodować znaczne narzuty czasowe podczas kompilacji – zmiana jednego fragmentu podsystemu z którego korzysta duża cześć innych klas może być bardzo kosztowna. Zastosowanie wzorca Most pozwala na uniknięcie przedstawionego problemu.

Kolejny przykład stanowi porównanie dwóch klas klientów. Pierwsza klasa klienta (Klient1) korzysta z klasy której implementacja zawarta jest w niej bezpośrednio. Druga klasa klienta (Klient2) korzysta z kolei z klasy, która wykorzystuje wzorzec Most do dostarczenia implementacji.

Podczas implementacji przykładu należy rozpocząć od nagłówkowego pliku konfiguracji w którym umieszczony jest znacznik ZMIANA_IMPLEMENTACJI.

#define ZMIANA_IMPLEMENTACJI

Wykorzystanie takiego znacznika pozwoli na wprowadzenie/usunięcie w klasach dodatkowego interfejsu (zmiany) za pomocą prostego odkomentowania/zakomentowania ów znacznika konfiguracyjnego. Dzięki temu będzie można zaobserwować jak zmiana interfejsu klas wpływa na proces budowania pełnego projektu (w tym klas składników które korzystają z tych klas).

Kolejnym krokiem jest zbudowanie klas z których będą korzystać klienci. Pierwsza klasa z bezpośrednią implementacją przedstawia się następująco:

class Klasa {
public:
	void metoda1 () const;
	void metoda2 () const;
#ifdef ZMIANA_IMPLEMENTACJI
	void metoda3 () const;
#endif
};

Odpowiadające deklaracji definicje:

void Klasa::metoda1 () const {
	std::clog << "Klasa::metoda1()" << std::endl;
}

void Klasa::metoda2 () const {
	std::clog << "Klasa::metoda2()" << std::endl;
#ifdef ZMIANA_IMPLEMENTACJI
	metoda3 ();
#endif
}

#ifdef ZMIANA_IMPLEMENTACJI
void Klasa::metoda3 () const {
	std::clog << "Klasa::metoda3()" << std::endl;
}
#endif
Adamik Łukasz, Politechnika Śląska w Gliwicach (AEiI) - 2010/11