Agile. Programowanie zwinne. Zasady, wzorce i praktyki zwinnego wytwarzania oprogramowania w C#

Poznaj nowoczesną metodykę wytwarzania oprogramowania w C# Jak stosować w praktyce zasady zwinnego wytwarzania oprogramo

661 67 44MB

Polish Pages [420] Year 2008

Report DMCA / Copyright

DOWNLOAD FILE

Agile. Programowanie zwinne. Zasady, wzorce i praktyki zwinnego wytwarzania oprogramowania w C#

Table of contents :
Słowo wstępne
Słowo wstępne
Zaczerpnięte z książki Agile Software Development: Principles, Patterns and Practices
Przedmowa
Wstęp Boba
Wstęp Micaha
O książce
Odrobina historii
Znajomość z Boochem
Wpływ metodyki programowania ekstremalnego
Znajomość z Beckiem
.NET
Diabeł tkwi w szczegółach
Organizacja
Jak należy czytać tę książkę
Podziękowania
O autorach
Część I. Wytwarzanie zwinne
1. Praktyki programowania zwinnego
Agile Alliance
Programiści i ich harmonijna współpraca jest ważniejsza od procesów i narzędzi
Działające oprogramowanie jest ważniejsze od wyczerpującej dokumentacji
Faktyczna współpraca z klientem jest ważniejsza od negocjacji zasad kontraktu
Reagowanie na zmiany jest ważniejsze od konsekwentnego realizowania planu
Podstawowe zasady
Konkluzja
Bibliografia
2. Przegląd technik programowania ekstremalnego
Praktyki programowania ekstremalnego
Cały zespół
Opowieści użytkownika
Krótkie cykle
Plan iteracji
Plan wydania
Testy akceptacyjne
Programowanie w parach
Wytwarzanie sterowane testami (TDD)
Wspólna własność
Ciągła integracja
Równe tempo
Otwarta przestrzeń pracy
Gra planistyczna
Prosty projekt
Refaktoryzacja
Metafora
Konkluzja
Bibliografia
3. Planowanie
Wstępne poznawanie wymagań
Dzielenie i scalanie opowieści użytkownika
Planowanie wydań
Planowanie iteracji
Definiowanie warunków zakończenia projektu
Planowanie zadań
Iteracje
Śledzenie postępu
Konkluzja
Bibliografia
4. Testowanie
Wytwarzanie sterowane testami
Przykład projektu poprzedzonego testami
Izolacja testów
Eliminowanie powiązań
Testy akceptacyjne
Wpływ testów akceptacyjnych na architekturę oprogramowania
Konkluzja
Bibliografia
5. Refaktoryzacja
Prosty przykład refaktoryzacji generowanie liczb pierwszych
Testy jednostkowe
Refaktoryzacja
Ostatnie udoskonalenia
Konkluzja
Bibliografia
6. Epizod z życia programistów
Gra w kręgle
Konkluzja
Przegląd reguł gry w kręgle
Część II. Projektowanie zwinne
7. Czym jest projektowanie zwinne?
Symptomy złego projektu
Symptomy złego projektu, czyli potencjalne źródła porażek
Sztywność
Wrażliwość
Nieelastyczność
Niedostosowanie do rzeczywistości
Nadmierna złożoność
Niepotrzebne powtórzenia
Nieprzejrzystość
Dlaczego oprogramowanie ulega degradacji
Program Copy
Przykład typowego scenariusza
Projekt początkowy
Zmieniające się wymagania
Kolejne wymaganie
Oczekujmy zmian
Przykład budowy programu Copy w ramach projektu zwinnego
Stosowanie praktyk programowania zwinnego
Utrzymywanie projektu w możliwie dobrym stanie
Konkluzja
Bibliografia
8. Zasada pojedynczej odpowiedzialności
Definiowanie odpowiedzialności
Oddzielanie wzajemnie powiązanych odpowiedzialności
Trwałość
Konkluzja
Bibliografia
9. Zasada otwarte-zamknięte
Omówienie zasady otwarte-zamknięte
Aplikacja Shape
Przykład naruszenia zasady OCP
Przykład pełnej zgodności z zasadą otwarte-zamknięte
Przewidywanie zmian i naturalna struktura
Przygotowywanie punktów zaczepienia
Gdy raz mnie oszukasz
Stymulowanie zmian
Stosowanie abstrakcji do jawnego zamykania oprogramowania dla zmian
Zapewnianie zamknięcia z wykorzystaniem techniki sterowania przez dane
Konkluzja
Bibliografia
10. Zasada podstawiania Liskov
Naruszenia zasady podstawiania Liskov
Prosty przykład
Przykład mniej jaskrawego naruszenia zasady LSP
Realny problem
Poprawność nie jest cechą wrodzoną
Relacja IS-A reprezentuje zachowania
Projektowanie przez kontrakt
Definiowanie kontraktów w formie testów jednostkowych
Przykład zaczerpnięty z rzeczywistości
Motywacja
Problem
Rozwiązanie niezgodne z zasadą podstawiania Liskov
Rozwiązanie zgodne z zasadą podstawiania Liskov
Wyodrębnianie zamiast dziedziczenia
Heurystyki i konwencje
Konkluzja
Bibliografia
11. Zasada odwracania zależności
Podział na warstwy
Odwracanie relacji własności
Zależność od abstrakcji
Prosty przykład praktycznego znaczenia zasady DIP
Odkrywanie niezbędnych abstrakcji
Przykład aplikacji Furnace
Konkluzja
Bibliografia
12. Zasada segregacji interfejsów
Zanieczyszczanie interfejsów
Odrębne klasy klienckie oznaczają odrębne interfejsy
Interfejsy klas kontra interfejsy obiektów
Separacja przez delegację
Separacja przez wielokrotne dziedziczenie
Przykład interfejsu użytkownika bankomatu
Konkluzja
Bibliografia
13. Przegląd języka UML dla programistów C#
Diagramy klas
Diagramy obiektów
Diagramy sekwencji
Diagramy współpracy
Diagramy stanów
Konkluzja
Bibliografia
14. Praca z diagramami
Po co modelować oprogramowanie?
Po co budować modele oprogramowania?
Czy powinniśmy pracować nad rozbudowanymi projektami przed przystąpieniem do kodowania?
Efektywne korzystanie z diagramów języka UML
Komunikacja z innymi programistami
Mapy drogowe
Dokumentacja wewnętrzna
Co powinniśmy zachowywać, a co można wyrzucać do kosza?
Iteracyjne udoskonalanie
Najpierw zachowania
Weryfikacja struktury
Wyobrażenie o kodzie
Ewolucja diagramów
Kiedy i jak rysować diagramy
Kiedy przystępować do tworzenia diagramów, a kiedy rezygnować z dalszego rysowania ich
Narzędzia CASE
A co z dokumentacją?
Konkluzja
15. Diagramy stanów
Wprowadzenie
Zdarzenia specjalne
Superstany
Pseudostan początkowy i końcowy
Stosowanie diagramów skończonych maszyn stanów
Konkluzja
16. Diagramy obiektów
Migawka
Obiekty aktywne
Konkluzja
17. Przypadki użycia
Pisanie przypadków użycia
Przebiegi alternatywne
Co jeszcze?
Prezentowanie przypadków użycia na diagramach
Konkluzja
Bibliografia
18. Diagramy sekwencji
Wprowadzenie
Obiekty, linie życia, komunikaty i inne konstrukcje
Tworzenie i niszczenie obiektów
Proste pętle
Przypadki i scenariusze
Pojęcia zaawansowane
Pętle i warunki
Komunikaty, których przesyłanie wymaga czasu
Komunikaty asynchroniczne
Wiele wątków
Obiekty aktywne
Wysyłanie komunikatów do interfejsów
Konkluzja
19. Diagramy klas
Wprowadzenie
Klasy
Asocjacje
Relacje dziedziczenia
Przykładowy diagram klas
Omówienie szczegółowe
Stereotypy klas
interface
utility
Klasy abstrakcyjne
Właściwości
Agregacja
Kompozycja
Liczność
Stereotypy asocjacji
Klasy zagnieżdżone
Klasy asocjacji
Kwalifikatory asocjacji
Konkluzja
Bibliografia
20. Heurystyki i kawa
Ekspres do kawy Mark IV Special
Specyfikacja
Popularne, ale niewłaściwe rozwiązanie
Brakujące metody
Klasy ulotne
Nieprzemyślana abstrakcja
Boskie klasy
Poprawione rozwiązanie
Interfejs użytkownika ekspresu do kawy
Przypadek użycia nr 1 użytkownik naciska przycisk uruchamiający parzenie
Przypadek użycia nr 2 niegotowe naczynie na kawę
Przypadek użycia nr 3 zakończony proces parzenia kawy
Przypadek użycia nr 4 zużycie całej kawy
Implementacja modelu abstrakcyjnego
Przypadek użycia nr 1 użytkownik naciska przycisk Brew
Implementacja funkcji IsReady
Implementacja funkcji Start
Wywołanie funkcji M4UserInterface.CheckButton
Dokończenie projektu oprogramowania ekspresu do kawy
Zalety projektu w tej formie
Źródła tego projektu
Implementacja projektu obiektowego
Bibliografia
Część III. Studium przypadku listy płac
Uproszczona specyfikacja systemu listy płac
Ćwiczenie
Przypadek użycia nr 1 dodanie danych nowego pracownika
Alternatywa błąd w strukturze transakcji
Przypadek użycia nr 2 usunięcie danych pracownika
Alternatywa nieprawidłowy lub nieznany identyfikator EmpID
Przypadek użycia nr 3 wysłanie karty czasu pracy
Alternatywa nr 1 wskazany pracownik nie jest rozliczany za godziny pracy
Alternatywa nr 2 wystąpił błąd w strukturze danej transakcji
Przypadek użycia nr 4 wysłanie raportu o sprzedaży
Alternatywa nr 1 wskazany pracownik nie jest wynagradzany w systemie prowizyjnym
Alternatywa nr 2 wystąpił błąd w strukturze danej transakcji
Przypadek użycia nr 5 wysłanie informacji o opłacie na rzecz związku zawodowego
Alternatywa błędny format transakcji
Przypadek użycia nr 6 zmiana szczegółowych danych pracownika
Alternatywa błędny format transakcji
Przypadek użycia nr 7 wygenerowanie listy płatności na dany dzień
21. Wzorce projektowe Command i Active Object uniwersalność i wielozadaniowość
Proste polecenia
Transakcje
Fizyczny podział kodu
Czasowy podział kodu
Metoda Undo
Wzorzec projektowy Active Object
Konkluzja
Bibliografia
22. Wzorce projektowe Template Method i Strategy dziedziczenie kontra delegacja
Wzorzec projektowy Template Method
Błędne zastosowanie wzorca Template Method
Sortowanie bąbelkowe
Wzorzec projektowy Strategy
Konkluzja
Bibliografia
23. Wzorce projektowe Facade i Mediator
Wzorzec projektowy Facade
Wzorzec projektowy Mediator
Konkluzja
Bibliografia
24. Wzorce projektowe Singleton i Monostate
Wzorzec projektowy Singleton
Zalety
Wady
Wzorzec Singleton w praktyce
Wzorzec projektowy Monostate
Zalety
Wady
Wzorzec Monostate w praktyce
Konkluzja
Bibliografia
25. Wzorzec projektowy Null Object
Omówienie
Konkluzja
Bibliografia
26. Przypadek użycia listy płac pierwsza iteracja
Uproszczona specyfikacja
Analiza przez omówienie przypadku użycia
Dodanie danych nowego pracownika
Usunięcie danych pracownika
Wysłanie karty czasu pracy
Wysłanie raportu o sprzedaży
Wysłanie informacji o opłacie na rzecz związku zawodowego
Zmiana szczegółowych danych pracownika
Wygenerowanie listy płac na dany dzień
Refleksja identyfikacja abstrakcji
Wynagrodzenia wypłacane pracownikom
Harmonogram wypłat
Formy wypłat
Przynależność związkowa
Konkluzja
Bibliografia
27. Przypadek użycia listy płac implementacja
Transakcje
Dodawanie danych pracowników
Baza danych systemu płacowego
Dodawanie danych pracowników z wykorzystaniem wzorca Template Method
Usuwanie danych pracowników
Karty czasu pracy, raporty o sprzedaży i składki na związki zawodowe
Zmiana danych pracowników
Zmiana formy wynagradzania pracownika
Co ja najlepszego zrobiłem?
Wynagradzanie pracowników
Decyzje projektowe i biznesowe
Wynagradzanie pracowników etatowych
Wynagradzanie pracowników zatrudnionych w systemie godzinowym
Okresy rozliczeniowe problem projektowy
Program główny
Baza danych
Konkluzja
O tym rozdziale
Bibliografia
Część IV. Pakowanie systemu płacowego
28. Zasady projektowania pakietów i komponentów
Pakiety i komponenty
Zasady spójności komponentów ziarnistość
Zasada równoważności wielokrotnego użycia i wydawania (REP)
Zasada zbiorowego wielokrotnego stosowania (CRP)
Zasada zbiorowego zamykania (CCP)
Podsumowanie problemu spójności komponentów
Zasady spójności komponentów stabilność
Zasada acyklicznych zależności (ADP)
Cotygodniowe kompilacje
Eliminacja cykli zależności
Skutki występowania cyklu w grafie zależności pomiędzy komponentami
Przerywanie cykli
Projektowanie zstępujące kontra projektowanie wstępujące
Zasada stabilnych zależności (SDP)
Stabilność
Miary stabilności
Zmienna stabilność komponentów
Wysokopoziomowy układ komponentów
Zasada stabilnych abstrakcji (SAP)
Mierzenie abstrakcji
Ciąg główny
Odległość od ciągu głównego
Konkluzja
29. Wzorzec projektowy Factory
Problem zależności
Statyczna kontra dynamiczna kontrola typów
Fabryki wymienne
Wykorzystywanie fabryk do celów testowych
Znaczenie fabryk
Konkluzja
Bibliografia
30. Studium przypadku systemu płacowego analiza podziału na pakiety
Notacja i struktura komponentów
Stosowanie zasady zbiorowego zamykania (CCP)
Stosowanie zasady równoważności wielokrotnego użycia i wydawania (REP)
Wiązanie komponentów i hermetyzacja
Mierniki
Stosowanie mierników dla aplikacji płacowej
Fabryki obiektów
Fabryka obiektów dla komponentu TransactionImplementation
Inicjalizacja fabryk
Przebudowa granic spójności
Ostateczna struktura pakietów
Konkluzja
Bibliografia
31. Wzorzec projektowy Composite
Polecenia kompozytowe
Liczność albo brak liczności
Konkluzja
32. Wzorzec projektowy Observer ewolucja kodu w kierunku wzorca
Zegar cyfrowy
Wzorzec projektowy Observer
Modele
Zarządzanie zasadami projektowania obiektowego
Konkluzja
Bibliografia
33. Wzorce projektowe Abstract Server, Adapter i Bridge
Wzorzec projektowy Abstract Server
Wzorzec projektowy Adapter
Forma klasowa wzorca Adapter
Problem modemu adaptery i zasada LSP
Pierwsze, niedoskonałe rozwiązanie
Zagmatwana sieć zależności
Wzorzec projektowy Adapter w roli koła ratunkowego
Wzorzec projektowy Bridge
Konkluzja
Bibliografia
34. Wzorce projektowe Proxy i Gateway zarządzanie cudzymi interfejsami API
Wzorzec projektowy Proxy
Implementacja wzorca Proxy
Podsumowanie
Bazy danych, oprogramowanie pośredniczące i inne gotowe interfejsy
Wzorzec projektowy Table Data Gateway
Testowanie konstrukcji TDG w pamięci
Test bram DB
Stosowanie pozostałych wzorców projektowych łącznie z bazami danych
Konkluzja
Bibliografia
35. Wzorzec projektowy Visitor
Wzorzec projektowy Visitor
Wzorzec projektowy Acyclic Visitor
Zastosowania wzorca Visitor
Generowanie raportów
Inne zastosowania
Wzorzec projektowy Decorator
Wzorzec projektowy Extension Object
Konkluzja
Bibliografia
36. Wzorzec projektowy State
Zagnieżdżone wyrażenia switch-case
Wewnętrzny zasięg zmiennej stanu
Testowanie akcji
Zalety i wady
Tabele przejść
Interpretacja tabeli przejść
Zalety i wady
Wzorzec projektowy State
Wzorzec State kontra wzorzec Strategy
Zalety i wady
Kompilator maszyny stanów (SMC)
Plik Turnstile.cs wygenerowany przez kompilator SMC i pozostałe pliki pomocnicze
Zalety i wady
Zastosowania skończonej maszyny stanów
Wysokopoziomowa polityka działania graficznych interfejsów użytkownika (GUI)
Sterowanie interakcją z interfejsem GUI
Przetwarzanie rozproszone
Konkluzja
Bibliografia
37. Studium przypadku systemu płacowego baza danych
Budowa bazy danych
Słaby punkt dotychczasowego projektu
Dodawanie danych nowych pracowników
Transakcje
Odczytywanie danych o pracownikach
Co jeszcze zostało do zrobienia?
38. Interfejs użytkownika systemu płacowego wzorzec Model View Presenter
Interfejs
Implementacja
Budowa okna
Okno główne systemu płacowego
Pierwsza odsłona
Konkluzja
Bibliografia
Dodatek A. Satyra na dwa przedsiębiorstwa
Rufus Inc. Project Kickoff
Rupert Industries Project Alpha
Dodatek B. Czym jest oprogramowanie?
Posłowie

Polecaj historie