Architektura aplikacji w Pythonie

Book description

Python zyskuje coraz większą popularność i jest wykorzystywany do tworzenia bardzo różnych aplikacji, jednak projektowanie dużych, niezawodnych systemów w tym języku bywa wyzwaniem. Rozwijanie złożonych systemów o wysokiej jakości wymaga zastosowania odpowiedniej architektury. Trudno w Pythonie stosować takie wysokopoziomowe wzorce projektowe jak architektura sześciokątna, architektura oparta na zdarzeniach czy wzorce zalecane dla projektowania dziedzinowego (DDD). Sytuacji nie poprawia również to, że klasyczna literatura dotycząca metod zarządzania złożonością aplikacji zawiera przykłady kodu napisanego w Javie lub C#. Programiści Pythona często więc uznają takie książki za mało przydatne w swojej pracy.

Table of contents

  1. Wstęp
    1. Zarządzanie złożonością i rozwiązywanie problemów biznesowych
    2. Dlaczego Python
    3. TDD, DDD i architektura sterowana zdarzeniami
    4. Dla kogo jest ta książka
    5. Zwięzłe podsumowanie tego, czego się nauczysz
      1. Część I. Budowa architektury wspierającej modelowanie dziedziny
      2. Część II. Architektura zdarzeniowa
      3. Dodatkowe materiały
    6. Przykłady kodu i praktyka
    7. Konwencje typograficzne
    8. Podziękowania
  2. Wprowadzenie
    1. Dlaczego projekty czasami się nie udają
    2. Hermetyzacja i abstrakcje
    3. Warstwy
    4. Zasada odwrócenia zależności
    5. Miejsce dla naszej logiki biznesowej — model domeny
  3. Część I. Budowa architektury wspierającej modelowanie domeny
  4. Rozdział 1. Modelowanie domeny
    1. Czym jest model domeny
    2. Język domeny
    3. Testy jednostkowe modeli domeny
      1. Klasy danych są idealne dla obiektów wartości
      2. Obiekty wartości a jednostki
    4. Nie wszystko musi być obiektem — funkcja usługi domeny
      1. Magiczne metody Pythona umożliwiają posługiwanie się modelami w standardowy sposób
      2. Wyjątki także mogą wyrażać koncepcje domeny
  5. Rozdział 2. Wzorzec Repozytorium
    1. Zapisywanie modelu domeny
    2. Trochę pseudokodu — czego będziemy potrzebować?
    3. Zastosowanie zasady odwrócenia zależności do dostępu do danych
    4. Przypomnienie — nasz model
      1. „Normalny” sposób — model zależy od ORM
      2. Odwrócenie zależności — ORM zależy od modelu
    5. Wprowadzenie do wzorca Repozytorium
      1. Abstrakcja repozytorium
      2. Gdzie tkwi haczyk
    6. Budowa imitacji repozytorium na potrzeby testów nie jest łatwa
    7. Czym są porty i adaptery w Pythonie
    8. Podsumowanie
  6. Rozdział 3. Interludium na temat powiązań i abstrakcji
    1. Abstrakcja stanu wspomaga testowanie
    2. Wybór właściwych abstrakcji
    3. Implementacja wybranych abstrakcji
      1. Testowanie od brzegu do brzegu z imitacjami i wstrzykiwaniem zależności
      2. Czemu by nie użyć biblioteki łatek?
    4. Podsumowanie
  7. Rozdział 4. Pierwszy przypadek użycia — API Flask i warstwa usług
    1. Łączenie naszej aplikacji z prawdziwym światem
    2. Pierwszy test kompleksowy
    3. Prosta implementacja
    4. Błędy wymagające sprawdzenia bazy danych
    5. Wprowadzenie warstwy usług i testowanie jej za pomocą FakeRepository
      1. Typowa funkcja usługowa
    6. Dlaczego wszystko nazywa się usługą
    7. Rozmieszczenie plików w folderach, aby uzyskać przejrzysty obraz struktury
    8. Podsumowanie
      1. Zasada odwrócenia zależności w praktyce
  8. Rozdział 5. TDD na wysokich i niskich obrotach
    1. Jak wygląda nasza piramida testów?
    2. Czy przenieść testy warstwy domeny do warstwy usługowej?
    3. Wybór rodzaju testów do napisania
    4. Wysokie i niskie obroty
    5. Całkowite oddzielenie testów warstwy usługowej od domeny
      1. Rozwiązanie — przeniesienie wszystkich zależności domeny do konfiguracji testów
      2. Dodawanie brakującej usługi
    6. Ulepszanie testów kompleksowych
    7. Podsumowanie
  9. Rozdział 6. Wzorzec Jednostka Pracy
    1. Jednostka pracy współpracuje z repozytorium
    2. Testy integracyjne jednostki pracy
    3. Jednostka pracy i jej menedżer kontekstu
      1. Prawdziwa jednostka pracy używa sesji SQLAlchemy
      2. Imitacja jednostki pracy do testów
    4. Używanie jednostki pracy w warstwie usługowej
    5. Testy zatwierdzania i wycofywania zmian
    6. Zatwierdzenia jawne i niejawne
    7. Przykłady — użycie jednostki pracy do grupowania operacji w jednostkę atomową
      1. Przykład 1. Realokacja
      2. Przykład 2. Zmiana liczebności partii
    8. Porządkowanie testów integracyjnych
    9. Podsumowanie
  10. Rozdział 7.
  11. Agregaty i granice spójności
    1. Czemu nie wykonać wszystkiego w arkuszu kalkulacyjnym?
    2. Niezmienniki, ograniczenia i spójność
      1. Niezmienniki, współbieżność i blokady
    3. Czym jest agregat
    4. Wybór agregatu
    5. Jeden agregat = jedno repozytorium
    6. Kwestia wydajności
    7. Optymistyczna współbieżność a numery wersji
    8. Opcje implementacji numerów wersji
    9. Sprawdzanie zgodności z regułami integralności danych
      1. Wymuszanie przestrzegania zasad dotyczących współbieżności za pomocą poziomów izolacji bazy danych
      2. Przykład pesymistycznej kontroli współbieżności — SELECT FOR UPDATE
    10. Podsumowanie
    11. Część I — podsumowanie
  12. Część II. Architektura sterowana zdarzeniami
  13. Rozdział 8. Zdarzenia i szyna wiadomości
    1. Jak nie narobić bałaganu
      1. Pilnujmy porządku w kontrolerach sieciowych
      2. Dbajmy też o porządek w modelu
      3. To może warstwa usługowa
    2. Zasada pojedynczej odpowiedzialności
    3. Wielkie wejście szyny wiadomości
      1. Model rejestruje zdarzenia
      2. Zdarzenia to proste klasy danych
      3. Model zgłasza zdarzenia
      4. Szyna wiadomości wiąże zdarzenia z procedurami obsługi
    4. Opcja 1. Warstwa usługowa odbiera zdarzenia z modelu i umieszcza je w szynie wiadomości
    5. Opcja 2. Warstwa usług sama zgłasza zdarzenia
    6. Opcja 3. Jednostka pracy publikuje zdarzenia w szynie wiadomości
    7. Podsumowanie
  14. Rozdział 9. Szyna wiadomości w pełnej krasie
    1. Nowy wymóg prowadzi do opracowania nowej architektury
      1. Zmiana architektury — wszystko będzie procedurą obsługi zdarzeń
    2. Zamiana funkcji usługowych na procedury obsługi wiadomości
      1. Teraz szyna wiadomości odbiera zdarzenia od jednostki pracy
      2. Wszystkie testy także napiszemy pod kątem zdarzeń
      3. Tymczasowa brzydka sztuczka — szyna wiadomości musi zwracać wyniki
      4. Modyfikacja API, aby działał ze zdarzeniami
    3. Implementacja nowego wymogu
      1. Nasze nowe zdarzenie
    4. Próba nowej procedury obsługi
      1. Implementacja
      2. Nowa metoda modelu domeny
    5. Opcja — testy jednostkowe procedur obsługi zdarzeń w izolacji przy użyciu imitacji szyny wiadomości
    6. Podsumowanie
      1. Co osiągnęliśmy
      2. Po co to wszystko
  15. Rozdział 10. Polecenia i procedury obsługi poleceń
    1. Polecenia i zdarzenia
    2. Różnice w zakresie obsługi wyjątków
    3. Zdarzenia, polecenia i obsługa błędów
    4. Synchroniczne wychodzenie z błędów
    5. Podsumowanie
  16. Rozdział 11. Architektura oparta na zdarzeniach — integracja mikrousług za pomocą zdarzeń
    1. Rozproszona kula błota i myślenie rzeczownikami
    2. Obsługa błędów w systemach rozproszonych
    3. Alternatywa — rozprzężenie pod względem czasowym przy użyciu wiadomości asynchronicznych
    4. Użycie kanału publikacji-subskrypcji Redis do integracji
    5. Test kompleksowy, który to wszystko sprawdzi
      1. Redis to kolejny cienki adapter wokół naszej szyny wiadomości
      2. Nowe zdarzenie wyjściowe
    6. Zdarzenia wewnętrzne i zewnętrzne
    7. Podsumowanie
  17. Rozdział 12. Wzorzec podziału odpowiedzialności między polecenia i zapytania (CQRS)
    1. Modele domeny służą do zapisu
    2. Większość klientów nie kupi waszych mebli
    3. Post-Redirect-Get i CQS
    4. Trzymajcie się mocno
    5. Testowanie widoków CQRS
    6. Opcja „oczywista” — użycie istniejącego repozytorium
    7. Twój model domeny nie jest zoptymalizowany pod kątem operacji odczytu
    8. Oczywista opcja 2 — użycie ORM
    9. SELECT N+1 i inne sprawy związane z wydajnością
    10. Czas całkiem obniżyć loty
      1. Aktualizacja tabeli modelu odczytu za pomocą procedury obsługi zdarzeń
    11. Zmiana implementacji modelu odczytu jest łatwa
    12. Podsumowanie
  18. Rozdział 13. Wstrzykiwanie zależności (i bootstrapping)
    1. Zależności jawne i niejawne
    2. Czy jawne zależności nie są dziwne i nie pachną Javą?
    3. Przygotowywanie procedur obsługi — ręczne wstrzykiwanie zależności przy użyciu domknięć i funkcji częściowych
    4. Alternatywa z użyciem klas
    5. Skrypt rozruchowy
    6. Przekazywanie procedur obsługowych do szyny wiadomości w czasie działania programu
    7. Użycie funkcji rozruchowej w punktach wejścia
    8. Inicjalizacja DI w testach
    9. Prawidłowe tworzenie adaptera — działający przykład
      1. Definicja implementacji abstrakcyjnej i konkretnej
      2. Utworzenie fałszywej wersji dla testów
      3. Prawdziwy test integracyjny
    10. Podsumowanie
  19. Epilog
    1. Co teraz?
    2. Jak dojść do celu?
    3. Separacja poplątanych elementów odpowiedzialności
    4. Identyfikacja agregatów i ograniczonych kontekstów
    5. Podejście zdarzeniowe do przejścia na mikrousługi za pomocą wzorca Figa Dusiciel
    6. Jak przekonać decydentów, aby spróbowali czegoś nowego
    7. Pytania naszych redaktorów, do których nie odnieśliśmy się w treści rozdziałów
    8. Strzały w stopę
    9. Co jeszcze warto przeczytać
    10. Podsumowanie
  20. Dodatek A. Podsumowanie — schemat i tabela
  21. Dodatek B. Szablon struktury projektu
    1. Zmienne środowiskowe 12-factor i konfiguracja — wewnątrz i na zewnątrz kontenerów
    2. Config.py
    3. Konfiguracja docker-compose i kontenerów
    4. Instalacja źródła jako pakietu
    5. Dockerfile
    6. Testy
    7. Podsumowanie
  22. Dodatek C. Wymiana infrastruktury — wszystko za pomocą CSV
    1. Implementacja repozytorium i jednostki pracy dla CSV
  23. Dodatek D. Repozytorium i Jednostka Pracy w Django
    1. Wzorzec Repozytorium w Django
      1. Własne metody w klasach ORM Django do translacji na model domeny i odwrotnie
    2. Wzorzec Jednostka Pracy w Django
    3. API — widoki Django są adapterami
    4. Dlaczego to było takie trudne
    5. Co zrobić, jeśli już korzystasz z Django
    6. Przygotowanie na wszelki wypadek
  24. Dodatek E. Walidacja
    1. Czym w ogóle jest walidacja
    2. Składnia walidacji
    3. Prawo Postela i wzorzec Tolerancyjny Czytnik
    4. Walidacja na krawędzi
    5. Walidacja semantyki
    6. Pragmatyka walidacji
    7. O autorach
    8. Kolofon

Product information

  • Title: Architektura aplikacji w Pythonie
  • Author(s): Bob Gregory Harry Percival
  • Release date: December 2020
  • Publisher(s): Helion
  • ISBN: 9788328371262