Nowoczesne projektowanie w C++. Uogólnione implementacje wzorców projektowych - Helion

Tytuł oryginału: Modern C++ Design
Tłumaczenie: Przemysław Szeremiota
ISBN: 978-83-246-3301-2
stron: 352, Format: 172x245, okładka: twarda
Data wydania: 2011-07-14
Księgarnia: Helion
Cena książki: 69,00 zł
Korzystaj z nowoczesnych technik w C++!
- Jak korzystać z wzorców projektowych w C++?
 - Jak stworzyć dokładnie jedną instancję obiektu?
 - Jak używać inteligentnych wskaźników?
 
Język C++ jest obecny na rynku już niemal trzydzieści lat, a jednak nadal świetnie spełnia swoje zadania. Jest powszechnie używany, a wręcz niezastąpiony w wielu dziedzinach programowania. Wszędzie tam, gdzie potrzebna jest najwyższa wydajność oraz pełna kontrola nad zasobami i przebiegiem programu, sprawdza się wyśmienicie. Wystarczy odrobina chęci, dobry podręcznik i trochę czasu, aby wykorzystać pełną moc C++ w nowoczesnych technikach programowania.
Książkę, która Ci w tym pomoże, trzymasz właśnie w rękach. Czy znajdziesz czas i ochotę, aby zgłębić zawartą w niej wiedzę? Gwarantujemy, że warto! W trakcie lektury dowiesz się, jak zaimplementować w C++ najpopularniejsze wzorce projektowe. Dzięki nim błyskawicznie oprogramujesz typowe rozwiązania. Nauczysz się tworzyć dokładnie jedną instancję obiektu oraz zobaczysz, jak korzystać z fabryki obiektów czy inteligentnych wskaźników. Ponadto zapoznasz się z technikami projektowania klas, asercjami w trakcie kompilacji oraz uogólnionymi funktorami. Dzięki tej książce poczujesz na nowo satysfakcję z pisania programów w języku C++!
- Projektowanie klas
 - Asercje czasu kompilacji
 - Listy typów
 - Alokowanie małych obiektów
 - Funktory uogólnione
 - Inteligentne wskaźniki
 - Fabryka obiektów i fabryka abstrakcyjna
 - Tworzenie dokładnie jednego obiektu - wzorzec singleton
 - Multimetody
 
Czerp satysfakcję z korzystania z nowoczesnych technik programowania w C++!
Spis treści
Nowoczesne projektowanie w C++. Uogólnione implementacje wzorców projektowych -- spis treści
Przedmowy   (9)
 
Wstęp   (13)
 
Podziękowania   (19)
 
I: Techniki   (21)
 
1. Klasy konfigurowane wytycznymi   (23)
 
- 1.1. Projektowanie oprogramowania - klęska urodzaju?   (23)
 - 1.2. Porażka interfejsu "wszechstronnego"   (24)
 - 1.3. Ratunek w wielodziedziczeniu?   (26)
 - 1.4. Zalety szablonów   (26)
 - 1.5. Wytyczne i klasy wytycznych   (28)
 - 1.6. Wytyczne rozszerzone   (32)
 - 1.7. Destruktory klas wytycznych   (33)
 - 1.8. Elementy opcjonalne w konkretyzacji częściowej   (34)
 - 1.9. Łączenie klas wytycznych   (35)
 - 1.10. Klasy wytycznych a konfigurowanie struktury   (37)
 - 1.11. Wytyczne zgodne i niezgodne   (38)
 - 1.12. Dekompozycja klas na wytyczne   (40)
 - 1.13. Podsumowanie (42)
 
2. Techniki   (43)
 
- 2.1. Asercje statyczne   (44)
 - 2.2. Częściowa specjalizacja szablonu   (46)
 - 2.3. Klasy lokalne   (48)
 - 2.4. Mapowanie stałych na typy   (49)
 - 2.5. Odwzorowanie typu na typ   (52)
 - 2.6. Wybór typu   (53)
 - 2.7. Statyczne wykrywanie dziedziczenia i możliwości konwersji   (55)
 - 2.8. TypeInfo   (58)
 - 2.9. NullType i EmptyType   (60)
 - 2.10. Cechy typów   (61)
 - 2.11. Podsumowanie (68)
 
3. Listy typów   (71)
 
- 3.1. Listy typów - do czego?   (71)
 - 3.2. Definiowanie list typów   (73)
 - 3.3. Liniowe tworzenie list typów   (75)
 - 3.4. Obliczanie długości listy   (76)
 - 3.5. Przygrywka   (77)
 - 3.6. Dostęp swobodny (indeksowany)   (77)
 - 3.7. Przeszukiwanie list typów   (79)
 - 3.8. Dopisywanie do listy typów   (80)
 - 3.9. Usuwanie typu z listy   (81)
 - 3.10. Usuwanie duplikatów   (82)
 - 3.11. Zastępowanie elementu na liście typów   (83)
 - 3.12. Częściowe porządkowanie listy typów   (84)
 - 3.13. Generowanie klas z list typów   (87)
 - 3.14. Podsumowanie   (97)
 - 3.15. Listy typów - na skróty (97)
 
4. Przydział pamięci dla niewielkich obiektów   (101)
 
- 4.1. Domyślny alokator pamięci dynamicznej   (102)
 - 4.2. Zasada działania alokatora pamięci   (102)
 - 4.3. Alokator małych obiektów   (104)
 - 4.4. Chunk   (105)
 - 4.5. Alokator przydziałów o stałym rozmiarze   (108)
 - 4.6. Klasa SmallObjAlocator   (112)
 - 4.7. 3 x Tak   (113)
 - 4.8. Proste, skomplikowane, a potem znów proste   (116)
 - 4.9. Konfigurowanie alokatora   (117)
 - 4.10. Podsumowanie   (118)
 - 4.11. Alokator małych obiektów - na skróty (119)
 
II: Komponenty   (121)
 
5. Uogólnione obiekty funkcyjne   (123)
 
- 5.1. Wzorzec Command   (124)
 - 5.2. Wzorzec Command w praktyce   (126)
 - 5.3. Byty funkcyjne w C++   (127)
 - 5.4. Szkielet szablonu klasy Functor   (129)
 - 5.5. Delegowanie wywołania Functor::operator()   (133)
 - 5.6. Funktory   (135)
 - 5.7. Raz a dobrze   (137)
 - 5.8. Konwersje typów argumentów i wartości zwracanej   (139)
 - 5.9. Wskaźniki do metod   (140)
 - 5.10. Wiązanie argumentów wywołania   (144)
 - 5.11. Żądania skomasowane   (147)
 - 5.12. Z życia wzięte (1) - duży koszt delegacji funkcji   (147)
 - 5.13. Z życia wzięte (2) - alokacje na stercie   (149)
 - 5.14. Szablon Functor w implementacji cofnij-powtórz   (150)
 - 5.15. Podsumowanie   (151)
 - 5.16. Functor - na skróty (152)
 
6. Singletony   (155)
 
- 6.1. Statyczne dane i statyczne funkcje nie czynią singletona   (156)
 - 6.2. Podstawowe idiomy C++ dla singletonów   (157)
 - 6.3. Wymuszanie unikalności   (158)
 - 6.4. Usuwanie singletona   (159)
 - 6.5. Problem martwych referencji   (162)
 - 6.6. Problem martwych referencji (1) - singleton a la feniks   (164)
 - 6.7. Problem martwych referencji (2) - sterowanie żywotnością   (167)
 - 6.8. Implementowanie singletonów z żywotnością   (169)
 - 6.9. Życie w wielu wątkach   (173)
 - 6.10. Podsumowanie doświadczeń   (176)
 - 6.11. Stosowanie szablonu SingletonHolder   (181)
 - 6.12. Podsumowanie   (183)
 - 6.13. Szablon klasy SingletonHolder - na skróty (183)
 
7. Inteligentne wskaźniki   (185)
 
- 7.1. Elementarz inteligentnych wskaźników   (186)
 - 7.2. Oferta   (187)
 - 7.3. Przydział obiektów inteligentnych wskaźników   (188)
 - 7.4. Metody inteligentnego wskaźnika   (190)
 - 7.5. Strategie zarządzania posiadaniem   (191)
 - 7.6. Operator pobrania adresu   (199)
 - 7.7. Niejawna konwersja na typ gołego wskaźnika   (200)
 - 7.8. Równość i różność   (202)
 - 7.9. Porównania porządkujące   (207)
 - 7.10. Kontrola i raportowanie o błędach   (210)
 - 7.11. Wskaźniki niemodyfikowalne i wskaźniki do wartości niemodyfikowalnych   (211)
 - 7.12. Tablice   (212)
 - 7.13. Inteligentne wskaźniki a wielowątkowość   (213)
 - 7.14. Podsumowanie doświadczeń   (217)
 - 7.15. Podsumowanie   (223)
 - 7.16. Wskaźniki SmartPtr - na skróty (224)
 
8. Wytwórnie obiektów   (225)
 
- 8.1. Przydatność wytwórni obiektów   (226)
 - 8.2. Wytwórnie obiektów w C++ - klasy a obiekty   (228)
 - 8.3. Implementowanie wytwórni obiektów   (229)
 - 8.4. Identyfikatory typu   (234)
 - 8.5. Uogólnienie   (235)
 - 8.6. Sprostowania   (239)
 - 8.7. Wytwórnie klonów   (240)
 - 8.8. Stosowanie wytwórni obiektów z innymi komponentami uogólnionymi   (243)
 - 8.9. Podsumowanie   (244)
 - 8.10. Szablon klasy Factory - na skróty   (244)
 - 8.11. Szablon klasy CloneFactory - na skróty (245)
 
9. Wzorzec Abstract Factory   (247)
 
- 9.1. Rola wytwórni abstrakcyjnej w architekturze   (247)
 - 9.2. Interfejs uogólnionej wytwórni abstrakcyjnej   (251)
 - 9.3. Implementacja AbstractFactory   (254)
 - 9.4. Implementacja wytwórni abstrakcyjnej z prototypowaniem   (256)
 - 9.5. Podsumowanie   (261)
 - 9.6. Szablony AbstractFactory i ConcreteFactory - na skróty (262)
 
10. Wzorzec Visitor   (265)
 
- 10.1. Elementarz modelu wizytacji   (265)
 - 10.2. Przeciążenia i metoda wychwytująca   (271)
 - 10.3. Wizytacja acykliczna   (273)
 - 10.4. Uogólniona implementacja wzorca Visitor   (278)
 - 10.5. Powrót do wizytacji "cyklicznej"   (284)
 - 10.6. Wariacje   (287)
 - 10.7. Podsumowanie   (290)
 - 10.8. Uogólnione komponenty wzorca wizytacji - na skróty (290)
 
11. Wielometody   (293)
 
- 11.1. Czym są wielometody?   (294)
 - 11.2. Przydatność wielometod   (295)
 - 11.3. Podwójne przełączanie - metoda siłowa   (296)
 - 11.4. Metoda siłowa w wersji automatyzowanej   (298)
 - 11.5. Symetria rozprowadzania metodą siłową   (303)
 - 11.6. Rozprowadzanie logarytmiczne   (307)
 - 11.7. Symetria w FnDispatcher   (312)
 - 11.8. Podwójne rozprowadzanie do funktorów   (313)
 - 11.9. Konwertowanie argumentów - statyczne czy dynamiczne?   (316)
 - 11.10. Wielometody o stałym czasie rozprowadzania   (321)
 - 11.11. BasicDispatcher i BasicFastDispatcher w roli wytycznych   (324)
 - 11.12. Naprzód   (325)
 - 11.13. Podsumowanie   (327)
 - 11.14. Podwójne rozprowadzanie - na skróty (328)
 
A: Minimalistyczna biblioteka wielowątkowa   (333)
 
- A.1. Krytyka wielowątkowości   (334)
 - A.2. Podejście a la Loki   (335)
 - A.3. Operacje niepodzielne na typach całkowitoliczbowych   (335)
 - A.4. Muteksy   (337)
 - A.5. Semantyka blokowania w programowaniu obiektowym   (339)
 - A.6. Opcjonalny modyfikator volatile   (341)
 - A.7. Semafory, zdarzenia i inne   (342)
 - A.8. Podsumowanie (342)
 
Bibliografia   (343)
 
Skorowidz   (345)
      
