Czysty kod w Pythonie. Twórz wydajny i łatwy w utrzymaniu kod - ebook
Czysty kod w Pythonie. Twórz wydajny i łatwy w utrzymaniu kod - 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ć!
Spis treści
- 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
- Wprowadzenie
- 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
- Indeksy i wycinki
- 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
- Obsługa błędów
- 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
- Jak działają argumenty funkcji w Pythonie?
- Uwagi końcowe dotyczące dobrych praktyk projektowania oprogramowania
- Ortogonalność w oprogramowaniu
- Strukturyzacja kodu
- Podsumowanie
- Materiały referencyjne
- Projektowanie według kontraktu
- 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
- Wykrywanie problemów dotyczących zasady LSP za pomocą narzędzi
- 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
- Zasada pojedynczej odpowiedzialności
- 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
- Przekazywanie argumentów do 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
- Czym są dekoratory w Pythonie?
- 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
- Zastosowanie deskryptorów
- 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
- W jaki sposób Python wewnętrznie używa deskryptorów?
- Uwagi końcowe na temat deskryptorów
- Interfejs deskryptorów
- Obiektowy projekt deskryptorów
- Adnotacje typów dla deskryptorów
- Podsumowanie
- Bibliografia
- Pierwsze spojrzenie na deskryptory
- 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
- Metody interfejsu generatora
- Programowanie asynchroniczne
- Magiczne metody asynchroniczne
- Asynchroniczne menedżery kontekstu
- Inne metody magiczne
- Iteracja asynchroniczna
- Generatory asynchroniczne
- Magiczne metody 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
- unittest
- Frameworki i biblioteki do testów jednostkowych
- 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
- Zasady projektowania a testy jednostkowe
- 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
- Wzorce kreacyjne
- 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
- Pakiety
- Podsumowanie
- Bibliografia
- Podsumowanie końcowe
- Od czystego kodu do czystej architektury
Kategoria: | Programowanie |
Zabezpieczenie: |
Watermark
|
ISBN: | 978-83-283-8612-9 |
Rozmiar pliku: | 3,6 MB |