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)

Podobne dokumenty