Rozdział 1: Czysty kod
-
Ogólna ilość bałaganu zwiększa się z czasem.
-
Przywrócenie przestarzałego systemu od zera jest bardzo trudne. Refaktoryzacja i przyrostowe ulepszenia będą w tym przypadku najlepszą opcją.
-
W nieuporządkowanym kodzie zadania, które powinny zająć tylko kilka godzin, mogą zająć kilka dni lub tygodni.
-
Poświęć trochę czasu na szybkie działanie.
-
Czysty kod robi jedną rzecz dobrze. Zły kod próbuje zrobić zbyt wiele.
-
Czysty kod jest dobrze przetestowany.
-
Czytając dobrze napisany kod, każda funkcja robi mniej więcej to, czego można się spodziewać.
-
Jeśli nie zgadzasz się z zasadą nauczaną przez osobę z wieloletnim doświadczeniem, powinieneś przynajmniej rozważyć jej punkt widzenia, zanim go zignorujesz.
-
Kod jest czytany znacznie częściej niż pisany.
-
Kod łatwiejszy do odczytania jest łatwiejszy do zmiany.
-
Pozostaw bazę kodu w lepszym stanie niż wtedy, gdy ją znalazłeś (Zasada skauta).
Rozdział 2: Znaczenie imion
-
Wybierz ostrożnie nazwy zmiennych.
-
Wybór dobrych imion jest trudny.
-
Nazwa zmiennej lub funkcji powinna wskazywać, czym ona jest i jak jest używana.
-
Unikaj używania jednoznakowych nazw zmiennych, z wyjątkiem powszechnie używanych nazw, takich jak i dla zmiennej licznika w pętli.
-
Unikaj używania skrótów w nazwach zmiennych.
-
Nazwy zmiennych powinny być wymawialne, aby można było o nich mówić i wypowiadać je na głos.
-
Używaj nazw zmiennych, które są łatwe do znalezienia.
-
Klasy i obiekty muszą mieć nazwy w formie rzeczowników.
-
Nazwy metod i funkcji muszą być czasownikami lub parami czasownik-rzeczownik.
Rozdział 3: Funkcje
-
Funkcje powinny być małe.
-
Funkcja musi wykonać jedną akcję.
-
Funkcje muszą mieć nazwy opisowe.
-
Wyodrębnij kod z treści if/else lub zamień instrukcje na wyraźnie nazwane funkcje.
-
Ogranicz liczbę argumentów pobieranych przez funkcję.
-
Jeśli funkcja wymaga wielu argumentów konfiguracyjnych, rozważ połączenie ich w jedną zmienną parametrów konfiguracyjnych.
-
Funkcje muszą być czyste, co oznacza, że nie powodują skutków ubocznych i nie modyfikują argumentów wejściowych.
-
Funkcja musi być poleceniem lub zapytaniem, ale nie obydwoma na raz (rozdzielanie zapytań poleceń).
-
Lepiej usuwać błędy i wyjątki z kodu niż pozostawiać błędy w kodzie.
-
Wyodrębnij zduplikowany kod do wyraźnie nazwanych funkcji (nie powtarzaj się).
-
Testy jednostkowe ułatwiają refaktoryzację.
Rozdział 4: Komentarze
-
Komentarze mogą być nieprawidłowe. Mogą być na początku błędne lub mogą być początkowo dokładne, a z biegiem czasu stają się nieaktualne w miarę zmiany kodu.
-
Użyj komentarzy, aby opisać, dlaczego jest napisany w taki sposób, w jaki jest, zamiast wyjaśniać, co się dzieje.
-
Często można uniknąć komentarzy, używając jasno nazwanych zmiennych i wyodrębniając sekcje kodu do jasno nazwanych funkcji.
-
Dodaj do komentarzy TODO spójne przedrostki, aby ułatwić ich znalezienie. Okresowo przeglądaj i usuwaj swoje komentarze do zadań TODO.
-
Nie używaj Javadocs tylko dla samego korzystania z nich. Komentarze opisujące, co robi metoda, jakie argumenty przyjmuje i co zwraca, są w najlepszym przypadku zbędne, a w najgorszym wprowadzają w błąd.
-
Komentarze powinny zawierać wszystkie istotne informacje i kontekst, których czytelnik będzie potrzebował. Nie bądź leniwy podczas pisania komentarza.
-
Komentarze do dziennika i komentarze autorów plików nie są potrzebne ze względu na kontrolę wersji i winę Gita.
-
Nie komentuj martwego kodu. Po prostu usuń to. Jeśli uważasz, że będziesz potrzebować kodu w przyszłości, właśnie do tego służy kontrola wersji.
Rozdział 5: Formatowanie
-
Jako zespół wybierz zestaw reguł formatowania kodu, a następnie konsekwentnie stosuj te reguły. Bez względu na to, z jakimi zasadami się zgadzasz, musisz dojść do porozumienia.
-
Skorzystaj z automatycznego formatowania kodu i analizatora kodu. Nie polegaj na ręcznym znajdowaniu i naprawianiu każdego błędu formatowania. Jest to nieefektywne, nieproduktywne i stratą czasu podczas przeglądania kodu.
-
Dodaj pionowe odstępy między wierszami kodu, aby wizualnie oddzielić powiązane bloki kodu. Wszystko, czego potrzebujesz, to utworzyć jedną nową linię pomiędzy grupami.
-
Małe pliki są łatwiejsze do odczytania, zrozumienia i przenoszenia niż duże pliki.
-
Zmienne należy deklarować w pobliżu miejsca, w którym są używane. W przypadku małych funkcji jest to zwykle górna część funkcji.
-
Nawet w przypadku krótkich funkcji lub instrukcji if nadal należy je poprawnie formatować, zamiast zapisywać je w jednym wierszu.
Rozdział 6: Obiekty i struktury danych
-
Szczegóły implementacji obiektu muszą być ukryte za interfejsem obiektu. Udostępniając interfejs do użytku przez konsumentów obiektu, ułatwiasz późniejszą refaktoryzację szczegółów implementacji bez powodowania istotnych zmian. Abstrakcje ułatwiają refaktoryzację.
-
Dowolny fragment kodu nie powinien mieć żadnej wiedzy o wewnętrznych elementach obiektu, na którym działa.
-
Pracując z obiektem, powinieneś wymagać od niego wykonania polecenia lub zapytania, zamiast zadawać pytania o jego elementy wewnętrzne.
Rozdział 7: Poprawianie błędów
-
Obsługa błędów nie powinna zakłócać reszty kodu w module.
-
Lepiej usuwać błędy i wyjątki z kodu niż pozostawiać błędy w kodzie.
-
Pisz testy z błędami, aby mieć pewność, że Twój kod je zidentyfikuje i nie przeoczy.
-
Komunikaty o błędach powinny mieć charakter informacyjny i zawierać cały niezbędny kontekst, który może być potrzebny do skutecznego rozwiązania problemu.
-
Opakowanie interfejsów API innych firm cienką warstwą abstrakcji ułatwia zastępowanie jednej biblioteki inną w przyszłości.
-
Opakowanie interfejsów API innych firm cienką warstwą abstrakcji ułatwia kpiny z biblioteki podczas testowania.
-
Użyj wzorca Special Case lub Null Object, aby obsłużyć wyjątkowe zachowanie, na przykład gdy określone dane nie istnieją.
Rozdział 8: Granice
-
Biblioteki innych firm pomagają przyspieszyć dostarczanie produktów, umożliwiając outsourcing różnych zadań.
-
Napisz testy, aby upewnić się, że poprawnie korzystasz z biblioteki strony trzeciej.
-
Użyj wzorca adaptera, aby wypełnić lukę między interfejsem API biblioteki innej firmy a interfejsem API, który chcesz mieć.
-
Opakowanie interfejsów API innych firm cienką warstwą abstrakcji ułatwia zastępowanie jednej biblioteki inną w przyszłości. (Powtórz od rozdziału 7)
-
Opakowanie interfejsów API innych firm cienką warstwą abstrakcji ułatwia kpiny z biblioteki podczas testowania. (Powtórz od rozdziału 7)
-
Staraj się nie przekazywać aplikacji zbyt wielu informacji o szczegółach bibliotek stron trzecich.
-
Lepiej polegać na tym, na co masz wpływ, niż na tym, na co nie masz wpływu.
Rozdział 9: Testy jednostkowe
-
Kod testowy powinien być tak czysty jak kod produkcyjny (z pewnymi wyjątkami, zwykle związanymi z pamięcią lub wydajnością).
-
Wraz ze zmianą kodu produkcyjnego zmienia się także kod testowy.
-
Testy pomagają zachować elastyczność i łatwość konserwacji kodu produkcyjnego.
-
Testy pozwalają na wprowadzanie zmian, pozwalając na pewną refaktoryzację bez obawy, że sam tego nie zauważysz.
-
Ustrukturyzuj swoje testy, korzystając ze wzorca Ułóż-Działaj-Potwierdź (znanego również jako Budowa-Obsługa-Sprawdzenie, Konfiguracja-Ćwiczenie-Weryfikacja lub Biorąc-Kiedy-Wtedy).
-
Użyj funkcji specyficznych dla domeny, aby ułatwić pisanie i czytanie testów.
-
Oceń jedną koncepcję w teście.
-
Testy muszą być szybkie.
-
Testy muszą być niezależne.
-
Testy muszą być powtarzalne.
-
Testy nie powinny wymagać potwierdzenia.
-
Testy należy pisać terminowo, na krótko przed lub po napisaniu kodu produkcyjnego, a nie kilka miesięcy później.
-
Jeśli Twoje testy wypadną źle, spodziewaj się błędów w kodzie.
Rozdział 10: Zajęcia
-
Klasy powinny być małe.
-
Klasy powinny być odpowiedzialne tylko za jedną rzecz i mieć tylko jeden powód do zmiany (zasada pojedynczej odpowiedzialności).
-
Jeśli nie możesz wymyślić jasnej nazwy klasy, prawdopodobnie jest ona za duża.
-
Twoja praca nie kończy się w momencie uruchomienia fragmentu kodu. Następnym krokiem będzie refaktoryzacja i oczyszczenie kodu.
-
Używanie w aplikacji wielu małych klas zamiast kilku dużych klas zmniejsza ilość informacji, które programista musi zrozumieć podczas pracy nad danym zadaniem.
-
Posiadanie dobrego zestawu testów pozwala na pewną refaktoryzację podczas dzielenia dużych klas na mniejsze.
-
Zajęcia powinny być otwarte na rozbudowę, ale zamknięte na modyfikację (zasada otwarte-zamknięte).
-
Interfejsy i klasy abstrakcyjne tworzą szwy, które ułatwiają testowanie.
Rozdział 11: Systemy
-
Użyj wstrzykiwania zależności, aby zapewnić programistom elastyczność przekazywania dowolnego obiektu z odpowiednim interfejsem do innej klasy.
-
Użyj wstrzykiwania zależności, aby utworzyć interfejsy między obiektami w aplikacji, aby ułatwić testowanie.
-
Systemy oprogramowania nie przypominają budynku, który należy wcześniej zaprojektować. Przypominają raczej miasta, które z biegiem czasu rosną i rozrastają się, dostosowując się do aktualnych potrzeb.
-
Odłóż podjęcie decyzji do ostatniego krytycznego momentu.
-
Używaj języka specyficznego dla domeny, aby eksperci domeny i programiści używali tej samej terminologii.
-
Nie komplikuj zbytnio swojego systemu. Użyj najprostszej rzeczy, która działa.
Rozdział 12: Wdrożenie
-
Systemów, których nie można przetestować, nie można zweryfikować, a systemów, których nie można zweryfikować, nie należy nigdy wdrażać.
-
Pisanie testów prowadzi do lepszego projektowania, ponieważ łatwy do przetestowania kod często wykorzystuje wstrzykiwanie zależności, interfejsy i abstrakcję.
-
Dobry zestaw testów wyeliminuje strach przed uszkodzeniem aplikacji podczas refaktoryzacji.
-
Powielanie kodu stwarza większe ryzyko, ponieważ w kodzie jest więcej miejsc, które można zmienić, a jeszcze więcej miejsc, w których można ukryć błędy.
-
Kod, który teraz piszesz, jest łatwiejszy do zrozumienia, ponieważ jesteś głęboko zaangażowany w jego zrozumienie. Innym nie jest łatwo szybko osiągnąć ten sam poziom zrozumienia.
-
Większość kosztów projektu oprogramowania wiąże się z długoterminowym utrzymaniem.
-
Testy służą jako żywa dokumentacja tego, jak aplikacja powinna (i zachowuje się) zachowywać.
-
Nie ruszaj się dalej, gdy kod zacznie działać. Poświęć trochę czasu, aby uczynić go jaśniejszym i bardziej zrozumiałym.
-
Następną osobą, która w najbliższej przyszłości przeczyta Twój kod, najprawdopodobniej będziesz Ty. Bądź miły dla siebie w przyszłości, pisząc kod, który jest łatwy do zrozumienia.
-
Sprzeciwiaj się dogmatom. Ogarnij pragmatyzm.
-
Aby stać się naprawdę dobrym inżynierem oprogramowania, potrzeba dziesięcioleci. Możesz przyspieszyć proces uczenia się, ucząc się od otaczających Cię ekspertów i ucząc się powszechnie używanych wzorców projektowych.
Rozdział 13: Równoległość
-
Pisanie kodu równoległego jest trudne.
-
Sporadyczne błędy i problemy trudne do odtworzenia są często problemami współbieżności.
-
Testowanie nie gwarantuje, że Twoja aplikacja będzie wolna od błędów, ale zminimalizuje ryzyko.
-
Dowiedz się o typowych problemach ze współbieżnością i możliwych rozwiązaniach.
Rozdział 14: Udoskonalanie sekwencyjne
-
Czysty kod zwykle nie zaczyna się od pustej karty. Najpierw piszesz przybliżone rozwiązanie, a następnie refaktoryzujesz je, aby było czystsze.
-
Błędem jest zaprzestanie pracy nad kodem, gdy już zaczął on działać. Poświęć trochę czasu, aby uczynić go jeszcze lepszym, gdy już działa.
-
Niepokój narasta stopniowo.
-
Jeśli znajdziesz się w trudnej sytuacji, w której dodawanie funkcji jest zbyt trudne lub zajmuje zbyt dużo czasu, przestań pisać funkcje i rozpocznij refaktoryzację.
-
Stopniowe zmiany są często lepsze niż budowanie od zera.
-
Użyj programowania opartego na testach (TDD), aby wprowadzić dużą liczbę bardzo małych zmian.
-
Dobry projekt oprogramowania wymaga oddzielenia problemów w kodzie i podzielenia kodu na mniejsze moduły, klasy i pliki.
-
Łatwiej posprzątać bałagan od razu po jego zrobieniu, niż później.
Rozdział 15: Elementy wewnętrzne JUnit
-
Ujemne nazwy zmiennych lub wyrażenia warunkowe są nieco trudniejsze do zrozumienia niż dodatnie.
-
Refaktoryzacja to proces iteracyjny, pełen prób i błędów.
-
Pozostaw bazę kodu w lepszym stanie niż wtedy, gdy ją znalazłeś (Zasada skauta). (Powtórzone z rozdziału 1)
Rozdział 16: Refaktoryzacja SerialDate
-
Recenzje kodu i krytyka naszego kodu czynią nas lepszymi i powinniśmy to przyjąć z radością.
-
Najpierw spraw, aby kod działał, a potem go napraw.
-
Nie każda linia kodu wymaga testowania.
Rozdział 17: Zapachy i heurystyka
-
Czysty kod to nie zbiór zasad, a raczej system wartości, które decydują o jakości Twojej pracy.
GO TO FULL VERSION