Modern C++ Programming Cookbook İnceleme

Özet


C++ dili gün geçtikçe gelişmekte ve 2011 yılından beri her 3 yılda bir yeni standartları yayımlanmaktadır. 2011 yılı ile yayımlanan C++11 standardı ile artık dil "Modern C++" olarak adlandırılmaktadır. Elbette günümüze kadar dile çok fazla yenilik eklenmiş ve çeşitli değişiklikler yapılmıştır. Ancak bu kadar fazla yeniliği takip etmek her zaman kolay olmayabilir. Bu kitap aslında günümüzdeki C++23 standardına kadar olan önemli modern C++ özelliklerini toparlayıp çeşitli tarifler şeklinde bize sunmaktadır. 140’ın üzerinde tarif içeren bu kitapta, her bir tarifin açıklaması, kod kullanım örnekleri ve tarifte anlatılan özelliklerin nasıl çalıştığı tek tek anlatılmaktadır. Günlük hayatta veya iş hayatında C++ kullanan birisiyseniz muhtemelen bu tarifteki özelliklerden birkaçına ihtiyaç duyarsınız. Bu kitap her seviyeden C++ geliştiricisine hitap etmektedir.

İnceleme

Bölüm 1: Learning Modern Core Language Features (Modern Temel Özellikleri Öğrenme)

Bu bölümde şu konular anlatılmakta ve örnekler verilmektedir:

  • Mümkün olduğunca “auto” kullanmak
  • Tür takma isimleri (type alias) veya şablon takma isimlerini (alias template) oluşturmak
  • Tekdüze ilklendirmeyi (uniform initialization) anlamak
  • Statik olmayan üyelerin ilklendirilmesi ile ilgili çeşitli formları anlamak
  • Nesnelerin hizalanmasını kontrol etmek ve sorgulamak
  • Scoped enum’ları kullanmak
  • Sanal metotlar için “override” ve “final” kullanmak
  • Bir aralık üstünde dolaşmak için range-based for döngüsü kullanmak
  • Kullanıcı tanımlı türler için range-based for kullanımını etkinleştirmek
  • “explicit” yapıcı metotlar ve dönüşüm operatörleri ile bir nesnenin kapalı tür dönüşümünü engellemek
  • Statik global bildirimler yerine isimsiz isim alanlarını (namespace) kullanmak
  • Sembolleri versiyonlamak için “inline” isim alanlarını (namespace) kullanmak
  • Birden fazla geri dönüş değerini ele almak için structured binding kullanmak
  • Class Template Argument Detection (CTAD) ile kodu basitleştirmek
  • Bir koleksiyondeki elemanlara ulaşmak için indis operatörünü (subscript operator) kullanmak

Bölüm 2: Working with Numbers and Strings (Sayılar ve String’ler ile Çalışma)

Bu bölümde şu konular anlatılmakta ve örnekler verilmektedir:

  • Çeşitli nümerik türleri anlamak
  • Nümerik türlerin limitleri ve diğer özellikleri
  • Nümerik ve String türleri arasında dönüşüm yapmak
  • Çeşitli karakter ve String türlerini anlamak
  • Unicode karakterleri çıktı konsoluna yazdırmak
  • Sözde rastgele (pseudo-random) sayılar oluşturmak
  • Bir sözde rastgele sayı oluşturucusunu uygun bir şekilde ilklendirmek
  • Pişirilmiş (cooked) formdaki kullanıcı tanımlı değişmezleri (literals) oluşturmak
  • Ham (raw) formdaki kullanıcı tanımlı değişmezleri (literals) oluşturmak
  • Kaçış karakterlerinden sakınmak için ham String değişmezlerini (raw string literals) kullanmak
  • String’ler için yardımcı bir kütüphane oluşturmak
  • Düzenli ifadeleri (regular expressions) kullanarak bir String’in içeriğini parse etmek
  • Düzenli ifadeleri (regular expressions) kullanarak bir String’in içeriğini değiştirmek
  • Sabit String referansları yerine “std::string_view” kullanmak
  • “std::format” ve “std::print” ile yazıları formatlamak ve yazdırmak
  • “std::format” ile kullanıcı tanımlı türleri kullanmak

Bölüm 3: Exploring Functions (Fonksiyonları Keşfetme)

Bu bölümde şu konular anlatılmakta ve örnekler verilmektedir:

  • Varsayılan yapılmış ve silinmiş fonksiyonlar
  • Standart algoritmalar ile Lamda’ları kullanmak
  • Genelleyici ve şablon Lamda’ları kullanmak
  • Özyineli bir Lambda yazmak
  • Fonksiyon şablonları yazmak
  • Değişken sayıda argüman alan fonskiyon şablonları yazmak
  • Değişken sayıda argüman alan fonksiyon şablonları için katlama ifadelerini (fold expressions) kullanmak
  • Yüksek dereceden fonksiyonları implement etmek
  • Bir yüksek dereceli fonksiyona diğer fonksiyonları yazmak
  • Çağrılabilen her şeyi homojen bir şekilde çağırmak

Bölüm 4: Preprocessing and Compilation (Ön İşleme ve Derleme)

Bu bölümde şu konular anlatılmakta ve örnekler verilmektedir:

  • Kaynak kodunuzu koşulsal bir biçimde derlemek
  • Önişlemci String’leştirme ve birleştirme kalıplarını kullanmak
  • “static_assert” ile derleme zamanı doğrulamalarını gerçekleştirmek
  • “enable_if” ile sınıfları ve fonksiyonları koşulsal olarak derlemek
  • “constexpr if” ile derleme zamanında derlenecek dalları seçmek
  • Attribute’lar ile derleyicilere üst veri sağlamak

Bölüm 5: Standard Library Containers, Algorithms, and Iterators (Standart Kütüphane Kapları, Algoritmaları ve İteratörleri)

Bu bölümde şu konular anlatılmakta ve örnekler verilmektedir:

  • Varsayılan kap (container) olarak vektörleri kullanmak
  • Sabit boyutlu bit serileri için “bitset” kullanmak
  • Değişken boyutlu bit serileri için “vector<bool>” kullanmak
  • Bit manipülasyonu için yardımcı araçları kullanmak
  • Bir aralık (range) içinde elemanları bulmak
  • Bir aralığı sıralamak
  • Bir aralığı ilklendirmek
  • Bir aralık üstünde “set” işlemlerini kullanmak
  • Bir kaba yeni elemanları iteratörler ile eklemek
  • Kendi rastgele erişimli iteratörlerinizi oluşturmak
  • Üye olmayan fonksiyonlar ile kap erişimini sağlamak
  • Doğru standart kapları seçmek

Bölüm 6: General-Purpose Utilities (Genel Amaçlı Yardımcı Özellikler)

Bu bölümde şu konular anlatılmakta ve örnekler verilmektedir:

  • Zaman aralıklarını “chrono::duration” ile ifade etmek
  • Takvimlerle çalışmak
  • Zaman dilimleri arasında zaman dönüşümleri yapmak
  • Standart bir saat ile fonksiyon çalışma zamanını ölçmek
  • Kullanıcı tanımlı türler için hash değerleri oluşturmak
  • Herhangi bir türden değeri depolamak için “std::any” kullanmak
  • Seçeneksel değerleri depolamak için “std::optional” kullanmak
  • Bir değer üretebilen veya üretemeyen hesaplamları zincirleme bir şekilde yapmak
  • Tür güvenlikli (type-safe) “union” oluşturmak için “std::variant” kullanmak
  • Bir “std::variant” nesnesini ziyaret etmek
  • Bir değer veya hata döndürmek için “std::expected” kullanmak
  • Bitişik ardışık nesneler için “std::span” kullanmak
  • Çok boyutlu ardışık nesneler için “std::mdspan” kullanmak
  • Bir program normal bir şekilde sonlandığında çağrılacak bir fonksiyonu kaydetmek
  • Türlerin özelliklerini elde etmek için Type Traits kullanmak
  • Kendi Type Traits’lerinizi yazmak
  • Türler arasında seçim yapmak için “std::conditional” kullanmak
  • “source_location” ile loglama detayları sağlamak
  • Çağrı sırasını yazdırmak için “stacktrace” kütüphanesini kullanmak

Bölüm 7: Working with Files and Streams (Dosya ve Akışlarla Çalışma)

Bu bölümde şu konular anlatılmakta ve örnekler verilmektedir:

  • Ham verileri ikilik dosyalardan okumak ve ikilik dosyalara yazmak
  • Nesneleri ikilik dosyalardan okumak ve ikilik dosyalara yazmak
  • Sabit boyutlu dış tamponlarda akışları (streams) kullanmak
  • Akışlar için yerelleştirme ayarlarını kullanmak
  • Bir akışa yazılan çıktıyı kontrol etmek için I/O manipülatörlerini kullanmak
  • Parayla ilgili I/O manipülatörlerini kullanmak
  • Zamanla ilgili I/O manipülatörlerini kullanmak
  • Dosya sistemi yollarıyla (paths) çalışmak
  • Dizinleri ve dosyaları oluşturmak, silmek ve kopyalamak
  • Bir dosyadan içerik silmek
  • Varolan dosya veya dizinin özelliklerini kontrol etmek
  • Bir dizinin içeriğini numaralandırmak
  • Bir dosyayı bulmak

Bölüm 8: Leveraging Threading and Concurrency (Thred ve Eşzamanlılık Gücünü Sonuna Kadar Kullanma)

Bu bölümde şu konular anlatılmakta ve örnekler verilmektedir:

  • Thread’ler ile çalışmak
  • Mutex ve Lock’ları kullanarak, paylaşılan veriye erişimi senkronize etmek
  • Özyineli Mutex’ler için alternatifler bulmak
  • Thread fonksiyonlarında meydana gelen istisnaları (exceptions) ele almak
  • Thread’ler arasında bildirim göndermek
  • Thread’lerden değer geri döndürmek için Future ve Promise’leri kullanmak
  • Fonksiyonları asenkron bir şekilde çalıştırmak
  • Atomik türleri kullanmak
  • Paralel Map ve Fold yapılarını Thread’leri kullanarak implement etmek
  • Paralel Map ve Fold yapılarını görevleri (tasks) kullanarak implement etmek
  • Paralel Map ve Fold yapılarını standart paralel algoritmaları kullanarak implement etmek
  • Joinable Thread’leri ve iptal etme mekanizmalarını kullanmak
  • Latch, Barrier ve Semaphore ile Thread’leri senkronize etmek
  • Çoklu Thread’lerden çıktı akışlarına yapılan yazmaları senkronize etmek

Bölüm 9: Robustness and Performance (Sağlamlık ve Performans)

Bu bölümde şu konular anlatılmakta ve örnekler verilmektedir:

  • Hataları ele almak için istisnaları (exceptions) kullanmak
  • İstisna fırlatmayan fonksiyonlar için “noexcept” kullanmak
  • Bir programın sabit doğruluğundan (constant correctness) emin olmak
  • Derleme zamanı sabit ifadeleri (constant expressions) oluşturmak
  • Anlık fonksiyonları (immediate functions) oluşturmak
  • Sabit hesapalama yapılan bağlamlardaki kodları optimize etmek
  • Sabit ifadelerinde sanal fonksiyonları (virtual functions) çağırmak
  • Doğru tür dönüşümleri gerçekleştirmek
  • Taşıma semantiğini (move semantics) implement etmek
  • Bir bellek kaynağına eşsiz bir şekilde sahip olmak için “unique_ptr” kullanmak
  • Bir bellek kaynağını paylaşmak için “shared_ptr” kullanmak
  • “<=>” operatörü ile tutarlı karşılaştırma yapmak
  • İşaretli ve işaretsiz tam sayıları güvenli bir şekilde karşılaştırmak

Bölüm 10: Implementing Patterns and Idioms (Kalıpları ve Tarzları İmplement Etme)

Bu bölümde şu konular anlatılmakta ve örnekler verilmektedir:

  • Fabrika kalıbında (factory pattern) sürekli if-else deyimlerinden kaçınmak
  • Pimpl tarzını implement etmek
  • İsimli parametre tarzını implement etmek
  • Sanal olmayan arayüz tarzı ile arayüzlerin ve implementasyonların ayrılması
  • Avukat-müvekkil tarzı (attorney-client idiom) ile arkadaşlıkları ele almak
  • Curiously Recurring Template Pattern ile statik polimorfizm
  • Mixin’ler ile sınıflara fonksiyonalite eklemek
  • Type Erasure Idiom ile alakasız türleri genelleştirilmiş bir biçimde ele almak
  • Bir Thread-safe Singleton implement etmek

Bölüm 11: Exploring Testing Frameworks (Test Çatılarını Keşfetme)

Bu bölümde şu konular anlatılmakta ve örnekler verilmektedir:

  • Boost.Test ile başlangıç
  • Boost.Test ile testleri yazıp çalıştırmak
  • Boost.Test ile doğrulama yapmak (asserting)
  • Boost.Test ile fikstürleri kullanmak
  • Boost.Test ile çıktıyı kontrol etmek
  • Google Test ile başlangıç
  • Google Test ile testleri yazıp çalıştırmak
  • Google Test ile doğrulama yapmak (asserting)
  • Google Test ile test fikstürlerini kullanmak
  • Google Test ile çıktıyı kontrol etmek
  • Catch2 ile başlangıç
  • Catch2 ile testleri yazıp çalıştırmak
  • Catch2 ile doğrulama yapmak (asserting)
  • Catch2 ile çıktıyı kontrol etmek

Bölüm 12: C++ 20 Core Features (C++20 Temel Özellikleri)

Bu bölümde şu konular anlatılmakta ve örnekler verilmektedir:

  • Modüllerle çalışmak
  • Modüllere ayırma mantığını anlamak
  • Konseptler ile şablon argümanları (template arguments) üzerinde isterler belirlemek
  • “requires” ifadelerini ve cümlelerini kullanmak
  • Kısaltılmış fonksiyon şablonlarını keşfetmek
  • “ranges” kütüphanesi ile koleksiyonlar üzerinde dolaşmak
  • Standart “range” adaptörlerini keşfetmek
  • Bir “range”i bir kaba dönüştürmek
  • Kendi “range view”larınızı oluşturmak
  • Kısıtlanmış algoritmaları kullanmak
  • Asenkron hesaplamalar için bir “coroutine” görev türü oluşturmak
  • Ardışık değerler serisi için bir “coroutine” oluşturucu türü oluşturmak
  • “std::generator” türü ile ardışık değerler serisi oluşturmak

Değerlendirme

Bu kitap, tecrübesi ne olursa olsun bütün C++ geliştiricilerine hitap etmektedir. Giriş ve orta seviyedeki C++ geliştiricileri bu kitap ile modern özellikleri öğrenip projelerinde uygulayabilirler. Elbette günümüzde modern C++ standartları ile ilgili pek çok kaynak bulunsa da bu kitap giriş, orta ve ileri düzeylerde 150’ye yakın tarifi içerisinde barındırarak yeni özellikleri sadece tanıtmakla kalmaz, onları nasıl kullanabileceğinizi de anlatır. Ancak yine de okuyucunun fonksiyonlar, sınıflar, şablonlar, isim alanları ve makrolar gibi temel C++ konularını bilmesi, bu kitabı okumasında ona fayda sağlayacaktır. Bu kategorideki bir okuyucu için kitabın dili daha anlaşılır olacaktır.

Kitabın içerisinde çeşitli görsel ve diyagramlardan yararlanılmış olsa da kitabın uzunluğu göz önüne alındığında bunların kullanım nadirliği okyucuyu yorabilmektedir. Giriş seviyesi okuyucular için bu bir problem oluşturabilirken, orta ve ileri düzey okuyucular için bu çok fazla problem olmamaktadır. Bu nedenle görsel ve diyagram kullanımının genel olarak yeterli olduğunu söyleyebiliriz. Özellikle 9. bölümde Thread kullanımının ve paralel algoritmaların etkisini göstermek amacıyla fazlaca diyagram ve tablodan yararlanılmıştır. Bu, bu bölüm için gerçekten de iyi düşünülmüş bir tekniktir.

Piyasada son zamanlarda modern C++ ve onun özelliklerini ele alan pek çok kaynak yayımlanmıştır. Elbette bu kaynakların içinde tıpkı bu kitaptaki gibi uygulama ağırlıklı anlatım yapan (yani tarifler şeklinde bilgi veren) kaynaklar da mevcuttur. Bu nedenle bu kitabı eşsizlik açısından ele almamız hatalı olacaktır. Ancak kitabı kalite açısından değerlendirdiğimizde, kitap kalitesi oldukça iyidir. Konuların kategorilendirilmesi, her bir konunun giriş açıklamasının yapılıp örneklerinin verilmesi ve en önemlisi de konuyla ilgili modern C++ özelliğinin de ayrıntılı bir biçimde açıklanması gerçekten okuyucu için faydalı olmaktadır. Bu kitabı okuyan C++ geliştiricileri, bir modern C++ konusu hakkında bilgi edinmek istediklerinde doğrudan konu başlığından bile aradıkları şeye rahatça ulaşabilirler ve bilgi edinebilirler.

Kitapta açıklamadan çok kod örneği bulunmakta ve her bir konu bu kod örnekleri ile pekiştirilmeye çalışılmaktadır. Bu nedenle kitabın örneklendirme kalitesi ve kod sayısı oldukça iyi bir durumdadır. Çıktılar doğrudan görsel olarak değil, formatlanmış yazı olarak kitaba basılmıştır. Ancak yazarın tercih ettiği kod stili ve kod renk paleti her okuyucuya hitap etmeyebilir ve kodu okurken zorluk çıkarabilir. Basit örneklerde bu durum çok problem olmazken, uzun ve karışık örneklerde bu durum kendini daha çok belli etmektedir. Ancak yine de bu kadar fazla kod örneği ile konuları anlatmaya çalışan bir kaynak için bu konudan dolayı ciddi bir puan kırmayı doğru bulmuyorum.

Sonuç olarak bu kitap, modern C++ özelliklerinin C++23 standardına kadar olan kısmını içerisinde çeşitli örnek senaryolarla anlatmaya çalışan bir kitaptır. Anlatımlarını çeşitli tarifler çerçevesinde yapmaktadır. Doğrudan konu bazlı kategorileme yapmamakta, anlatılan konuyu o tarifin içerisinde açıklamaktadır. Kitabın dili oldukça anlaşılır olsa da giriş seviyesinde veya C++ temelleri hakkında çok bilgisi olmayan kişiler için bazı yerler anlaşılmaz kalabilir. Görsel ve diyagram kullanımı yeterlidir, ancak kitabın uzunluğuna baktığımızda bazı yerlerde daha fazla görsel ve diyagramın kullanılabileceğini düşünüyorum. İçerik eşsiz değil, ancak kalitelidir. Piyasada bu konuda pek çok kitap bulunsa da bu kitap modern C++ özellikleri ve bunların uygulamaları ile ilgili genel bir toparlama olarak düşünülebilir. Kullanılan örneklerin sayısı ve kalitesi ise gayet iyidir. Modern C++ ile ilgilenen tüm okuyuculara bu kitaba göz atmasını öneririm.

Modern C++ Programming Cookbook İnceleme Özeti


Tam İsim: Modern C++ Programming Cookbook: Master Modern C++ with comprehensive solutions for C++23 and all previous standards
Basım No: 3rd Edition
Yazarlar: Marius Bancila
Yayımlama Tarihi: 29 Şubat 2024
Sayfa Sayısı: 816
Anlaşılabilirlik/Okunabilirlik
Görsel/Diyagram Kullanımı
İçerik Kalitesi/Eşsizliği
Örneklendirme/Örnek Kalitesi

Sonuç Özeti

Sonuç olarak bu kitap, modern C++ özelliklerinin C++23 standardına kadar olan kısmını içerisinde çeşitli örnek senaryolarla anlatmaya çalışan bir kitaptır. Anlatımlarını çeşitli tarifler çerçevesinde yapmaktadır. Doğrudan konu bazlı kategorileme yapmamakta, anlatılan konuyu o tarifin içerisinde açıklamaktadır. Kitabın dili oldukça anlaşılır olsa da giriş seviyesinde veya C++ temelleri hakkında çok bilgisi olmayan kişiler için bazı yerler anlaşılmaz kalabilir. Görsel ve diyagram kullanımı yeterlidir, ancak kitabın uzunluğuna baktığımızda bazı yerlerde daha fazla görsel ve diyagramın kullanılabileceğini düşünüyorum. İçerik eşsiz değil, ancak kalitelidir. Piyasada bu konuda pek çok kitap bulunsa da bu kitap modern C++ özellikleri ve bunların uygulamaları ile ilgili genel bir toparlama olarak düşünülebilir. Kullanılan örneklerin sayısı ve kalitesi ise gayet iyidir. Modern C++ ile ilgilenen tüm okuyuculara bu kitaba göz atmasını öneririm.

4.4
0 0 votes
Article Rating
Subscribe
Bildir
guest

0 Yorum
Eskiler
En Yeniler Beğenilenler