Czysty kod. Podręcznik dobrego programisty - ebook
Czysty kod. Podręcznik dobrego programisty - ebook
Poznaj najlepsze metody tworzenia doskonałego kodu
- Jak pisać dobry kod, a zły przekształcić w dobry?
- Jak formatować kod, aby osiągnąć maksymalną czytelność?
- Jak implementować pełną obsługę błędów bez zaśmiecania logiki kodu?
O tym, ile problemów sprawia niedbale napisany kod, wie każdy programista. Nie wszyscy jednak wiedzą, jak napisać ten świetny, „czysty” kod i czym właściwie powinien się on charakteryzować. Co więcej – jak odróżnić dobry kod od złego? Odpowiedź na te pytania oraz sposoby tworzenia czystego, czytelnego kodu znajdziesz właśnie w tej książce. Podręcznik jest obowiązkową pozycją dla każdego, kto chce poznać techniki rzetelnego i efektywnego programowania.
W książce „Czysty kod. Podręcznik dobrego programisty” szczegółowo omówione zostały zasady, wzorce i najlepsze praktyki pisania czystego kodu. Podręcznik zawiera także kilka analiz przypadków o coraz większej złożoności, z których każda jest doskonałym ćwiczeniem porządkowania zanieczyszczonego bądź nieudanego kodu. Z tego podręcznika dowiesz się m.in., jak tworzyć dobre nazwy, obiekty i funkcje, a także jak tworzyć testy jednostkowe i korzystać z programowania sterowanego testami. Nauczysz się przekształcać kod zawierający problemy w taki, który jest solidny i efektywny.
- Nazwy klas i metod
- Funkcje i listy argumentów
- Rozdzielanie poleceń i zapytań
- Stosowanie wyjątków
- Komentarze
- Formatowanie
- Obiekty i struktury danych
- Obsługa błędów
- Testy jednostkowe
- Klasy i systemy
- Współbieżność
- Oczyszczanie kodu
Niech stworzony przez Ciebie kod imponuje czystością!
Spis treści
- Słowo wstępne
- Wstęp
- Podziękowania
- Rysunki
- Podziękowania
- Rozdział 1. Czysty kod
- Niech stanie się kod...
- W poszukiwaniu doskonałego kodu...
- Całkowity koszt bałaganu
- Rozpoczęcie wielkiej zmiany projektu
- Postawa
- Największa zagadka
- Sztuka czystego kodu?
- Co to jest czysty kod?
- Szkoły myślenia
- Jesteśmy autorami
- Zasada skautów
- Poprzednik i zasady
- Zakończenie
- Bibliografia
- Rozdział 2. Znaczące nazwy
- Wstęp
- Używaj nazw przedstawiających intencje
- Unikanie dezinformacji
- Tworzenie wyraźnych różnic
- Tworzenie nazw, które można wymówić
- Korzystanie z nazw łatwych do wyszukania
- Unikanie kodowania
- Notacja węgierska
- Przedrostki składników
- Interfejsy i implementacje
- Unikanie odwzorowania mentalnego
- Nazwy klas
- Nazwy metod
- Nie bądź dowcipny
- Wybieraj jedno słowo na pojęcie
- Nie twórz kalamburów!
- Korzystanie z nazw dziedziny rozwiązania
- Korzystanie z nazw dziedziny problemu
- Dodanie znaczącego kontekstu
- Nie należy dodawać nadmiarowego kontekstu
- Słowo końcowe
- Rozdział 3. Funkcje
- Małe funkcje!
- Bloki i wcięcia
- Wykonuj jedną czynność
- Sekcje wewnątrz funkcji
- Jeden poziom abstrakcji w funkcji
- Czytanie kodu od góry do dołu zasada zstępująca
- Instrukcje switch
- Korzystanie z nazw opisowych
- Argumenty funkcji
- Często stosowane funkcje jednoargumentowe
- Argumenty znacznikowe
- Funkcje dwuargumentowe
- Funkcje trzyargumentowe
- Argumenty obiektowe
- Listy argumentów
- Czasowniki i słowa kluczowe
- Unikanie efektów ubocznych
- Argumenty wyjściowe
- Rozdzielanie poleceń i zapytań
- Stosowanie wyjątków zamiast zwracania kodów błędów
- Wyodrębnienie bloków try-catch
- Obsługa błędów jest jedną operacją
- Przyciąganie zależności w Error.java
- Nie powtarzaj się[13\
- Programowanie strukturalne
- Jak pisać takie funkcje?
- Zakończenie
- SetupTeardownIncluder
- Bibliografia
- Małe funkcje!
- Rozdział 4. Komentarze
- Komentarze nie są szminką dla złego kodu
- Czytelny kod nie wymaga komentarzy
- Dobre komentarze
- Komentarze prawne
- Komentarze informacyjne
- Wyjaśnianie zamierzeń
- Wyjaśnianie
- Ostrzeżenia o konsekwencjach
- Komentarze TODO
- Wzmocnienie
- Komentarze Javadoc w publicznym API
- Złe komentarze
- Bełkot
- Powtarzające się komentarze
- Mylące komentarze
- Komentarze wymagane
- Komentarze dziennika
- Komentarze wprowadzające szum informacyjny
- Przerażający szum
- Nie używaj komentarzy, jeżeli można użyć funkcji lub zmiennej
- Znaczniki pozycji
- Komentarze w klamrach zamykających
- Atrybuty i dopiski
- Zakomentowany kod
- Komentarze HTML
- Informacje nielokalne
- Nadmiar informacji
- Nieoczywiste połączenia
- Nagłówki funkcji
- Komentarze Javadoc w niepublicznym kodzie
- Przykład
- Bibliografia
- Rozdział 5. Formatowanie
- Przeznaczenie formatowania
- Formatowanie pionowe
- Metafora gazety
- Pionowe odstępy pomiędzy segmentami kodu
- Gęstość pionowa
- Odległość pionowa
- Uporządkowanie pionowe
- Formatowanie poziome
- Poziome odstępy i gęstość
- Rozmieszczenie poziome
- Wcięcia
- Puste zakresy
- Zasady zespołowe
- Zasady formatowania wujka Boba
- Rozdział 6. Obiekty i struktury danych
- Abstrakcja danych
- Antysymetria danych i obiektów
- Prawo Demeter
- Wraki pociągów
- Hybrydy
- Ukrywanie struktury
- Obiekty transferu danych
- Active Record
- Zakończenie
- Bibliografia
- Rozdział 7. Obsługa błędów
- Użycie wyjątków zamiast kodów powrotu
- Rozpoczynanie od pisania instrukcji try-catch-finally
- Użycie niekontrolowanych wyjątków
- Dostarczanie kontekstu za pomocą wyjątków
- Definiowanie klas wyjątków w zależności od potrzeb wywołującego
- Definiowanie normalnego przepływu
- Nie zwracamy null
- Nie przekazujemy null
- Zakończenie
- Bibliografia
- Rozdział 8. Granice
- Zastosowanie kodu innych firm
- Przeglądanie i zapoznawanie się z granicami
- Korzystanie z pakietu log4j
- Zalety testów uczących
- Korzystanie z nieistniejącego kodu
- Czyste granice
- Bibliografia
- Rozdział 9. Testy jednostkowe
- Trzy prawa TDD
- Zachowanie czystości testów
- Testy zwiększają możliwości
- Czyste testy
- Języki testowania specyficzne dla domeny
- Podwójny standard
- Jedna asercja na test
- Jedna koncepcja na test
- F.I.R.S.T.[8\
- Zakończenie
- Bibliografia
- Rozdział 10. Klasy
- Organizacja klas
- Hermetyzacja
- Klasy powinny być małe!
- Zasada pojedynczej odpowiedzialności
- Spójność
- Utrzymywanie spójności powoduje powstanie wielu małych klas
- Organizowanie zmian
- Izolowanie modułów kodu przed zmianami
- Bibliografia
- Organizacja klas
- Rozdział 11. Systemy
- Jak budowałbyś miasto?
- Oddzielenie konstruowania systemu od jego używania
- Wydzielenie modułu main
- Fabryki
- Wstrzykiwanie zależności
- Skalowanie w górę
- Separowanie (rozcięcie) problemów
- Pośredniki Java
- Czyste biblioteki Java AOP
- Aspekty w AspectJ
- Testowanie architektury systemu
- Optymalizacja podejmowania decyzji
- Korzystaj ze standardów, gdy wnoszą realną wartość
- Systemy wymagają języków dziedzinowych
- Zakończenie
- Bibliografia
- Rozdział 12. Powstawanie projektu
- Uzyskiwanie czystości projektu przez jego rozwijanie
- Zasada numer 1 prostego projektu system przechodzi wszystkie testy
- Zasady numer 2 4 prostego projektu przebudowa
- Brak powtórzeń
- Wyrazistość kodu
- Minimalne klasy i metody
- Zakończenie
- Bibliografia
- Rozdział 13. Współbieżność
- W jakim celu stosować współbieżność?
- Mity i nieporozumienia
- Wyzwania
- Zasady obrony współbieżności
- Zasada pojedynczej odpowiedzialności
- Wniosek ograniczenie zakresu danych
- Wniosek korzystanie z kopii danych
- Wniosek wątki powinny być na tyle niezależne, na ile to tylko możliwe
- Poznaj używaną bibliotekę
- Kolekcje bezpieczne dla wątków
- Poznaj modele wykonania
- Producent-konsument[9\
- Czytelnik-pisarz[10\
- Ucztujący filozofowie[11\
- Uwaga na zależności pomiędzy synchronizowanymi metodami
- Tworzenie małych sekcji synchronizowanych
- Pisanie prawidłowego kodu wyłączającego jest trudne
- Testowanie kodu wątków
- Traktujemy przypadkowe awarie jako potencjalne problemy z wielowątkowością
- Na początku uruchamiamy kod niekorzystający z wątków
- Nasz kod wątków powinien dać się włączać
- Nasz kod wątków powinien dać się dostrajać
- Uruchamiamy więcej wątków, niż mamy do dyspozycji procesorów
- Uruchamiamy testy na różnych platformach
- Uzbrajamy nasz kod w elementy próbujące wywołać awarie i wymuszające awarie
- Instrumentacja ręczna
- Instrumentacja automatyczna
- Zakończenie
- Bibliografia
- W jakim celu stosować współbieżność?
- Rozdział 14. Udane oczyszczanie kodu
- Implementacja klasy Args
- Jak to napisałem?
- Args zgrubny szkic
- Zatrzymałem się
- O przyrostowości
- Argumenty typu String
- Zakończenie
- Implementacja klasy Args
- Rozdział 15. Struktura biblioteki JUnit
- Biblioteka JUnit
- Zakończenie
- Rozdział 16. Przebudowa klasy SerialDate
- Na początek uruchamiamy
- Teraz poprawiamy
- Zakończenie
- Bibliografia
- Rozdział 17. Zapachy kodu i heurystyki
- Komentarze
- C1. Niewłaściwe informacje
- C2. Przestarzałe komentarze
- C3. Nadmiarowe komentarze
- C4. Źle napisane komentarze
- C5. Zakomentowany kod
- Środowisko
- E1. Budowanie wymaga więcej niż jednego kroku
- E2. Testy wymagają więcej niż jednego kroku
- Funkcje
- F1. Nadmiar argumentów
- F2. Argumenty wyjściowe
- F3. Argumenty znacznikowe
- F4. Martwe funkcje
- Ogólne
- G1. Wiele języków w jednym pliku źródłowym
- G2. Oczywiste działanie jest nieimplementowane
- G3. Niewłaściwe działanie w warunkach granicznych
- G4. Zdjęte zabezpieczenia
- G5. Powtórzenia
- G6. Kod na nieodpowiednim poziomie abstrakcji
- G7. Klasy bazowe zależne od swoich klas pochodnych
- G8. Za dużo informacji
- G9. Martwy kod
- G10. Separacja pionowa
- G11. Niespójność
- G12. Zaciemnianie
- G13. Sztuczne sprzężenia
- G14. Zazdrość o funkcje
- G15. Argumenty wybierające
- G16. Zaciemnianie intencji
- G17. Źle rozmieszczona odpowiedzialność
- G18. Niewłaściwe metody statyczne
- G19. Użycie opisowych zmiennych
- G20. Nazwy funkcji powinny informować o tym, co realizują
- G21. Zrozumienie algorytmu
- G22. Zamiana zależności logicznych na fizyczne
- G23. Zastosowanie polimorfizmu zamiast instrukcji if-else lub switch-case
- G24. Wykorzystanie standardowych konwencji
- G25. Zamiana magicznych liczb na stałe nazwane
- G26. Precyzja
- G27. Struktura przed konwencją
- G28. Hermetyzacja warunków
- G29. Unikanie warunków negatywnych
- G30. Funkcje powinny wykonywać jedną operację
- G31. Ukryte sprzężenia czasowe
- G32. Unikanie dowolnych działań
- G33. Hermetyzacja warunków granicznych
- G34. Funkcje powinny zagłębiać się na jeden poziom abstrakcji
- G35. Przechowywanie danych konfigurowalnych na wysokim poziomie
- G36. Unikanie nawigacji przechodnich
- Java
- J1. Unikanie długich list importu przez użycie znaków wieloznacznych
- J2. Nie dziedziczymy stałych
- J3. Stałe kontra typy wyliczeniowe
- Nazwy
- N1. Wybór opisowych nazw
- N2. Wybór nazw na odpowiednich poziomach abstrakcji
- N3. Korzystanie ze standardowej nomenklatury tam, gdzie jest to możliwe
- N4. Jednoznaczne nazwy
- N5. Użycie długich nazw dla długich zakresów
- N6. Unikanie kodowania
- N7. Nazwy powinny opisywać efekty uboczne
- Testy
- T1. Niewystarczające testy
- T2. Użycie narzędzi kontroli pokrycia
- T3. Nie pomijaj prostych testów
- T4. Ignorowany test jest wskazaniem niejednoznaczności
- T5. Warunki graniczne
- T6. Dokładne testowanie pobliskich błędów
- T7. Wzorce błędów wiele ujawniają
- T8. Wzorce pokrycia testami wiele ujawniają
- T9. Testy powinny być szybkie
- Zakończenie
- Bibliografia
- Komentarze
- Dodatek A: Współbieżność II
- Przykład klient-serwer
- Serwer
- Dodajemy wątki
- Uwagi na temat serwera
- Zakończenie
- Możliwe ścieżki wykonania
- Liczba ścieżek
- Wyliczanie możliwych uporządkowań
- Kopiemy głębiej
- Zakończenie
- Liczba ścieżek
- Poznaj używaną bibliotekę
- Biblioteka Executor
- Rozwiązania nieblokujące
- Bezpieczne klasy nieobsługujące wątków
- Zależności między metodami mogą uszkodzić kod współbieżny
- Tolerowanie awarii
- Blokowanie na kliencie
- Blokowanie na serwerze
- Zwiększanie przepustowości
- Obliczenie przepustowości jednowątkowej
- Obliczenie przepustowości wielowątkowej
- Zakleszczenie
- Wzajemne wykluczanie
- Blokowanie i oczekiwanie
- Brak wywłaszczania
- Cykliczne oczekiwanie
- Zapobieganie wzajemnemu wykluczaniu
- Zapobieganie blokowaniu i oczekiwaniu
- Umożliwienie wywłaszczania
- Zapobieganie oczekiwaniu cyklicznemu
- Testowanie kodu wielowątkowego
- Narzędzia wspierające testowanie kodu korzystającego z wątków
- Zakończenie
- Samouczek. Pełny kod przykładów
- Klient-serwer bez wątków
- Klient-serwer z użyciem wątków
- Przykład klient-serwer
- Dodatek B: org.jfree.date.SerialDate
- Epilog
Kategoria: | Programowanie |
Zabezpieczenie: |
Watermark
|
ISBN: | 978-83-283-1399-6 |
Rozmiar pliku: | 5,1 MB |