Programowanie funkcyjne w języku C++

35,39

Opis

Programowanie funkcyjne w języku C++

Programowanie jest sztuką, dzięki której możesz stworzyć coś z niczego, przy czym tylko od Ciebie zależy, jak doskonałe będzie to dzieło. Dobrze napisany kod jest wydajny, łatwy w testowaniu, można go używać ponownie i wykazuje mniejszą podatność na błędy. Jednym słowem, taki kod powinien możliwie prosto wyrażać złożoną logikę programu, bezproblemowo obsługiwać błędy i przejrzyście implementować współbieżność. Te wymagania pozwoli Ci spełnić funkcyjny styl programowania. Język C++ umożliwia programowanie funkcyjne dzięki szablonom, wyrażeniom lambda i innym ważnym opcjom. Pomocne też będzie korzystanie z biblioteki STL.Ta książka jest przeznaczona dla profesjonalnych programistów C++, którzy chcą opanować funkcyjny styl programowania i dzięki temu wykorzystać w nowy sposób potężne zalety tego języka. Po interesującym wprowadzeniu do tej metodologii w książce zamieszczono dziesiątki przykładów, schematów i ilustracji wyjaśniających koncepcje programowania funkcyjnego w C++. Pokazano, jak tworzyć bezpieczniejszy kod bez obniżania wydajności pracy programu, jak stosować obiekty funkcyjne i funkcje stosowane, algebraiczne typy danych oraz wiele innych. Nie zabrakło praktycznych przykładów kodu, który stanowi znakomite uzupełnienie prezentowanych treści.W tej książce między innymi:wprowadzenie do programowania funkcyjnegofunkcje w C++ i funkcje wyższego rzędu oraz ich rozwijaniewartościowanie leniwe i wykorzystanie go do optymalizacjikorzystanie z funktorów i monadfunkcyjny sposób testowania i debugowania koduProgramowanie funkcyjne w C++: twórz najlepsze rozwiązania!Spis treści:Przedmowa 9O książce 11O autorze 15Rozdział 1. Wprowadzenie do programowania funkcyjnego 171.1. Co to jest programowanie funkcyjne? 181.1.1. Związek z programowaniem obiektowym 191.1.2. Praktyczny przykład porównania programowania imperatywnego i deklaratywnego 201.2. Funkcje czyste 241.2.1. Unikanie stanu mutowalnego 271.3. Myślenie w sposób funkcjonalny 291.4. Korzyści wynikające z programowania funkcyjnego 311.4.1. Zwięzłość i czytelność kodu 321.4.2. Współbieżność i synchronizacja 331.4.3. Ciągła optymalizacja 331.5. Przekształcanie C++ w funkcyjny język programowania 341.6. Czego nauczysz się w trakcie czytania tej książki? 36Podsumowanie 36Rozdział 2. Pierwsze kroki z programowaniem funkcyjnym 392.1. Funkcje używające innych funkcji? 402.2. Przykłady z biblioteki STL 422.2.1. Obliczanie średnich 422.2.2. Zwijanie 452.2.3. Przycinanie łańcucha 482.2.4. Partycjonowanie kolekcji na podstawie predykatu 502.2.5. Filtrowanie i transformacja 522.3. Problemy ze składaniem algorytmów STL 532.4. Tworzenie własnych funkcji wyższego rzędu 552.4.1. Otrzymywanie funkcji w postaci argumentów 552.4.2. Implementacja z pętlami 562.4.3. Rekurencja oraz optymalizacja przez rekurencję ogonową 572.4.4. Implementacja przy użyciu zwijania 61Podsumowanie 62Rozdział 3. Obiekty funkcyjne 633.1. Funkcje i obiekty funkcyjne 643.1.1. Automatyczna dedukcja typu zwracanego 643.1.2. Wskaźniki do funkcji 673.1.3. Przeciążanie operatora wywołania 683.1.4. Tworzenie generycznych obiektów funkcyjnych 703.2. Wyrażenia lambda i domknięcia 733.2.1. Składnia wyrażenia lambda 743.2.2. Co się kryje wewnątrz wyrażenia lambda? 753.2.3. Tworzenie dowolnych zmiennych składowych w wyrażeniach lambda 773.2.4. Uogólnione wyrażenia lambda 793.3. Tworzenie obiektów funkcyjnych, które są jeszcze bardziej zwięzłe niż wyrażenia lambda 803.3.1. Obiekty funkcyjne operatorów w bibliotece STL 833.3.2. Obiekty funkcyjne operatorów w innych bibliotekach 843.4. Opakowywanie obiektów funkcyjnych przy użyciu std::function 86Podsumowanie 88Rozdział 4. Tworzenie nowych funkcji na podstawie istniejących 894.1. Częściowe stosowanie funkcji 904.1.1. Ogólny sposób zamiany funkcji dwuargumentowych na jednoargumentowe 924.1.2. Użycie std::bind do wiązania wartości z określonymi argumentami funkcji 954.1.3. Zamienianie ze sobą argumentów funkcji dwuargumentowej 974.1.4. Użycie std::bind z funkcjami mającymi więcej argumentów 984.1.5. Użycie wyrażeń lambda jako alternatywy dla std::bind 1014.2. Rozwijanie: inny sposób podejścia do funkcji 1034.2.1. Rozwijanie funkcji w prostszy sposób 1044.2.2. Użycie rozwijania podczas dostępu do bazy danych 1064.2.3. Rozwijanie a częściowe stosowanie funkcji 1094.3. Złożenie funkcji 1104.4. Podnoszenie funkcji – kolejne podejście 1134.4.1. Odwracanie elementów par w kolekcji 116Podsumowanie 117Rozdział 5. Czystość: unikanie stanu mutowalnego 1195.1. Problemy ze stanem mutowalnym 1205.2. Funkcje czyste i przejrzystość referencyjna 1225.3. Programowanie bez efektów ubocznych 1255.4. Stan mutowalny i niemutowalny w środowisku współbieżnym 1295.5. Duże znaczenie kwalifikatora const 1325.5.1. Logiczna i wewnętrzna zgodność z deklaracją const 1345.5.2. Optymalizacja funkcji składowych dla zmiennych tymczasowych 1365.5.3. Pułapki związane z użyciem słowa kluczowego const 138Podsumowanie 140Rozdział 6. Wartościowanie leniwe 1416.1. Wartościowanie leniwe w C++ 1426.2. Wartościowanie leniwe jako technika optymalizacyjna 1456.2.1. Sortowanie kolekcji przy wykorzystaniu wartościowania leniwego 1456.2.2. Wyświetlanie elementów w interfejsach użytkownika 1476.2.3. Przycinanie drzew rekurencyjnych przez buforowanie wyników funkcji 1486.2.4. Programowanie dynamiczne jako forma wartościowania leniwego 1506.3. Uogólnione zapamiętywanie 1526.4. Szablony wyrażeń i leniwe łączenie łańcuchów 1556.4.1. Czystość i szablony wyrażeń 159Podsumowanie 160Rozdział 7. Zakresy 1637.1. Wprowadzenie do zakresów 1657.2. Tworzenie widoków danych tylko do odczytu 1667.2.1. Użycie funkcji filter z zakresami 1667.2.2. Użycie funkcji transform z zakresami 1677.2.3. Wartościowanie leniwe wartości zakresów 1687.3. Mutowalność zmiennych w zakresach 1707.4. Używanie zakresów ograniczonych i nieskończonych 1727.4.1. Użycie zakresów ograniczonych do optymalizacji obsługi zakresów wejściowych 1727.4.2. Tworzenie zakresów nieskończonych przy użyciu wartowników 1737.5. Używanie zakresów do obliczania częstości pojawiania się słów 175Podsumowanie 178Rozdział 8. Funkcyjne struktury danych 1798.1. Niemutowalne listy łączone 1808.1.1. Dodawanie i usuwanie elementów z początku listy 1808.1.2. Dodawanie i usuwanie elementów z końca listy 1818.1.3. Dodawanie i usuwanie elementów z wnętrza listy 1828.1.4. Zarządzanie pamięcią 1838.2. Niemutowalne struktury danych podobne do wektorów 1858.2.1. Wyszukiwanie elementu w drzewie trie 1878.2.2. Dołączanie elementów w drzewie trie 1898.2.3. Aktualizacja elementów w drzewie trie 1918.2.4. Usuwanie elementów z końca drzewa trie 1928.2.5. Inne operacje i całkowita wydajność drzewa trie 192Podsumowanie 193Rozdział 9. Algebraiczne typy danych i dopasowywanie do wzorców 1959.1. Algebraiczne typy danych 1969.1.1. Typy sumy uzyskiwane poprzez dziedziczenie 1979.1.2. Typy sumy uzyskiwane dzięki uniom i typowi std::variant 2009.1.3. Implementacja określonych stanów 2049.1.4. Szczególny typ sumy: wartości opcjonalne 2059.1.5. Użycie typów sumy w celu obsługi błędów 2079.2. Modelowanie dziedziny za pomocą algebraicznych typów danych 2129.2.1. Rozwiązanie najprostsze, które czasami jest niewystarczające 2139.2.2. Rozwiązanie bardziej zaawansowane: podejście zstępujące 2149.3. Lepsza obsługa algebraicznych typów danych za pomocą dopasowywania do wzorców 2159.4. Zaawansowane dopasowywanie do wzorców za pomocą biblioteki Mach7 218Podsumowanie 219Rozdział 10. Monady 22110.1. Funktory pochodzące od nie Twojego rodzica 22210.1.1. Obsługa wartości opcjonalnych 22310.2. Monady: więcej możliwości dla funktorów 22610.3. Proste przykłady 22910.4. Składane zakresy i monady 23110.5. Obsługa błędów 23410.5.1. Typ std::optionaljako monada 23410.5.2. Typ expectedjako monada 23610.5.3. Monada Try 23710.6. Obsługa stanu przy użyciu monad 23810.7. Monada współbieżnościowa i kontynuacyjna 24010.7.1. Typ future jako monada 24210.7.2. Implementacja wartości przyszłych 24410.8. Składanie monad 245Podsumowanie 247Rozdział 11. Metaprogramowanie szablonów 24911.1. Zarządzanie typami w czasie kompilacji 25011.1.1. Debugowanie typów dedukowanych 25211.1.2. Dopasowywanie do wzorców podczas kompilacji 25411.1.3. Udostępnianie metainformacji o typach 25711.2. Sprawdzanie właściwości typu w czasie kompilacji 25811.3. Tworzenie funkcji rozwiniętych 26111.3.1. Wywoływanie wszystkich obiektów wywoływalnych 26311.4. Tworzenie języka dziedzinowego 265Podsumowanie 271Rozdział 12. Projektowanie funkcyjne systemów współbieżnych 27312.1. Model aktora: myślenie komponentowe 27412.2. Tworzenie prostego źródła wiadomości 27812.3. Modelowanie strumieni reaktywnych w postaci monad 28112.3.1. Tworzenie ujścia w celu odbierania wiadomości 28312.3.2. Transformowanie strumieni reaktywnych 28612.3.3. Tworzenie strumienia z określonymi wartościami 28812.3.4. Łączenie strumienia strumieni 28912.4. Filtrowanie strumieni reaktywnych 29012.5. Obsługa błędów w strumieniach reaktywnych 29112.6. Odpowiadanie klientowi 29312.7. Tworzenie aktorów ze stanem mutowalnym 29712.8. Tworzenie systemów rozproszonych z użyciem aktorów 298Podsumowanie 299Rozdział 13. Testowanie i debugowanie 30113.1. Czy program, który się kompiluje, jest poprawny? 30213.2. Testy jednostkowe i funkcje czyste 30413.3. Testy generowane automatycznie 30513.3.1. Generowanie przypadków testowych 30613.3.2. Testowanie oparte na właściwościach 30713.3.3. Testy porównawcze 30913.4. Testowanie systemów współbieżnych opartych na monadach 311Podsumowanie 314Skorowidz 315O autorze: Ivan Čukić jest wykładowcą na Wydziale Matematyki Uniwersytetu Belgradzkiego, uczy nowoczesnych technik programowania i programowania funkcyjnego. Od ponad dwudziestu lat używa C++. Stosuje techniki programowania funkcyjnego do tworzenia oprogramowania, z którego korzystają setki milionów osób na całym świecie. Jest jednym z głównych programistów w KDE — największym darmowym projekcie C++ opartym na otwartych źródłach.

: Podręczniki szkolne

renata śliwińska, popularne imię koreańskie, administracja publiczna to, matura chemia rozszerzona, angielski swarzędz, ziołowa 43, dajan, specjalistom

yyyyy