Dane oryginału
Authorized Polish translation of the English edition of Real-World Software Development, ISBN 9781491967171 © 2020 Functor Ltd., and Monotonic Ltd.

This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same.

Przekład

Natalia Chounlamany-Turalska na zlecenie WITKOM Witold Sikorski

Projekt okładki polskiego wydania

INT-MEDIA Dawid Mazur na podstawie oryginału

Wydawcy

Edyta Kawala i Joanna Banasiak-Lach

Redaktor prowadzący

Jolanta Kowalczuk

Redaktor

Irena Puchalska

Koordynator produkcji

Anna Bączkowska

Skład wersji elektronicznej na zlecenie Wydawnictwa Naukowego PWN

Anna Jakubowska / Woblink

Zastrzeżonych nazw firm i produktów użyto w książce wyłącznie w celu identyfikacji.

Wyrażone w tej książce opinie należą do autorów i nie reprezentują poglądów wydawcy. Wydawca i autorzy dołożyli wszelkich starań, aby zapewnić, że informacje i instrukcje przedstawione w tej książce są prawidłowe, ale zrzekają się jakiejkolwiek odpowiedzialności za błędy i braki, w tym jakiejkolwiek odpowiedzialności za szkody wynikłe z używania lub polegania na tej książce. Z informacji i instrukcji przedstawionych w tej książce należy korzystać na własną odpowiedzialność. Jeśli przykładowy kod lub inne technologie zawarte lub opisywane w tej książce są przedmiotem licencji typu open source lub praw własności intelektualnej innych podmiotów, to czytelnik odpowiada za używanie ich zgodnie z tymi licencjami/prawami.

O’Reilly Media, Inc.

Copyright © by Wydawnictwo Naukowe PWN SA

Warszawa 2020

ISBN 978-83-01-21171-4

eBook został przygotowany na podstawie wydania papierowego z 2020 r., (wyd. I)

Warszawa 2020

Wydawnictwo Naukowe PWN SA

02-460 Warszawa, ul. Gottlieba Daimlera 2

tel. 22 69 54 321, faks 22 69 54 288

infolinia 801 33 33 88

e-mail: pwn@pwn.com.pl; reklama@pwn.pl

www.pwn.pl

Spis treści

Przedmowa

1. Rozpoczynanie podróży

Tematy

Funkcje języka Java

Projekt i architektura oprogramowania

Zasady SOLID

Testowanie

Podsumowanie rozdziałów

Utrwalenie wiedzy

2. Analizator wyciągów bankowych

Wyzwanie

Cel

Wymagania wobec projektu analizatora wyciągów bankowych

Zasada KISS

Zmienne final

Łatwość utrzymania i antywzorce

Boska klasa

Powielanie kodu

Zasada pojedynczej odpowiedzialności

Spójność

Spójność na poziomie klas

Spójność na poziomie metod

Zależność

Testowanie

Testowanie automatyczne

Korzystanie z JUnit

Pokrycie kodu

Wnioski

Utrwalenie wiedzy

Podsumowanie wyzwania

3. Rozszerzanie analizatora wyciągów bankowych

Wyzwanie

Cel

Wymagania wobec rozszerzonego analizatora wyciągów bankowych

Zasada otwarte-zamknięte

Tworzenie wystąpienia interfejsu funkcjonalnego

Wyrażenia lambda

Pułapki interfejsów

Boski interfejs

Zbyt szczegółowy interfejs

API jawne kontra niejawne

Klasy domenowe czy wartości pierwotne?

Wiele eksporterów

Wprowadzenie obiektu domenowego

Definiowanie i implementowanie odpowiedniego interfejsu

Obsługa wyjątków

Dlaczego warto używać wyjątków?

Wzorce i antywzorce stosowania wyjątków

Wytyczne dotyczące stosowania wyjątków

Alternatywy dla wyjątków

Stosowanie narzędzia kompilacji

Dlaczego warto używać narzędzi kompilacji?

Korzystanie z Maven

Korzystanie z Gradle

Wnioski

Utrwalenie wiedzy

Podsumowanie wyzwania

4. System zarządzania dokumentami

Wyzwanie

Cel

Wymagania wobec systemu zarządzania dokumentami

Rozwijanie projektu

Importery

Klasa Document

Atrybuty i hierarchia dokumentów

Implementowanie i rejestrowanie importerów

Zasada podstawienia Liskov (LSP)

Alternatywne podejścia

Zastosowanie klasy Importer

Opcje związane z zasięgiem i hermetyzacją

Rozszerzanie i ponowne używanie kodu

Higiena testów

Nazewnictwo testów

Zachowanie, a nie implementacja

Nie powtarzaj się

Dobra diagnostyka

Testowanie błędów

Stałe

Wnioski

Utrwalenie wiedzy

Podsumowanie wyzwania

5. Silnik reguł biznesowych

Wyzwanie

Cel

Wymagania wobec silnika reguł biznesowych

Programowanie sterowane testami

Dlaczego warto używać techniki TDD?

Cykl TDD

Stosowanie atrap

Dodawanie warunków

Modelowanie stanu

Wnioskowanie typu zmiennej lokalnej

Wyrażenia switch

Zasada segregacji interfejsów

Projektowanie Fluent API

Czym jest Fluent API?

Modelowanie domeny

Wzorzec Budowniczy

Wnioski

Utrwalenie wiedzy

Podsumowanie wyzwania

6. Twootr

Wyzwanie

Cel

Wymagania wobec systemu Twootr

Przegląd projektu

Komunikacja typu pull

Komunikacja typu push

Od zdarzeń do projektu

Komunikacja

Graficzny interfejs użytkownika

Utrwalanie

Architektura sześciokątna

Od czego zacząć

Hasła i bezpieczeństwo

Obserwatorzy i twooty

Modelowanie błędów

Twootowanie

Tworzenie atrap

Weryfikowanie przy użyciu atrap obiektów

Biblioteki do stosowania atrap obiektów

SenderEndPoint

Pozycje

Metody equals i hashcode

Kontrakt między equals a hashCode

Wnioski

Utrwalenie wiedzy

Podsumowanie wyzwania

7. Rozszerzanie Twootra

Wyzwanie

Cel

Przypomnienie

Utrwalanie i wzorzec Repozytorium

Projektowanie repozytoriów

Obiekty kwerend

Programowanie funkcyjne

Wyrażenia lambda

Odwołania do metod

Execute Around

Strumienie

Optional

Interfejs użytkownika

Odwrócenie zależności i wstrzykiwanie zależności

Pakiety i systemy kompilacji

Ograniczenia i uproszczenia

Wnioski

Utrwalenie wiedzy

Podsumowanie wyzwania

8. Podsumowanie

Struktura bazująca na projekcie

Utrwalenie wiedzy

Świadoma praktyka

Kolejne kroki i dodatkowe zasoby

O autorach

O ilustracji na okładce

Przypisy

Przedmowa

Opanowanie sztuki programowania wymaga poznania rozmaitych koncepcji. Dla początkującego lub nawet bardziej doświadczonego programisty to zadanie może się wydawać przeszkodą nie do pokonania. Czy poświęcić czas na naukę metod powszechnie stosowanych w świecie obiektowym, takich jak zasady SOLID, wzorce projektowe lub programowanie sterowane testami (TDD)? A może lepiej zainteresować się technologiami, które stają coraz bardziej popularne, takimi jak programowanie funkcjonalne?

Nawet, gdy wybierzesz metody, których chcesz się nauczyć, często trudno jest ustalić, jak je ze sobą łączyć. Kiedy warto zastosować w projekcie idee programowania funkcyjnego? Kiedy pora zająć się testami? Skąd wiadomo, w którym momencie wyprowadzić lub przedefiniować te techniki? Czy trzeba przeczytać książki poświęcone każdemu z tych zagadnień z osobna, a później zapoznać się z wieloma postami lub wideo, aby wiedzieć, jak połączyć je w całość? Od czego w ogóle zacząć?

Nie martw się, ta książka przychodzi z pomocą. Reprezentuje zintegrowane podejście do nauki poprzez realizację projektów. Przedstawia podstawowe zagadnienia, które trzeba znać, aby stać się wydajnym programistą. A w dodatku pokazuje, jak zintegrować omawiane techniki w większym projekcie.

Dlaczego napisaliśmy tę książkę

Mamy wieloletnie doświadczenie w edukowaniu programistów, jak pisać kod. Jesteśmy autorami książek poświęconych Javie 8 i nowszym wersjom. Prowadziliśmy kursy szkoleniowe w zakresie profesjonalnego tworzenia programowania. Po drodze zostaliśmy uhonorowani tytułem Java Champion oraz byliśmy zapraszani do przemawiania na międzynarodowych konferencjach.

Wieloletnie doświadczenie nauczyło nas, że wielu programistów może skorzystać z wprowadzenia lub odświeżenia wiedzy na różne kluczowe tematy. Wzorce projektowe, programowanie funkcyjne, zasady SOLID i testowanie to praktyki, które są często omawiane niezależnie od siebie, ale rzadko widzimy, jak ze sobą współpracują. Co więcej, szeroki wybór dostępnych technik może na niektórych działać paraliżująco i zniechęcać do nauki. Chcemy nie tylko pomóc czytelnikom w zdobyciu kluczowych umiejętności, lecz także sprawić, że proces ten będzie przystępny i przyjemny.

Z perspektywy programisty

Ta książka umożliwia uczenie się w sposób dostosowany do potrzeb programistów. Zawiera wiele przykładów i omawiając temat, zawsze dostarcza konkretne ilustrujące go fragmenty kodu. Udostępniliśmy pełny kod projektów omawianych w tej książce, dlatego możesz podążać za tekstem, a nawet krok po kroku wykonać kod w zintegrowanym środowisku deweloperskim (Integrated Development Environment, IDE) lub uruchomić programy w celu ich wypróbowania.

Częstą wadą podręczników technicznych jest ściśle naukowy i formalny styl. Zwykli ludzie nie komunikują się w taki sposób. Ta książka jest napisana luźnym stylem, bez protekcjonalnego tonu, dzięki czemu jest bardziej wciągająca.

Co zawiera ta książka?

Każdy rozdział jest oparty na projekcie programistycznym. Po uważnej lekturze rozdziału powinieneś umieć zaimplementować ten projekt. Poziom złożoności projektów rośnie, począwszy od prostych programów wsadowych po w pełni funkcjonalne aplikacje.

Ta bazująca na projekcie struktura przynosi różne korzyści. Po pierwsze, pozwala zobaczyć, w jaki sposób różne techniki programowania współpracują ze sobą w zintegrowanym środowisku. Gdy w końcowej części książki omawiamy programowanie funkcyjne, nie odwołujemy się do abstrakcyjnych operacji przetwarzania kolekcji, lecz do metod obliczania konkretnych wyników potrzebnych w omawianym projekcie. W ten sposób rozwiązujemy problem polegający na tym, że często po zapoznaniu się z materiałem edukacyjnym przedstawiającym dobry pomysł lub technikę programiści wykorzystują je w nieodpowiedni sposób lub w oderwaniu od kontekstu.

Po drugie, podejście oparte na projekcie zapewnia, że na każdym etapie są prezentowane realistyczne przykłady. W materiałach edukacyjnych często są stosowane przykładowe klasy Foo i metody bar. Nasze przykłady odnoszą się do konkretnych projektów i pokazują, jak wykorzystywać omawiane idee do rozwiązywania rzeczywistych problemów, jakie naprawdę można napotkać w pracy.

Ten sposób nauki jest przyjemniejszy i bardziej angażujący. Każdy rozdział jest nowym projektem i okazją do nauczenia się czegoś nowego. Chcemy, abyś przeczytał go do końca i z prawdziwą przyjemnością przewracał strony. Na początku rozdziału znajduje się opis wyzwania do rozwiązania, później omówienie kolejnych etapów implementacji rozwiązania, a na końcu podsumowanie, czego się nauczyłeś i w jaki sposób rozwiązane zostało wyzwanie. Każde wyzwanie opisujemy zarówno na początku, jak i na końcu rozdziału, aby zapewnić, że dobrze rozumiesz jego cele.

Do kogo kierowana jest ta książka?

Jesteśmy przekonani, że programiści wywodzący się z różnych środowisk znajdą w tej książce coś przydatnego i interesującego. Chociaż niektórzy skorzystają najbardziej.

Książkę napisaliśmy przede wszystkim z myślą o początkujących programistach, którzy niedawno ukończyli studia lub programują dopiero od kilku lat. Przedstawiliśmy podstawowe zagadnienia, których znajomość będzie pomocna w dalszej karierze. Aby móc skorzystać z tej książki, nie trzeba mieć wyższego wykształcenia, ale trzeba znać podstawy programowania. Nie będziemy tłumaczyć, do czego służy na przykład instrukcja if czy pętla.

Dobra znajomość zasad programowania obiektowego czy funkcyjnego nie jest wymagana. W rozdziale 2 przyjęliśmy jedynie założenie, że czytelnik wie, czym jest klasa, i potrafi używać kolekcji z typami ogólnymi (np. List<String>). Zaczynamy od samych podstaw.

Inną grupą programistów, których ta książka może szczególnie zainteresować, są osoby uczące się Javy i posiadające doświadczenie w programowaniu w innym języku, takim jak C#, C++ czy Python. Ta książka pomaga w szybkim zapoznaniu się ze składnią języka, a także zasadami, praktykami i idiomami, które odgrywają ważną rolę w pisaniu dobrego kodu Java.

Bardziej doświadczeni programiści Javy mogą pominąć rozdział 2, jeśli nie chcą czytać o podstawowych zagadnieniach, które są im już znane, ale rozdział 3 i kolejne są wypełnione koncepcjami i technikami, które przyniosą korzyści wielu programistom.

Odkryliśmy, że uczenie się może być jednym z najciekawszych aspektów programowania i mamy nadzieję, że Ty również się o tym przekonasz, czytając tę książkę. Życzymy przyjemnej lektury.

Konwencje zastosowane w książce

W tej książce zastosowaliśmy następujące konwencje typograficzne:

Kursywa

Wskazuje nowe terminy, adresy URL oraz adresy e-mail, nazwy i rozszerzenia plików.

Stała szerokość

Stosowana w listingach programów, jak również wewnątrz akapitów do odwoływania się do takich elementów programu, jak nazwy zmiennych lub funkcji, bazy danych, typy danych, zmienne środowiskowe, instrukcje oraz słowa kluczowe.

Stała szerokość, pogrubienie

Wskazuje polecenia lub inny tekst, który ma zostać wpisany przez użytkownika.

Stała szerokość, kursywa

Przedstawia tekst, który należy zastąpić wartościami podanymi przez użytkownika lub wynikającymi z kontekstu.

Taki element wskazuje uwagę ogólną.

Korzystanie z przykładów kodu

Materiały pomocnicze (przykłady kodu, ćwiczenia itd.) można pobrać ze strony https://github.com/Iteratr-Learning/Real-World-Software-Development.

Jeśli masz pytanie techniczne lub problem z korzystaniem z przykładów kodu, wyślij do nas e-mail na adres: bookquestions@oreilly.com.

Ta książka ma pomóc w realizowaniu zadań. Prezentowane w niej przykłady kodu zasadniczo można wykorzystywać we własnych programach i dokumentacji. Nie trzeba kontaktować się z nami w celu uzyskania zezwolenia, o ile nie kopiuje się znacznej części kodu. Na przykład pisanie programu wykorzystującego różne fragmenty kodu z książki nie wymaga zezwolenia. Sprzedaż i dystrybucja przykładów z książek O’Reilly wymaga zezwolenia. Odpowiadanie na pytanie przez zacytowanie tej książki i umieszczonego w niej przykładu kodu nie wymaga zezwolenia, jednak umieszczanie znaczącej części przykładowego kodu z tej książki w dokumentacji własnego produktu już tak.

Będziemy wdzięczni za podanie źródła, choć tego nie wymagamy. Odwołanie do źródła zazwyczaj zawiera tytuł, autora, wydawnictwo i numer ISBN. Na przykład: Real-World Software Development by Raoul-Gabriel Urma and Richard Warburton (O’Reilly). Copyright 2020 Functor Ltd. and Monotonic Ltd., 978-1-491-96717-1.

W razie wątpliwości, czy użycie przykładów kodu wykracza poza ogólnie przyjęte zasady lub określone powyżej zezwolenia, prosimy o kontakt pod adresem: permissions@oreilly.com.

O’Reilly Online Learning

O’Reilly Media od niemal 40 lat oferuje szkolenia techniczne i biznesowe i dostarcza wiedzę, która pomaga firmom w odnoszeniu sukcesu.

Oferujemy jedyną w swoim rodzaju sieć ekspertów i innowatorów, którzy dzielą się swoją wiedzą i doświadczeniem za pośrednictwem książek, artykułów, konferencji i naszej platformy e-learningowej. Platforma e-learningowa O’Reilly zapewnia kolekcję dostępnych na żądanie warsztatów na żywo, kompleksowych ścieżek szkoleniowych, interakcyjnych środowisk programistycznych, a także ogromny zbiór tekstów i wideo z archiwów firmy O’Reilly i ponad dwustu innych wydawców. Dodatkowe informacje można znaleźć na stronie: http://oreilly.com.

Jak się z nami skontaktować

Komentarze i pytania dotyczące tej książki prosimy kierować do wydawnictwa:

O’Reilly Media, Inc.

1005 Gravenstein Highway North

Sebastopol, CA 95472

800-998-9938 (w USA lub Kanadzie)

707-829-0515 (międzynarodowy lub lokalny)

707-829-0104 (fax)

Przygotowaliśmy stronę internetową dla tej książki, na której umieszczamy erratę, przykłady i dodatkowe informacje. Jest ona dostępna pod adresem: https://oreil.ly/RealWorld_SoftwareDev.

Aby przekazać swój komentarz lub zadać pytanie techniczne dotyczące tej książki, można wysłać e-mail na adres: bookquestions@oreilly.com.

Dodatkowe informacje dotyczące naszych książek, kursów, konferencji i aktualnych wydarzeń zawiera strona internetowa: http://www.oreilly.com.

Można nas znaleźć na Facebooku: http://facebook.com/oreilly

albo na Twitterze: http://twitter.com/oreillymedia.

Mamy również kanał YouTube: http://www.youtube.com/oreillymedia.

ROZDZIAŁ 1

Rozpoczynanie podróży

W tym rozdziale przedstawimy koncepcje i reguły przyjęte w książce. Ogólne podejście można byłoby podsumować w następujący sposób: Praktyki i zasady są ważniejsze niż technologie. Istnieje wiele książek poświęconych konkretnym technologiom i nie chcemy dokładać się do tej ogromnej kolekcji. To nie znaczy, że szczegółowa wiedza dotycząca konkretnego języka, frameworka lub biblioteki nie jest przydatna. A jedynie to, że ma krótszy termin przydatności niż ogólne praktyki i zasady, które można stosować przez dłuższy czas i w różnych językach oraz frameworkach. Na tym właśnie polega przydatność tej książki.

Tematy

Aby pomóc w nauce, strukturę tej książki oparliśmy na projektach. Na początek wyjaśniamy, jakie tematy będą poruszane w kolejnych rozdziałach, w jaki sposób są one ze sobą powiązane i dlaczego je wybraliśmy. Oto cztery różne tematy, które przeplatają się w tej książce.

Funkcje języka Java

Definiowanie struktury kodu za pomocą klas i interfejsów omówimy w rozdziale 2. W rozdziale 3 przechodzimy do wyjątków i pakietów. Przedstawimy również krótkie omówienie wyrażeń lambda. Następnie w rozdziale 5 wyjaśnimy wnioskowanie typu zmiennej lokalnej i wyrażenia switch. Na zakończenie w rozdziale 7 szczegółowo omówimy wyrażenia lambda i odwołania do metod. Funkcje języka Java są istotne, ponieważ tak wiele programów jest napisanych w Javie i dlatego warto dobrze poznać ten język. Wiele z tych funkcji językowych przydaje się również w innych językach programowania, takich jak C#, C++, Ruby czy Python. Mimo że te języki różnią się od siebie, wszystkie wymagają zrozumienia sposobu używania klas oraz podstawowych zasad programowania obiektowego.

Projekt i architektura oprogramowania

W tej książce omówimy wiele wzorców projektowych, które pomagają w rozwiązywaniu typowych problemów, jakie napotykają programiści. Warto je znać, ponieważ choć z pozoru każdy projekt programistyczny jest inny i stawia nowe wyzwania, tak naprawdę wiele z nich się powtarza. Zrozumienie typowych problemów i rozwiązań stosowanych przez innych programistów zapobiega ponownemu odkrywaniu Ameryki w nowych projektach programistycznych i pozwala na szybsze dostarczanie niezawodnych programów.

Wysokopoziomowe koncepcje, takie jak zależność i spójność, wprowadzimy już na początku książki w rozdziale 2. Wzorzec Powiadomienie wprowadzimy w rozdziale 3. W rozdziale 5 wyjaśnimy, jak projektować przyjazny dla użytkowników Fluent API oraz wprowadzimy wzorzec Budowniczy. Ogólne omówienie architektury sterowanej zdarzeniami i sześciokątną architekturę można znaleźć w rozdziale 6, natomiast wzorzec Repozytorium w rozdziale 7. Na zakończenie, w rozdziale 7, wprowadzimy programowanie funkcyjne.

Zasady SOLID

Poszczególne zasady SOLID są omówione w różnych rozdziałach. Ten zestaw zasad został zaprojektowany po to, aby ułatwić utrzymywanie oprogramowania. Choć pisanie kodu to dla wielu programistów ulubiona część pracy, to jeśli napisany program okaże się sukcesem, trzeba będzie go dostosowywać, rozwijać i utrzymywać. Gdy oprogramowanie jest proste w utrzymaniu, ułatwia wprowadzanie zmian i dodatkowych funkcji w przyszłości. Zasady SOLID zostały omówione w następujących rozdziałach:

- zasada pojedynczej odpowiedzialności (SRP) – rozdział 2,

- zasada otwarte-zamknięte (OCP) – rozdział 3,

- zasada podstawienia Liskov (LSP) – rozdział 4,

- zasada segregacji interfejsów (ISP) – rozdział 5,

- zasada odwrócenia zależności (DIP) – rozdział 7.

Testowanie

Pisanie solidnego kodu, który można łatwo rozwijać, ma ogromne znaczenie. Testy automatyczne są kluczowe do osiągnięcia tego celu. Gdy napisane oprogramowanie jest skalowane, coraz trudniej jest własnoręcznie przetestować różne możliwe scenariusze. Trzeba zautomatyzować proces testowania, aby własnoręczne przeprowadzanie testów nie zabierało cennego czasu.

Podstawy pisania testów zostały omówione w rozdziałach 2 oraz 4. W rozdziale 5 rozszerzyliśmy to omówienie o programowanie sterowane testami (TDD). W rozdziale 6 opisaliśmy stosowanie test doubles, takich jak atrapy i stubs.

Podsumowanie rozdziałów

Oto zarys rozdziałów.

Rozdział 2. Analizator wyciągów bankowych

Napiszemy program do analizowania wyciągów bankowych, który będzie pomagał użytkownikom w lepszym zrozumieniu ich sytuacji finansowej. W ten sposób będzie można poznać podstawowe techniki projektowania obiektowego, takie jak zasada pojedynczej odpowiedzialności (SRP), spójność i zależność.

Rozdział 3. Rozszerzanie analizatora wyciągów bankowych

W tym rozdziale rozszerzymy kod z rozdziału 2, dodając funkcje z wykorzystaniem podstawowych wzorców projektowych, zasady otwarte-zamknięte i sposobów modelowania niepowodzeń przy użyciu wyjątków.

Rozdział 4. System zarządzania dokumentami

W tym rozdziale pomożemy renomowanej dentystce w lepszym zarządzaniu kartotekami pacjentów. Wprowadzimy takie koncepcje, jak dziedziczenie w projekcie oprogramowania, zasada podstawienia Liskov oraz wady i zalety kompozycji i dziedziczenia. Pokażemy również, jak pisać bardziej niezawodne programy przy użyciu testów automatycznych.

Rozdział 5. Silnik reguł biznesowych

Omówimy budowanie podstawowego silnika reguł biznesowych – sposobu definiowania logiki biznesowej, która jest elastyczna i łatwa w utrzymaniu. W tym rozdziale wprowadzimy takie tematy, jak programowanie sterowane testami, rozwijanie Fluent API oraz zasada segregacji interfejsów.

Rozdział 6. Twootr

Twootr to platforma komunikacyjna, która umożliwia użytkownikom przesyłanie krótkich wiadomości do innych, obserwujących ich użytkowników. W tym rozdziale zbudujemy trzon prostego systemu Twootr. Pokażemy, jak stosować podejście Outside-In – przechodząc od wymagań do trzonu aplikacji. Wyjaśnimy również, jak używać atrap do izolowania i testowania interakcji z różnymi komponentami w bazie kodu.

Rozdział 7. Rozszerzanie Twootra

W ostatnim rozdziale książki bazującym na projekcie rozszerzymy implementację Twootr napisaną w poprzednim rozdziale. Wyjaśnimy zasadę odwrócenia zależności i wprowadzimy szerszy obraz wyborów architektonicznych, takich jak architektura sterowana zdarzeniami i architektura sześciokątna. Ten rozdział może pomóc w rozszerzeniu wiedzy o testowaniu automatycznym. Zawarliśmy w nim omówienie test doubles, takich jak stubs i atrapy oraz funkcji programowania funkcyjnego.

Rozdział 8. Podsumowanie

W ostatnim, podsumowującym rozdziale przypomnimy najważniejsze tematy i idee omówione w książce, a także przedstawimy dodatkowe materiały, które mogą pomóc w rozwijaniu kariery programisty.

Utrwalenie wiedzy

Programiści często podchodzą do projektów w sposób iteracyjny. To znaczy wybierają najważniejsze zadania, których realizacja zajmie tydzień lub dwa, implementują je, a następnie wykorzystują zebrane opinie do zadecydowania, czym zająć się w następnej kolejności. Odkryliśmy, że ta strategia pomaga także w rozwijaniu umiejętności.

Na końcu każdego rozdziału umieściliśmy krótki podrozdział Utrwalenie wiedzy z kilkoma sugestiami, jak we własnym zakresie można rozszerzyć wiedzę zdobytą w rozdziale.

Skoro już wiesz, czego spodziewać się po tej książce, przystąpmy do pracy!