Zaawansowane programowanie w C++ (PCP) - Wyklad 7
Transkrypt
Zaawansowane programowanie w C++ (PCP) - Wyklad 7
Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne Zaawansowane programowanie w C++ (PCP) Wykład 7 - sprytne wskaźniki. dr inż. Robert Nowak 20 kwietnia 2007 dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne Potrzeba współdzielenia kodu źródłowego Pojęcia niezależne od typu: I kolekcje (np. listy) I algorytmy (np. znajdowania największego elementu) Szablony I mechanizm czasu kompilacji I kod nie jest kompilowany, jeżeli nie został użyty dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne Problem typu Typowy problem - jawne wskazanie, że identyfikator jest typem class Foo { public: typedef int Element; /* dalsza część implementacji klasy Foo */ }; template<typename T> void f(const T& t) { //Poniżej błędnie zakłada, że T::Element to nazwa składowej T::Element e = 0; //... //Poniżej jawnie wskazano, że T::Element to nazwa typu typename T::Element e = 0; //... }; dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne boost::scoped_ptr I I I Odpowiada strategii „zdobywanie zasobów jest inicjowaniem” Destruktor usuwa wskaźnik Zabronione kopiowanie template<typename T> class scoped_ptr : noncopyable { public: explicit scoped_ptr(T* p = 0) : p_(p) {} ˜scoped_ptr(){ delete p_; } //Usuwa obiekt wskazywany T& operator*() { return *p_; } T* operator->() { return p_; } private: T* p_; //Wskaźnik, którym zarządza }; void f() { scoped_ptr<MojaKlasa> klasa(new MojaKlasa); //kod, który może wyrzucać wyjątki } //Destruktor klasy scoped_ptr wywoła operator delete dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne Wzorzec „pimpl” - ukrywanie implementacji class Foo { public: //Interfejs klasy private: //Implementacja jest ukryta struct Impl;//Deklaracja poprzedzająca scoped_ptr<Impl> pImpl_;//Sprytny wskaźnik }; I zalety I wady dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne std::auto_ptr - kopiowanie jest przekazywaniem własności I I I Odpowiada strategii „zdobywanie zasobów jest inicjowaniem” Destruktor usuwa wskaźnik Dozwolone kopiowanie (!) - przenosi ono uprawnienia template<typename T> class auto_ptr { public: explicit auto_ptr(T* p = 0) : p_(p) {} //nie jest const auto_ptr& ! auto_ptr(auto_ptr& a) p_(a.p_) { a.p_ = 0L; } auto_ptr& operator=(auto_ptr& a); //nie jest const auto_ptr& ˜auto_ptr() { delete p_; } //usuwa obiekt wskazywany T& operator*() { return *p_; } T* operator->() const { return p_; } private: T* p_; }; dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne std::auto_ptr - przykłady #include <memory> using namespace std; class Foo { /* implementacja */ }; //funkcja zwraca wskaźnik na obiekt auto_ptr<Foo> createFoo(int n) { return auto_ptr<Foo>(new Foo(n) ); } { auto_ptr<Foo> p(new Foo(1) ); /* tutaj wykorzystuje obiekt klasy */ }//automatycznie wolany destruktor createFoo(2); //nie wykorzystana wartość zwracana zostanie usunięta { auto_ptr<Foo> v = createFoo(3); /* wykorzystanie obiektu v */ }//destruktor zwalnia zasob dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne std::auto_ptr niebezpieczeństwa #include <memory> using namespace std; class Foo { /* implementacja */ }; //Niebezpieczne! użycie auto_ptr jako argumentu void read(auto_ptr<Foo> p) { /* wykorzystuje */ } { auto_ptr<Foo> x = createFoo(4); read(x); //teraz x nie wskazuje na nic! } //Niebezpieczne! użycie auto_ptr w kolekcji vector<auto_ptr<Foo> > v; dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne boost::shared_ptr - sprytny wskaźnik shared_ptr counter object I konstruktor : tworzy licznik i inicjuje go na 1 I konstruktor kopiujący: zwiększa licznik odniesień I destruktor: zmniejsza licznik odniesień, jeżeli ma on wartość 0 to kasuje obiekt dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne sprytny wskaźnik - przykład counter p1 1 object #include <boost/shared_ptr.hpp> using namespace boost; class Foo { /* implementacja */ }; counter 2 p1 { shared_ptr<Foo> p1(new Foo(1) ); { shared_ptr<Foo> p2(p1); //licznik odniesien == 2 /* ... */ } //destruktor p2, licznik = 1 } //destruktor p1 usuwa obiekt dr inż. Robert Nowak object p2 counter p1 1 object Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne sprytny wskaźnik - przykład 2 counter p1 1 object #include <boost/shared_ptr.hpp> using namespace boost; class Foo { /* implementacja */ }; counter //funkcja zwraca wskaźnik na obiekt shared_ptr<Foo> createFoo(int n) { return shared_ptr<Foo>(new Foo(n) ); } p1 2 object p2 { counter 1 shared_ptr<Foo> p2 = createFoo(2); }//destruktor zwalnia zasob object p2 dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne Sprytny wskaźnik boost::shared_ptr I zalety I wady dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne Sprytne wskaźniki - podsumowanie I std::auto_ptr I boost::shared_ptr I boost::weak_ptr I boost::intrusive_ptr dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne wstęp Zasady extreme programming podsumowanie Model wodospadowy Wodospadowy („tradycyjny”) model tworzenia oprogramowania: 1. analiza, 2. projektowanie, Koszt 3. implementacja, 4. testowanie, 5. wdrożenie, Czas 6. pielęgnacja. Wady: I duże ryzyko niepowodzenia projektu, I długi czas sprzężenia zwrotnego. Przyczyny: I wykładniczy (względem czasu) wzrost kosztów zmian w projekcie. dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne wstęp Zasady extreme programming podsumowanie Extreme programming Możliwości uzyskania innej krzywej kosztu zmian w czasie: I prostota projektu, I automatyczne testy, I nastawienie na ciągłe zmiany w projekcie, I polepszenie komunikacji. Koszt Czas Właściwości: I krótki czas sprzężenia zwrotnego, I mniejsze ryzyko niepowodzenia projektu. dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne wstęp Zasady extreme programming podsumowanie Zmniejszenie ryzyka niepowodzenia projektu I dobrze sprecyzowany cel projektu, I krótkie wersje, I planowanie krótkofalowe, I ciągła weryfikacja założeń. dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne wstęp Zasady extreme programming podsumowanie Zmniejszenie kosztów zmian I Utrzymywanie działającej wersji przez cały czas: I automatyczne testowanie: I I I I ciągła integracja. Utrzymywanie kodów źródłowych dobrej jakości I I I modułów, funkcjonalne. zmiana struktury programu bez zmiany funkcjonalności (refactoring) przegląd kodu. Poprawa komunikacji: I I kolektywne prawo do zmian kodu, stosowanie narzędzi zarządzających wersjami. dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne wstęp Zasady extreme programming podsumowanie Sterowanie projektem I koszt, I czas, I jakość, I zakres. dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Powtórzenie - szablony Sprytne wskaźniki Programowanie ekstremalne wstęp Zasady extreme programming podsumowanie Podsumowanie Zasady XP: I krótkie cykle oprogramowania, I nieustanne testowanie, I natychmiastowa integracja, I brak szczegółowego projektu, I brak szczegółowego planu. dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP)