Читать книгу Programowanie funkcyjne w języku C#. Jak pisać lepszy kod - Enrico Buonanno - Страница 10
ОглавлениеCelem tej książki jest pokazanie, jak można wykorzystać techniki funkcyjne w języku C#, aby pisać kod, który jest zwięzły, elegancki, działający bez zarzutu i łatwy w utrzymaniu.
Kto powinien przeczytać tę książkę
Książka przeznaczona jest dla ambitnych deweloperów. Znasz język C# i .NET Framework. Masz doświadczenie w tworzeniu rzeczywistych aplikacji i znasz pojęcia programowania obiektowego (OOP), wzorce i najlepsze praktyki. Szukasz jednak możliwości poszerzenia swego arsenału, ucząc się technik funkcyjnych, aby jak najlepiej wykorzystać C# jako język o wielu paradygmatach.
Jeśli próbujesz lub planujesz naukę języka funkcyjnego, ta książka będzie także bardzo cenna, gdyż nauczysz się myśleć funkcyjnie w języku, który znasz. Zmiana sposobu myślenia jest trudna: gdy ją osiągniemy, nauka składni dowolnego języka będzie względnie łatwa.
Jak zorganizowana jest ta książka
Książka składa się z 15 rozdziałów podzielonych na 3 części.
■ Część 1 obejmuje podstawowe techniki i zasady programowania funkcyjnego. Najpierw przyjrzymy się, czym jest programowanie funkcyjne i jak jest ono wspierane przez C#. Zajmiemy się możliwościami funkcji wyższego rzędu, czystością funkcji i jej powiązaniem z możliwością testowania, projektowaniem typów i sygnaturami funkcji oraz jak za pomocą prostych funkcji można tworzyć skomplikowany program. Na koniec części 1 będziemy mieli dobre wyobrażenie, jak wygląda program napisany w stylu funkcyjnym i jakie korzyści daje.
■ Mając za sobą te podstawy, w części 2 przyspieszymy i przejdziemy do bardziej skomplikowanych problemów, jak funkcyjna obsługa błędów, modularyzacja i kompozycja aplikacji oraz funkcyjne podejście do zrozumienia stanu i reprezentacji zmian. Po ukończeniu części 2 uzyskamy zestaw narzędzi pozwalających nam na efektywne zajęcie się wieloma zadaniami z programowania za pomocą podejścia funkcyjnego.
■ Część 3 podejmuje bardziej zaawansowane tematy, w tym leniwe wartościowanie, przetwarzanie stanowe, asynchroniczność, strumienie danych i współbieżność. Każdy rozdział z tej części wprowadza ważne techniki, które mają potencjał do gruntownej zmiany sposobu pisania przez nas oprogramowania i myślenia o nim.
Na stronie kontrtytułowej książki znajduje się bardziej szczegółowy podział na tematy każdego rozdziału oraz informacja o tym, które rozdziały należy przeczytać przed każdym konkretnym rozdziałem.
Kodowanie rzeczywistych aplikacji
Celem książki jest trzymanie się prawdziwych scenariuszy. Dlatego też wiele przykładów dotyczy praktycznych zadań, jak odczyt konfiguracji, łączenie z bazą danych, walidacja żądań HTTP i tak dalej – tematy, które są zapewne każdemu znane, ale zobaczymy je z całkiem świeżej perspektywy myślenia funkcyjnego.
W całej książce korzystam z bardziej rozbudowanego przykładu, aby zilustrować, jak programowanie funkcyjne (FP) może pomóc przy pisaniu aplikacji LOB. W tym celu wybrałem aplikację bankową online w fikcyjnym banku Bank of Codeland (BOC) – wiem, że to tandetne, ale przynajmniej ma obowiązkowy trzyliterowy akronim. Ponieważ większość ludzi ma dostęp do banków w trybie online, wyobrażenie sobie wymaganej funkcjonalności i zobaczenie, jak omawiany problem ma się do prawdziwych aplikacji, powinno być łatwe.
Używam także scenariuszy ilustrujących, jak rozwiązać typowe problemy programistyczne w stylu funkcyjnym. Ciągłe przechodzenie od przykładów praktycznych do koncepcji FP i na odwrót pozwoli, mam nadzieję, zmniejszyć dystans między teorią a praktyką – czego, jak wspomniałem, brakowało mi w istniejącej literaturze.
Wykorzystywanie funkcyjnych bibliotek
Język taki jak C# może mieć cechy funkcyjne, ale aby je w pełni wykorzystać, nierzadko używamy bibliotek, które upraszczają często wykonywane zadania. Microsoft udostępnił kilka bibliotek, które ułatwiają programowanie w stylu funkcyjnym, w tym następujące:
■ System.Linq – Tak, jeśli tego nie wiecie, ta biblioteka jest funkcyjna! Przypuszczam, że wszyscy ją znają, biorąc pod uwagę, że jest to tak istotna część .NET.
■ System.Collections.Immutable – Ta biblioteka zawiera niemutowalne kolekcje, których zaczynamy używać w rozdziale 9.
■ System.Reactive – Jest to implementacja Reactive Extensions for .NET, pozwalająca nam na pracę ze strumieniami danych, co jest omawiane w rozdziale 14.
Pominięto tu wiele innych ważnych typów i funkcji, które są istotne dla FP. Dlatego wielu niezależnych deweloperów napisało biblioteki, które wypełniają te luki. Obecnie najpełniejszą z nich jest LanguageExt, biblioteka napisana przez Paula Loutha w celu poprawy pracy dewelopera C# programującego funkcyjnie1. W książce nie korzystam bezpośrednio z LanguageExt. Pokazuję za to, jak opracowałem własną bibliotekę narzędzi funkcyjnych o nazwie LaYumba.Functional, choć w dużej części pokrywa się ona z LanguageExt. Jest to z kilku powodów bardziej użyteczne w nauce:
■ Kod pozostanie stabilny po opublikowaniu książki.
■ Zajrzymy do wnętrza i zobaczymy, że moc konstrukcji funkcyjnych jest zwodniczo prosta do zdefiniowania.
■ Możemy skoncentrować się na najważniejszym: pokażę konstrukcje w ich najczystszej postaci, więc szczegóły i przypadki szczególne, które uwzględnia pełna biblioteka, nie będą odwracać uwagi.
Konwencje pisania kodu i materiały
Przykładowe kody są napisane w C# 7 i w większości są zgodne z C# 6. Funkcje języka wprowadzone w wersji C# 7 są używane jedynie w rozdziale 10 i następnych (oraz w kilku przykładach w punkcie 1.2, które dotyczą działania C# 7).
Możemy wykonać wiele krótszych fragmentów kodu w REPL, zyskując w ten sposób praktykę z natychmiastowym rezultatem. Bardziej rozbudowane przykłady są dostępne do pobrania pod adresem https://github.com/la-yumba/functional-csharp-code, wraz z ustawieniami i rozwiązaniami.
Listingi kodu zawarte w książce skupiają się na omawianym temacie i dlatego omijają przestrzenie nazw, instrukcje using, trywialne konstruktory oraz części kodu, które pojawiły się w poprzednim listingu i pozostają bez zmian. Pełną, możliwą do skompilowania wersję listingu można znaleźć w repozytorium kodu: https://github.com/la-yumba/functional-csharp-code.
Enrico Buonanno uzyskał w 2001 roku stopień magistra nauk komputerowych na uniwersytecie Columbia i od tamtej pory pracuje jako deweloper oprogramowania i architekt systemów.
Pracował nad ważnymi projektami dla prestiżowych firm w branży FinTech (w tym dla Bank for International Settlements, Barclays i UBS) i innych biznesów opartych na technologii.