E-book details

Czysty kod w Pythonie. Twórz wydajny i łatwy w utrzymaniu kod. Wydanie II

Czysty kod w Pythonie. Twórz wydajny i łatwy w utrzymaniu kod. Wydanie II

Mariano Anaya

Ebook

Popularność Pythona, ulubionego języka programistów i naukowców, stale rośnie. Jest on bowiem łatwy do nauczenia się: nawet początkujący programista może napisać działający kod. W efekcie, mimo że Python pozwala na pisanie kodu przejrzystego i prostego w konserwacji, zdarzają się przypadki kodu źle zorganizowanego, nieczytelnego i praktycznie nietestowalnego. Jedną z przyczyn tego stanu rzeczy jest tendencja niektórych programistów do pisania kodu bez czytelnej struktury. Zidentyfikowanie takich problemów i ich rozwiązywanie nie jest łatwym zadaniem.

Dzięki tej książce nauczysz się korzystać z kilku narzędzi służących do zarządzania projektami napisanymi w Pythonie. Dowiesz się, czym się charakteryzuje czysty kod i jakie techniki umożliwiają tworzenie czytelnego i wydajnego kodu. Przekonasz się, że do tego celu wystarczą standardowa biblioteka Pythona i zestaw najlepszych praktyk programistycznych. Opisano tu szczegóły programowania obiektowego w Pythonie wraz z zastosowaniem deskryptorów i generatorów. Zaprezentowano również zasady testowania oprogramowania i sposoby rozwiązywania problemów poprzez implementację wzorców projektowych w kodzie. Pokazano też, jak można podzielić monolityczną aplikację na mikrousługi, by otrzymać solidną architekturę aplikacji.

W książce między innymi:

  • konfiguracja wydajnego środowiska programistycznego
  • tworzenie zaawansowanych projektów obiektowych
  • techniki eliminacji zdublowanego kodu i tworzenie rozbudowanych abstrakcji
  • zastosowanie dekoratorów i deskryptorów
  • skuteczna refaktoryzacja kodu
  • budowa solidnej architektury opartej na czystym kodzie Pythona

Czysty kod w Pythonie. Tylko taki warto pisać!

  • O autorze
  • O recenzencie
  • Przedmowa
    • Dla kogo jest ta książka?
    • Co zawiera ta książka?
    • Jak najlepiej wykorzystać tę książkę?
    • Pobieranie plików z przykładowym kodem
    • Stosowane konwencje
  • 1. Wprowadzenie, formatowanie kodu i narzędzia
    • Wprowadzenie
      • Znaczenie terminu czysty kod
      • Znaczenie posiadania czystego kodu
      • Kilka wyjątków
    • Formatowanie kodu
      • Przestrzeganie przewodnika stylu kodowania w projekcie
    • Dokumentacja
      • Komentarze do kodu
      • Docstringi
      • Adnotacje
      • Czy adnotacje zastępują docstringi?
    • Narzędzia
      • Sprawdzanie spójności typów
      • Ogólne sprawdzanie poprawności w kodzie
      • Formatowanie automatyczne
      • Konfiguracja automatycznych kontroli
    • Podsumowanie
    • Materiały referencyjne
  • 2. Kod pythoniczny
    • Indeksy i wycinki
      • Tworzenie własnych sekwencji
    • Menedżery kontekstu
      • Implementacja menedżerów kontekstu
    • Wyrażenia składane i wyrażenia przypisania
    • Właściwości, atrybuty i różne typy metod obiektów
      • Znaki podkreślenia w Pythonie
      • Właściwości
      • Tworzenie klas o bardziej zwartej składni
      • Obiekty iterowalne
        • Tworzenie obiektów iterowalnych
        • Tworzenie sekwencji
      • Obiekty kontenerowe
      • Dynamiczne atrybuty obiektów
      • Obiekty wywoływalne
      • Podsumowanie metod magicznych
    • Haczyki Pythona
      • Mutowalne argumenty domyślne
      • Rozszerzanie typów wbudowanych
    • Krótkie wprowadzenie do kodu asynchronicznego
    • Podsumowanie
    • Materiały referencyjne
  • 3. Ogólne cechy dobrego kodu
    • Projektowanie według kontraktu
      • Warunki wstępne
      • Warunki końcowe
      • Kontrakty pythoniczne
      • Projektowanie według kontraktu wnioski
    • Programowanie defensywne
      • Obsługa błędów
        • Podstawianie wartości
        • Obsługa wyjątków
          • Obsługa wyjątków na odpowiednim poziomie abstrakcji
          • Nie ujawniaj śladów stosu użytkownikom końcowym
          • Unikaj pustych bloków except
          • Dołącz oryginalny wyjątek
      • Używanie asercji w Pythonie
    • Podział obowiązków
      • Spójność i sprzężenie
    • Akronimy
      • DRY/OAOO
      • YAGNI
      • KIS
      • EAFP/LBYL
    • Dziedziczenie w Pythonie
      • Kiedy zastosowanie dziedziczenia jest dobrą decyzją?
      • Antywzorce dziedziczenia
      • Wielokrotne dziedziczenie w Pythonie
        • Kolejność rozwiązywania metod (MRO)
        • Domieszki
    • Argumenty funkcji i metod
      • Jak działają argumenty funkcji w Pythonie?
        • Jak argumenty są kopiowane do funkcji?
        • Zmienna liczba argumentów
        • Argumenty wyłącznie pozycyjne
        • Argumenty wyłącznie kluczowe
      • Liczba argumentów w funkcjach
        • Argumenty funkcji a sprzężenia
        • Sygnatury kompaktowych funkcji, które przyjmują zbyt wiele argumentów
    • Uwagi końcowe dotyczące dobrych praktyk projektowania oprogramowania
      • Ortogonalność w oprogramowaniu
      • Strukturyzacja kodu
    • Podsumowanie
    • Materiały referencyjne
  • 4. Zasady SOLID
    • Zasada pojedynczej odpowiedzialności
      • Klasa mająca zbyt wiele obowiązków
      • Podział obowiązków
    • Zasada otwarty-zamknięty
      • Przykład zagrożeń dla utrzymania kodu w przypadku nieprzestrzegania zasady OCP
      • Refaktoryzacja systemu obsługi zdarzeń w celu uzyskania rozszerzalności
      • Rozbudowa systemu zdarzeń
      • Końcowe przemyślenia na temat OCP
    • Zasada podstawiania Liskov
      • Wykrywanie problemów dotyczących zasady LSP za pomocą narzędzi
        • Wykorzystanie narzędzia mypy do wykrywania nieprawidłowych sygnatur metod
        • Wykrywanie niezgodnych sygnatur za pomocą programu pylint
      • Bardziej subtelne przypadki naruszeń zasady LSP
      • Uwagi na temat LSP
    • Segregacja interfejsów
      • Interfejs, który dostarcza zbyt wiele
      • Im mniejszy interfejs, tym lepiej
      • Jak mały powinien być interfejs?
    • Odwracanie zależności
      • Przypadek sztywnych zależności
      • Odwracanie zależności
      • Wstrzykiwanie zależności
    • Podsumowanie
    • Bibliografia
  • 5. Korzystanie z dekoratorów do usprawniania kodu
    • Czym są dekoratory w Pythonie?
      • Dekoratory funkcji
      • Dekoratory klas
      • Inne rodzaje dekoratorów
    • Bardziej zaawansowane dekoratory
      • Przekazywanie argumentów do dekoratorów
        • Dekoratory z zagnieżdżonymi funkcjami
        • Obiekty dekoratory
      • Dekoratory z wartościami domyślnymi
      • Dekoratory dla podprogramów
      • Rozszerzona składnia dekoratorów
    • Dobre zastosowania dla dekoratorów
      • Dostosowywanie sygnatur funkcji
      • Walidacja parametrów
      • Śledzenie kodu
    • Skuteczne dekoratory unikanie typowych błędów
      • Zachowywanie danych o oryginalnym opakowanym obiekcie
      • Obsługa skutków ubocznych w dekoratorach
        • Nieprawidłowa obsługa skutków ubocznych w dekoratorze
        • Dekoratory z pożądanymi skutkami ubocznymi
      • Tworzenie dekoratorów, które będą działać dla każdego rodzaju obiektów
    • Dekoratory a czysty kod
      • Kompozycja zamiast dziedziczenia
      • Zasada DRY z wykorzystaniem dekoratorów
      • Dekoratory a podział odpowiedzialności
      • Analiza dobrych dekoratorów
    • Podsumowanie
    • Bibliografia
  • 6. Pełniejsze wykorzystywanie obiektów dzięki deskryptorom
    • Pierwsze spojrzenie na deskryptory
      • Oprzyrządowanie związane z deskryptorami
      • Opis metod protokołu deskryptora
        • Metoda get
        • Metoda set
        • Metoda delete
        • Metoda set name
    • Rodzaje deskryptorów
      • Deskryptory niezwiązane z danymi
      • Deskryptory danych
    • Deskryptory w praktyce
      • Zastosowanie deskryptorów
        • Pierwsza próba. Bez użycia deskryptorów
        • Implementacja idiomatyczna
    • Różne formy implementacji deskryptorów
      • Problem współdzielonego stanu
      • Dostęp do słownika obiektu
      • Korzystanie ze słabych referencji
    • Więcej uwag na temat deskryptorów
      • Wielokrotne wykorzystanie kodu
      • Alternatywa dla dekoratorów klas
    • Analiza deskryptorów
      • W jaki sposób Python wewnętrznie używa deskryptorów?
        • Funkcje i metody
        • Wbudowane dekoratory dla metod
        • Gniazda
      • Implementacja deskryptorów w dekoratorach
    • Uwagi końcowe na temat deskryptorów
      • Interfejs deskryptorów
      • Obiektowy projekt deskryptorów
      • Adnotacje typów dla deskryptorów
    • Podsumowanie
    • Bibliografia
  • 7. Generatory, iteratory i programowanie asynchroniczne
    • Wymagania techniczne
    • Tworzenie generatorów
      • Pierwsze spojrzenie na generatory
      • Wyrażenia generatorowe
    • Idiomatyczne iteracje
      • Idiomy iteracji
      • Funkcja next()
      • Korzystanie z generatora
      • Itertools
      • Upraszczanie kodu za pomocą iteratorów
        • Powtarzające się iteracje
        • Pętle zagnieżdżone
      • Wzorzec Iterator w Pythonie
        • Interfejs iteracji
        • Obiekty sekwencji jako obiekty iterowalne
    • Podprogramy
      • Metody interfejsu generatora
        • close()
        • throw(typ_wyjątku[, wartość_wyjątku[, ślad_wyjątku]])
        • send(wartość)
      • Bardziej zaawansowane podprogramy
        • Zwracanie wartości w podprogramach
        • Delegowanie zadań do mniejszych podprogramów składnia yield from
          • Najprostsze wykorzystanie składni yield from
          • Przechwytywanie wartości zwracanej przez podgenerator
          • Wysyłanie danych do podgeneratora i odbieranie ich stamtąd
    • Programowanie asynchroniczne
      • Magiczne metody asynchroniczne
        • Asynchroniczne menedżery kontekstu
        • Inne metody magiczne
      • Iteracja asynchroniczna
      • Generatory asynchroniczne
    • Podsumowanie
    • Bibliografia
  • 8. Testy jednostkowe i refaktoryzacja
    • Zasady projektowania a testy jednostkowe
      • Uwaga na temat innych form automatycznych testów
      • Testy jednostkowe a zwinne wytwarzanie oprogramowania
      • Testy jednostkowe a projektowanie oprogramowania
      • Definiowanie granic testowania
    • Narzędzia testowania
      • Frameworki i biblioteki do testów jednostkowych
        • unittest
          • Testy sparametryzowane
        • pytest
          • Proste przypadki testowe dla modułu pytest
          • Testy sparametryzowane
          • Fikstury
        • Pokrycie kodu testami
          • Konfigurowanie modułu do badania pokrycia kodu testami
          • Zastrzeżenia do pokrycia kodu testami
        • Obiekty mock
          • Ostrzeżenie przed łataniem i obiektami mock
          • Korzystanie z obiektów mock
    • Refaktoryzacja
      • Ewolucje kodu
      • Kod produkcyjny nie jest jedynym, który ewoluuje
    • Więcej o testowaniu
      • Testowanie oparte na właściwościach
      • Testowanie mutacji
      • Typowe motywy w testowaniu
        • Wartości graniczne
        • Klasy równoważności
        • Przypadki brzegowe
      • Krótkie wprowadzenie do techniki TDD
    • Podsumowanie
    • Bibliografia
  • 9. Typowe wzorce projektowe
    • Zagadnienia dotyczące wzorców projektowych w Pythonie
    • Wzorce projektowe w praktyce
      • Wzorce kreacyjne
        • Fabryki
        • Singleton i Stan współdzielony (Monostat)
          • Stan współdzielony (Monostat)
        • Wzorzec Borga
        • Budowniczy
      • Wzorce strukturalne
        • Adapter
        • Kompozyt
        • Dekorator
        • Fasada
      • Wzorce behawioralne
        • Łańcuch odpowiedzialności
        • Metoda szablonowa
        • Polecenie
        • Stan
    • Pusty obiekt
    • Końcowe przemyślenia dotyczące wzorców projektowych
      • Wpływ zastosowania wzorców na projekt
      • Wzorce projektowe jako teoria
      • Nazwy w modelach
    • Podsumowanie
    • Bibliografia
  • 10. Czysta architektura
    • Od czystego kodu do czystej architektury
      • Podział odpowiedzialności
      • Aplikacje monolityczne a mikrousługi
      • Abstrakcje
    • Komponenty oprogramowania
      • Pakiety
        • Zarządzanie zależnościami
        • Inne problemy dotyczące zarządzania zależnościami
        • Wersje artefaktów
      • Kontenery Docker
        • Przypadek użycia
        • Kod
        • Modele domen
        • Wywoływanie z aplikacji
        • Adaptery
      • Usługi
        • Analiza
        • Przepływ zależności
        • Ograniczenia
        • Testowalność
        • Ujawnianie intencji
    • Podsumowanie
    • Bibliografia
    • Podsumowanie końcowe
  • Title: Czysty kod w Pythonie. Twórz wydajny i łatwy w utrzymaniu kod. Wydanie II
  • Author: Mariano Anaya
  • Original title: Clean Code in Python: Develop maintainable and efficient code, 2nd Edition
  • Translation: Radosław Meryk
  • ISBN: 978-83-283-8612-9, 9788328386129
  • Date of issue: 2022-03-22
  • Format: Ebook
  • Item ID: czyko2
  • Publisher: Helion