Programowanie_funkcyjne_w_jezyku_C_Tworzenie_lepszych_aplikacji_profun.pdf

(894 KB) Pobierz
Tytuł oryginału: Functional Programming in C++: How to improve your C++
programs using functional techniques
Tłumaczenie: Jacek Janusz
ISBN: 978-83-283-4703-8
Original edition copyright © 2019 by Manning Publications Co.
All rights reserved.
Polish edition copyright © 2019 by HELION SA.
All rights reserved.
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording or by any information storage retrieval system,
without permission from the Publisher.
Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej
publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną,
fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje
naruszenie praw autorskich niniejszej publikacji.
Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich
właścicieli.
Autor oraz Helion SA dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne
i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym
ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Helion SA nie ponoszą również
żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce.
Helion SA
ul. Kościuszki 1c, 44-100 Gliwice
tel. 32 231 22 19, 32 230 98 63
e-mail:
helion@helion.pl
WWW:
http://helion.pl
(księgarnia internetowa, katalog książek)
Pliki z przykładami omawianymi w książce można znaleźć pod adresem:
ftp://ftp.helion.pl/przyklady/profun.zip
Drogi Czytelniku!
Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres
http://helion.pl/user/opinie/profun
Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.
Printed in Poland.
Kup książkę
Poleć książkę
Oceń książkę
Księgarnia internetowa
Lubię to! » Nasza społeczność
Spis treści
Przedmowa
O książce
O autorze
9
11
15
Rozdział 1. Wprowadzenie do programowania funkcyjnego
Co to jest programowanie funkcyjne?
1.1.1.
Związek z programowaniem obiektowym
1.1.2.
Praktyczny przykład porównania programowania imperatywnego
i deklaratywnego
1.2. Funkcje czyste
1.2.1.
Unikanie stanu mutowalnego
1.3. Myślenie w sposób funkcjonalny
1.4. Korzyści wynikające z programowania funkcyjnego
1.4.1.
Zwięzłość i czytelność kodu
1.4.2.
Współbieżność i synchronizacja
1.4.3.
Ciągła optymalizacja
1.5. Przekształcanie C++ w funkcyjny język programowania
1.6. Czego nauczysz się w trakcie czytania tej książki?
Podsumowanie
1.1.
17
18
19
20
24
27
29
31
32
33
33
34
36
36
Rozdział 2. Pierwsze kroki z programowaniem funkcyjnym
2.1.
2.2.
Funkcje używające innych funkcji?
Przykłady z biblioteki STL
2.2.1.
Obliczanie
średnich
2.2.2.
Zwijanie
2.2.3.
Przycinanie
łańcucha
2.2.4.
Partycjonowanie kolekcji na podstawie predykatu
2.2.5.
Filtrowanie i transformacja
2.3. Problemy ze składaniem algorytmów STL
2.4. Tworzenie własnych funkcji wyższego rzędu
2.4.1.
Otrzymywanie funkcji w postaci argumentów
2.4.2.
Implementacja z pętlami
2.4.3.
Rekurencja oraz optymalizacja przez rekurencję ogonową
2.4.4.
Implementacja przy użyciu zwijania
Podsumowanie
39
40
42
42
45
48
50
52
53
55
55
56
57
61
62
Kup książkę
Poleć książkę
4
Spis treści
Rozdział 3. Obiekty funkcyjne
3.1.
Funkcje i obiekty funkcyjne
3.1.1.
Automatyczna dedukcja typu zwracanego
3.1.2.
Wskaźniki do funkcji
3.1.3.
Przeciążanie operatora wywołania
3.1.4.
Tworzenie generycznych obiektów funkcyjnych
3.2. Wyrażenia lambda i domknięcia
3.2.1.
Składnia wyrażenia lambda
3.2.2.
Co się kryje wewnątrz wyrażenia lambda?
3.2.3.
Tworzenie dowolnych zmiennych składowych w wyrażeniach lambda
3.2.4.
Uogólnione wyrażenia lambda
3.3. Tworzenie obiektów funkcyjnych, które są jeszcze bardziej zwięzłe
niż wyrażenia lambda
3.3.1.
Obiekty funkcyjne operatorów w bibliotece STL
3.3.2.
Obiekty funkcyjne operatorów w innych bibliotekach
3.4. Opakowywanie obiektów funkcyjnych przy użyciu std::function
Podsumowanie
63
64
64
67
68
70
73
74
75
77
79
80
83
84
86
88
Rozdział 4. Tworzenie nowych funkcji na podstawie istniejących
4.1.
Częściowe stosowanie funkcji
4.1.1.
Ogólny sposób zamiany funkcji dwuargumentowych
na jednoargumentowe
4.1.2.
Użycie std::bind do wiązania wartości z określonymi argumentami funkcji
4.1.3.
Zamienianie ze sobą argumentów funkcji dwuargumentowej
4.1.4.
Użycie std::bind z funkcjami mającymi więcej argumentów
4.1.5.
Użycie wyrażeń lambda jako alternatywy dla std::bind
4.2. Rozwijanie: inny sposób podejścia do funkcji
4.2.1.
Rozwijanie funkcji w prostszy sposób
4.2.2.
Użycie rozwijania podczas dostępu do bazy danych
4.2.3.
Rozwijanie a częściowe stosowanie funkcji
4.3. Złożenie funkcji
4.4. Podnoszenie funkcji — kolejne podejście
4.4.1.
Odwracanie elementów par w kolekcji
Podsumowanie
89
90
92
95
97
98
101
103
104
106
109
110
113
116
117
Rozdział 5. Czystość: unikanie stanu mutowalnego
5.1.
5.2.
5.3.
5.4.
5.5.
Problemy ze stanem mutowalnym
Funkcje czyste i przejrzystość referencyjna
Programowanie bez efektów ubocznych
Stan mutowalny i niemutowalny w
środowisku
współbieżnym
Duże znaczenie kwalifikatora const
5.5.1.
Logiczna i wewnętrzna zgodność z deklaracją const
5.5.2.
Optymalizacja funkcji składowych dla zmiennych tymczasowych
5.5.3.
Pułapki związane z użyciem słowa kluczowego const
Podsumowanie
119
120
122
125
129
132
134
136
138
140
Kup książkę
Poleć książkę
Spis treści
5
Rozdział 6. Wartościowanie leniwe
Wartościowanie leniwe w C++
Wartościowanie leniwe jako technika optymalizacyjna
6.2.1.
Sortowanie kolekcji przy wykorzystaniu wartościowania leniwego
6.2.2.
Wyświetlanie elementów w interfejsach użytkownika
6.2.3.
Przycinanie drzew rekurencyjnych przez buforowanie wyników funkcji
6.2.4.
Programowanie dynamiczne jako forma wartościowania leniwego
6.3. Uogólnione zapamiętywanie
6.4. Szablony wyrażeń i leniwe
łączenie łańcuchów
6.4.1.
Czystość i szablony wyrażeń
Podsumowanie
6.1.
6.2.
141
142
145
145
147
148
150
152
155
159
160
Rozdział 7. Zakresy
7.1.
7.2.
Wprowadzenie do zakresów
Tworzenie widoków danych tylko do odczytu
7.2.1.
Użycie funkcji filter z zakresami
7.2.2.
Użycie funkcji transform z zakresami
7.2.3.
Wartościowanie leniwe wartości zakresów
7.3. Mutowalność zmiennych w zakresach
7.4. Używanie zakresów ograniczonych i nieskończonych
7.4.1.
Użycie zakresów ograniczonych do optymalizacji obsługi zakresów
wejściowych
7.4.2.
Tworzenie zakresów nieskończonych przy użyciu wartowników
7.5. Używanie zakresów do obliczania częstości pojawiania się słów
Podsumowanie
163
165
166
166
167
168
170
172
172
173
175
178
Rozdział 8. Funkcyjne struktury danych
Niemutowalne listy
łączone
8.1.1.
Dodawanie i usuwanie elementów z początku listy
8.1.2.
Dodawanie i usuwanie elementów z końca listy
8.1.3.
Dodawanie i usuwanie elementów z wnętrza listy
8.1.4.
Zarządzanie pamięcią
8.2. Niemutowalne struktury danych podobne do wektorów
8.2.1.
Wyszukiwanie elementu w drzewie trie
8.2.2.
Dołączanie elementów w drzewie trie
8.2.3.
Aktualizacja elementów w drzewie trie
8.2.4.
Usuwanie elementów z końca drzewa trie
8.2.5.
Inne operacje i całkowita wydajność drzewa trie
Podsumowanie
8.1.
179
180
180
181
182
183
185
187
189
191
192
192
193
Rozdział 9. Algebraiczne typy danych i dopasowywanie do wzorców
9.1.
Algebraiczne typy danych
9.1.1.
Typy sumy uzyskiwane poprzez dziedziczenie
9.1.2.
Typy sumy uzyskiwane dzięki uniom i typowi std::variant
9.1.3.
Implementacja określonych stanów
9.1.4.
Szczególny typ sumy: wartości opcjonalne
9.1.5.
Użycie typów sumy w celu obsługi błędów
195
196
197
200
204
205
207
Kup książkę
Poleć książkę
Zgłoś jeśli naruszono regulamin