Czysty kod. Podręcznik dobrego programisty

40.78

Opis

Poznaj najlepsze metody tworzenia doskonałego koduJak 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 metodFunkcje i listy argumentówRozdzielanie poleceń i zapytańStosowanie wyjątkówKomentarzeFormatowanieObiekty i struktury danychObsługa błędówTesty jednostkoweKlasy i systemyWspółbieżnośćOczyszczanie koduNiech stworzony przez Ciebie kod imponuje czystością!Spis treści:Słowo wstępneWstępPodziękowaniaRysunkiRozdział 1. Czysty kodNiech stanie się kod…W poszukiwaniu doskonałego kodu…Całkowity koszt bałaganuRozpoczęcie wielkiej zmiany projektuPostawaNajwiększa zagadkaSztuka czystego kodu?Co to jest czysty kod?Szkoły myśleniaJesteśmy autoramiZasada skautówPoprzednik i zasadyZakończenieBibliografiaRozdział 2. Znaczące nazwyWstępUżywaj nazw przedstawiających intencjeUnikanie dezinformacjiTworzenie wyraźnych różnicTworzenie nazw, które można wymówićKorzystanie z nazw łatwych do wyszukaniaUnikanie kodowaniaNotacja węgierskaPrzedrostki składnikówInterfejsy i implementacjeUnikanie odwzorowania mentalnegoNazwy klasNazwy metodNie bądź dowcipnyWybieraj jedno słowo na pojęcieNie twórz kalamburów!Korzystanie z nazw dziedziny rozwiązaniaKorzystanie z nazw dziedziny problemuDodanie znaczącego kontekstuNie należy dodawać nadmiarowego kontekstuSłowo końcoweRozdział 3. FunkcjeMałe funkcje!Bloki i wcięciaWykonuj jedną czynnośćSekcje wewnątrz funkcjiJeden poziom abstrakcji w funkcjiCzytanie kodu od góry do dołu zasada zstępującaInstrukcje switchKorzystanie z nazw opisowychArgumenty funkcjiCzęsto stosowane funkcje jednoargumentoweArgumenty znacznikoweFunkcje dwuargumentoweFunkcje trzyargumentoweArgumenty obiektoweListy argumentówCzasowniki i słowa kluczoweUnikanie efektów ubocznychArgumenty wyjścioweRozdzielanie poleceń i zapytańStosowanie wyjątków zamiast zwracania kodów błędówWyodrębnienie bloków try-catchObsługa błędów jest jedną operacjąPrzyciąganie zależności w Error.javaNie powtarzaj się[13]Programowanie strukturalneJak pisać takie funkcje?ZakończenieSetupTeardownIncluderBibliografiaRozdział 4. KomentarzeKomentarze nie są szminką dla złego koduCzytelny kod nie wymaga komentarzyDobre komentarzeKomentarze prawneKomentarze informacyjneWyjaśnianie zamierzeńWyjaśnianieOstrzeżenia o konsekwencjachKomentarze TODOWzmocnienieKomentarze Javadoc w publicznym APIZłe komentarzeBełkotPowtarzające się komentarzeMylące komentarzeKomentarze wymaganeKomentarze dziennikaKomentarze wprowadzające szum informacyjnyPrzerażający szumNie używaj komentarzy, jeżeli można użyć funkcji lub zmiennejZnaczniki pozycjiKomentarze w klamrach zamykającychAtrybuty i dopiskiZakomentowany kodKomentarze HTMLInformacje nielokalneNadmiar informacjiNieoczywiste połączeniaNagłówki funkcjiKomentarze Javadoc w niepublicznym kodziePrzykładBibliografiaRozdział 5. FormatowaniePrzeznaczenie formatowaniaFormatowanie pionoweMetafora gazetyPionowe odstępy pomiędzy segmentami koduGęstość pionowaOdległość pionowaUporządkowanie pionoweFormatowanie poziomePoziome odstępy i gęstośćRozmieszczenie poziomeWcięciaPuste zakresyZasady zespołoweZasady formatowania wujka BobaRozdział 6. Obiekty i struktury danychAbstrakcja danychAntysymetria danych i obiektówPrawo DemeterWraki pociągówHybrydyUkrywanie strukturyObiekty transferu danychActive RecordZakończenieBibliografiaRozdział 7. Obsługa błędówUżycie wyjątków zamiast kodów powrotuRozpoczynanie od pisania instrukcji try-catch-finallyUżycie niekontrolowanych wyjątkówDostarczanie kontekstu za pomocą wyjątkówDefiniowanie klas wyjątków w zależności od potrzeb wywołującegoDefiniowanie normalnego przepływuNie zwracamy nullNie przekazujemy nullZakończenieBibliografiaRozdział 8. GraniceZastosowanie kodu innych firmPrzeglądanie i zapoznawanie się z granicamiKorzystanie z pakietu log4jZalety testów uczącychKorzystanie z nieistniejącego koduCzyste graniceBibliografiaRozdział 9. Testy jednostkoweTrzy prawa TDDZachowanie czystości testówTesty zwiększają możliwościCzyste testyJęzyki testowania specyficzne dla domenyPodwójny standardJedna asercja na testJedna koncepcja na testF.I.R.S.T.[8]ZakończenieBibliografiaRozdział 10. KlasyOrganizacja klasHermetyzacjaKlasy powinny być małe!Zasada pojedynczej odpowiedzialnościSpójnośćUtrzymywanie spójności powoduje powstanie wielu małych klasOrganizowanie zmianIzolowanie modułów kodu przed zmianamiBibliografiaRozdział 11. SystemyJak budowałbyś miasto?Oddzielenie konstruowania systemu od jego używaniaWydzielenie modułu mainFabrykiWstrzykiwanie zależnościSkalowanie w góręSeparowanie (rozcięcie) problemówPośredniki JavaCzyste biblioteki Java AOPAspekty w AspectJTestowanie architektury systemuOptymalizacja podejmowania decyzjiKorzystaj ze standardów, gdy wnoszą realną wartośćSystemy wymagają języków dziedzinowychZakończenieBibliografiaRozdział 12. Powstawanie projektuUzyskiwanie czystości projektu przez jego rozwijanieZasada numer 1 prostego projektu system przechodzi wszystkie testyZasady numer 2 4 prostego projektu przebudowaBrak powtórzeńWyrazistość koduMinimalne klasy i metodyZakończenieBibliografiaRozdział 13. WspółbieżnośćW jakim celu stosować współbieżność?Mity i nieporozumieniaWyzwaniaZasady obrony współbieżnościZasada pojedynczej odpowiedzialnościWniosek ograniczenie zakresu danychWniosek korzystanie z kopii danychWniosek wątki powinny być na tyle niezależne, na ile to tylko możliwePoznaj używaną bibliotekęKolekcje bezpieczne dla wątkówPoznaj modele wykonaniaProducent-konsument[9]Czytelnik-pisarz[10]Ucztujący filozofowie[11]Uwaga na zależności pomiędzy synchronizowanymi metodamiTworzenie małych sekcji synchronizowanychPisanie prawidłowego kodu wyłączającego jest trudneTestowanie kodu wątkówTraktujemy przypadkowe awarie jako potencjalne problemy z wielowątkowościąNa początku uruchamiamy kod niekorzystający z wątkówNasz 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ówUruchamiamy testy na różnych platformachUzbrajamy nasz kod w elementy próbujące wywołać awarie i wymuszające awarieInstrumentacja ręcznaInstrumentacja automatycznaZakończenieBibliografiaRozdział 14. Udane oczyszczanie koduImplementacja klasy ArgsJak to napisałem?Args zgrubny szkicZatrzymałem sięO przyrostowościArgumenty typu StringZakończenieRozdział 15. Struktura biblioteki JUnitBiblioteka JUnitZakończenieRozdział 16. Przebudowa klasy SerialDateNa początek uruchamiamyTeraz poprawiamyZakończenieBibliografiaRozdział 17. Zapachy kodu i heurystykiKomentarzeC1. Niewłaściwe informacjeC2. Przestarzałe komentarzeC3. Nadmiarowe komentarzeC4. Źle napisane komentarzeC5. Zakomentowany kodŚrodowiskoE1. Budowanie wymaga więcej niż jednego krokuE2. Testy wymagają więcej niż jednego krokuFunkcjeF1. Nadmiar argumentówF2. Argumenty wyjścioweF3. Argumenty znacznikoweF4. Martwe funkcjeOgólneG1. Wiele języków w jednym pliku źródłowymG2. Oczywiste działanie jest nieimplementowaneG3. Niewłaściwe działanie w warunkach granicznychG4. Zdjęte zabezpieczeniaG5. PowtórzeniaG6. Kod na nieodpowiednim poziomie abstrakcjiG7. Klasy bazowe zależne od swoich klas pochodnychG8. Za dużo informacjiG9. Martwy kodG10. Separacja pionowaG11. NiespójnośćG12. ZaciemnianieG13. Sztuczne sprzężeniaG14. Zazdrość o funkcjeG15. Argumenty wybierająceG16. Zaciemnianie intencjiG17. Źle rozmieszczona odpowiedzialnośćG18. Niewłaściwe metody statyczneG19. Użycie opisowych zmiennychG20. Nazwy funkcji powinny informować o tym, co realizująG21. Zrozumienie algorytmuG22. Zamiana zależności logicznych na fizyczneG23. Zastosowanie polimorfizmu zamiast instrukcji if-else lub switch-caseG24. Wykorzystanie standardowych konwencjiG25. Zamiana magicznych liczb na stałe nazwaneG26. PrecyzjaG27. Struktura przed konwencjąG28. Hermetyzacja warunkówG29. Unikanie warunków negatywnychG30. Funkcje powinny wykonywać jedną operacjęG31. Ukryte sprzężenia czasoweG32. Unikanie dowolnych działańG33. Hermetyzacja warunków granicznychG34. Funkcje powinny zagłębiać się na jeden poziom abstrakcjiG35. Przechowywanie danych konfigurowalnych na wysokim poziomieG36. Unikanie nawigacji przechodnichJavaJ1. Unikanie długich list importu przez użycie znaków wieloznacznychJ2. Nie dziedziczymy stałychJ3. Stałe kontra typy wyliczenioweNazwyN1. Wybór opisowych nazwN2. Wybór nazw na odpowiednich poziomach abstrakcjiN3. Korzystanie ze standardowej nomenklatury tam, gdzie jest to możliweN4. Jednoznaczne nazwyN5. Użycie długich nazw dla długich zakresówN6. Unikanie kodowaniaN7. Nazwy powinny opisywać efekty uboczneTestyT1. Niewystarczające testyT2. Użycie narzędzi kontroli pokryciaT3. Nie pomijaj prostych testówT4. Ignorowany test jest wskazaniem niejednoznacznościT5. Warunki graniczneT6. Dokładne testowanie pobliskich błędówT7. Wzorce błędów wiele ujawniająT8. Wzorce pokrycia testami wiele ujawniająT9. Testy powinny być szybkieZakończenieBibliografiaDodatek A: Współbieżność IIPrzykład klient-serwerSerwerDodajemy wątkiUwagi na temat serweraZakończenieMożliwe ścieżki wykonaniaLiczba ścieżekWyliczanie możliwych uporządkowańKopiemy głębiejZakończeniePoznaj używaną bibliotekęBiblioteka ExecutorRozwiązania nieblokująceBezpieczne klasy nieobsługujące wątkówZależności między metodami mogą uszkodzić kod współbieżnyTolerowanie awariiBlokowanie na kliencieBlokowanie na serwerzeZwiększanie przepustowościObliczenie przepustowości jednowątkowejObliczenie przepustowości wielowątkowejZakleszczenieWzajemne wykluczanieBlokowanie i oczekiwanieBrak wywłaszczaniaCykliczne oczekiwanieZapobieganie wzajemnemu wykluczaniuZapobieganie blokowaniu i oczekiwaniuUmożliwienie wywłaszczaniaZapobieganie oczekiwaniu cyklicznemuTestowanie kodu wielowątkowegoNarzędzia wspierające testowanie kodu korzystającego z wątkówZakończenieSamouczek. Pełny kod przykładówKlient-serwer bez wątkówKlient-serwer z użyciem wątkówDodatek B: org.jfree.date.SerialDateEpilogO autorze: Robert C. Martin (Wujek Bob) jest programistą od 1970 roku. Jest uznanym mówcą na konferencjach całego świata. Napisał między innymi książki Mistrz czystego kodu. Kodeks postępowania profesjonalnych programistów (Helion, 2013) oraz UML for Java Programmers (Prentice Hall, 2003). Oprócz tego Martin opublikował setki artykułów, rozpraw i wpisów na blogach. Działał jako redaktor naczelny magazynu „The C++ Report” i był pierwszym przewodniczącym organizacji Agile Alliance. Założył i prowadzi międzynarodową firmę Object Mentor Inc., skupiającą doświadczonych programistów i menedżerów specjalizujących się we wspomaganiu firm w realizacji trudnych projektów.

Informatyka

may po angielsku
, liczva pi
, nadażyn
, zajęcia dla dzieci radom

yyyyy