C++ Best Practices İnceleme

Özet

Özellikle YouTube’daki C++ Weekly With Jason Turner isimli kanalına attığı haftalık C++ videolarıyla bilinen Jason Turner’ın Leanpub’da yayımladığı ve sürekli güncellediği bu kitabında, haftalık video serilerinde ve Web sayfasında yıllardır C++ ile ilgili bahsettiği konuların bir özeti yer almaktadır. Halihazırda C++ bilenler için tavsiye öğelerini içeren bu kitap, C++20 de dahil olmak üzere güncel standartları baz almaktadır. Bu kitapta yer alan bilgiler ile C++’ın pratik kullanımı konusunda kendinizi daha da geliştirmeniz amaçlanmaktadır. Ayrıca bu kitap C++’ın temel özelliklerinin yanında, çeşitli yardımcı araçları ve teorik bilgileri anlatan bölümleri de içermektedir.

İnceleme

Bölüm 1: Introduction (Giriş)

Kitabın giriş bölümüdür. Bu bölümde yazar, herkesten şunları öğrenmesini istemekte ve bu doğrultuda eğitim verdiğini söylemektedir:

  1. Kendi kendinize nasıl deney yapabileceğinizi öğrenmek
  2. Sadece bu kitabın yazarına inanmayıp kendiniz test ederek öğrenmek
  3. Dilin nasıl çalıştığını öğrenmek
  4. Son jenerasyonun yaptığı hataların aynılarını yapmamak

Bölüm 2: About Best Practices (En İyi Pratikler Hakkında)

En iyi pratiklerin şunlarla ilgili avantajları olduğu anlatılmaktadır:

  1. Yaygın yapılan hataları azaltmak
  2. Hataları daha hızlı bulmak
  3. Performanstan ödün vermemek (ve genellikle onu geliştirmek)

Bölüm 3: Use the Tools: Automated Tests (Araçları Kullanın: Otomasyon Testleri)

Bu bölümde C++’da "Catch2", "doctest", "GoogleTest" ve "Boost.Test" gibi Framework’ler ile C++ projelerinizde otomasyon testlerinin yer alması gerektiği anlatılmaktadır.

Bölüm 4: Use the Tools: Continuous Builds (Araçları Kullanın: Sürekli Buildler)

Bu bölümde öncelikle yazar x86, x64, SPARC, ARM ve MIPSEL gibi çok farklı mimarilerde ve Windows, Solaris, MacOS, GNU/Linux gibi çok farklı işletim sistemlerinde çalıştığını söylemektedir. Daha sonra çoklu mimarileri ve platformları içeren projelerde değişiklik yaptığınızda sıkıntıların kaçınılmaz olduğundan ve bu problemleri çözmek için sürekli Build araçlarından faydalanmanız gerektiğinden bahsetmektedir.

Bölüm 5: Use the Tools: Compiler Warnings(Araçları Kullanın: Derleyici Uyarıları)

Bu bölümde öncelikle "-Wall" derleyici seçeneğinin GCC ve Clang derleyicilerinde bütün uyarıları vermekte yetersiz kaldığı ve "-Wextra" seçeneğinin de kullanılması gerektiği anlatılmaktadır. Daha iyi bir kod deneyimi için derleyici uyarılarını açmanız tavsiye edilmektedir. Ayrıca standartlara uygun yazmak istediğiniz kodlarda GCC/Clang için "-Wpedantic", MSVC için ise "/permissive-" seçeneklerinin kullanılması gerektiğinden bahsedilmektedir. Bu uyarı mesajlarını baştan dikkate almanızın ileride yapılacak değişikliklerde çok faydasının olduğu da söylenmektedir.

Bölüm 6: Use the Tools: Static Analysis (Araçları Kullanın: Statik Analiz)

Bu bölümde projelerinizde statik analiz araçlarını kullanmanızın öneminden ve örnek olarak "cppcheck" ile "clang-tidy" araçlarından bahsedilmektedir.

Bölüm 7: Use the Tools: Sanitizers (Araçları Kullanın: Dezenfektanlar)

Bu bölümde ise çalışma zamanı analiz araçları olan dezenfektanlardan (sanitizers) ve onların kullanımlarından bahsedilmektedir. Adres, tanımsız davranış, Thread ve bellek gibi çok farklı çalışma zamanı analiz araçlarının var olduğundan ve bunların C++ projelerinde kullanılan örneklerinden bahsedilmektedir.

Bölüm 8: Slow Down (Yavaşlayın)

Bu bölüm bir ara bölüm niteliğindedir. C++’ta bir problemin çözümü için düzinelerce farklı yol bulunduğundan ve bir problem ile karşılaştığınızda aceleyle bunları projelerinize yapıştırıp kullanmamanız gerektiğinden bahsedilmektedir.

Bölüm 9: C++ Is Not Magic (C++ Sihir Değildir)

Bu bölüm C++’ın bir kara kutu veya sihir olmadığını anlatan bir hatırlatıcı niteliğinde bölümdür. Eğer C++ ile ilgili bir sorunuz olursa, kendiniz bir deney ortamı kurup bu sorunun çözümünü yine kendinizin arayıp bulması gerektiği anlatılmaktadır.

Bölüm 10: C++ Is Not Object-Oriented (C++ Nesne Yönelimli Değildir)

Bu bölümde C++’ın sadece nesne yönelimli programlama paradigmasını değil; prosedürel, fonksiyonel, genelleyici ve derleme zamanı programlama paradigmalarını da destekleyen bir dil olduğundan bahsedilmektedir. C++’ı bunu bilerek kullanmanız önerilmektedir.

Bölüm 11: Learn Another Language (Başka Bir Dil Öğrenin)

Bu bölümde C++’ın sadece nesne yönelimli bir programlama dili olmadığından dolayı diğer programlama tekniklerini de iyi bilerek bu dili kullanmanız önerilmektedir. Bu nedenle C++ öğrenimizde sadece C++’ı değil, diğer dilleri de öğrenmeniz gerekebildiği vurgulanmaktadır.

Bölüm 12: const Everything That’s Not constexpr (constexpr Yapamadığınız Her Şeyi const Yapın)

Bu bölümde öncelikle Kate Gregory ve James McNellis’in de sürekli bahsettiği gibi, nesneleri "const" yapmanın iki avantajı özetlenmektedir:

  1. Nesnelere ilk değer verilmesi ve onların ömürleri ile ilgili bizi daha fazla düşünmeye zorlamak ve bunun sonucunda yaptığımız eylemlerin performansı etkilemesi.
  2. Kodun diğer okuyucuları ile iletişim kurmak.

Bunun yanında statik nesnelerde "const" kullanarak, derleyicinin o nesneler ile ilgili optimizasyon yapmasına olanak sağlayabilmesi anlatılmaktadır. Bu durumda mümkün olan her durumda (ve derleme aşamasında hesaplayamayacağınız her durumda) "const" kullanmanız tavsiye edilmektedir.

Bölüm 13: constexpr Everything Known at Compile Time (Derleme Zamanında Bilinen Her Şeyi constexpr Yapın)

Bu bölümde derleme aşamasında hesaplayabileceğiniz her şey için "constexpr" kullanmanız tavsiye edilmektedir.

Bölüm 14: Prefer auto in Many Cases (Çoğu Durumda auto Tercih Edin)

Bu bölümde yazar kendisinin bir Almost Always Auto (AAA) insanı olmadığını, ancak çoğu durumda "auto" kullanmayı tercih ettiğini söylemektedir. Birçok farklı durumla ilgili örnek vererek, bize de bu durumlarda "auto" kullanmamızı tavsiye etmektedir.

Bölüm 15: Prefer ranged-for Loop Syntax Over Old Loops (Eski Döngü Söz dizimleri Yerine ranged-for Döngüsünü Tercih Edin)

Bu bölümde mümkün olan her yerde eski stil döngü deyimleri yerine yeni "ranged-for" döngüsünü kullanmanız tavsiye edilmektedir.

Bölüm 16: Use auto in rangedfor Loops (ranged-for Döngülerinde auto Kullanın)

Bu bölümde "ranged-for" döngüsünün ilk kısmında mümkün olduğunca "auto" kullanmanız tavsiye edilmektedir. Hangi durumlarda nasıl bir "auto" yazacağınız ise şu şekilde özetlenmektedir:

  • Elemanları değiştirmeyen döngüler için “const auto&”
  • Elemanları değiştiren döngüler için “auto&”
  • Sadece “std::vector<bool>” gibi garip türlerde, elemanları dışarı taşıma amacınız varsa “auto&&”

Bölüm 17: Prefer Algorithms Over Loops (Döngülerin Yerine Algoritmaları Tercih Edin)

Bu bölümde kullanabileceğiniz her yerde döngüler yerine STL algoritmalarını tercih etmeniz önerilmektedir. Bu şekilde fonksiyonel yaklaşımları kodunuza daha iyi uygulayabileceğiniz de vurgulanmaktadır.

Bölüm 18: Dont Be Afraid of Templates (Şablonlardan Korkmayın)

Bu bölümde şablonların (templates) karmaşık görünen araçlar olduğu, 15 yıl önce bu araçlara "normal insanların kullanmaması gereken şeyler" olarak bakıldığı, ancak günümüzde özellikle konseptler ve genelleyici Lambda ifadeleri gibi araçlarla artık bunun doğru olmadığı ve herkes taarfından korkmadan rahatça kullanılabileceği anlatılmaktadır.

Bölüm 19: Dont Copy and Paste Code (Kodu Kopyalayıp Yapıştırmayın)

Bu bölümde kodlarınızı projenizin bir bölümünden başka bir bölüme kopyala-yapıştır yapmamanız gerektiği anlatılmaktadır. Bunun kodunuzun kalitesine doğrudan etkisi olduğundan bahsedilmekte ve C++14 stili Lambda ifadeleri, genelleyici parametreler ("auto" ile), şablonlar gibi özelliklerin yeniden kullanılabilir kodlar oluşturmanız için daha etkili araçlar olduğundan bahsedilmektedir.

Bölüm 20: Follow the Rule of 0 (0 Kuralı’nı Takip Edin)

Bu bölümde sınıflarınıza herhangi bir yıkıcı (destructor) metot yerleştirmemenin, bir şeyleri doğru yapmada daha iyi olduğu ve boş yıkıcı metot yazmanın şunun gibi performans etkileri olduğu anlatılmaktadır:

  • Bulundukları türü artık sıradan (trivial) olmaktan çıkarma
  • Fonksiyonel bir kullanımlarının olmaması
  • Nesneyi silmede kullanılabilecek “inline” mekanizmasını etkileyebilmeleri
  • Kapalı bir şekilde taşıma işlemlerini devre dışı bırakması

Bölüm 21: If You Must Do Manual Resource Management, Follow the Rule of 5 (Eğer Manuel Kaynak Yönetimi Yapmak Zorundaysanız, 5 Kuralı’nı Tercih Edin)

Bu bölümde eğer sınıfınızın belli kaynaklar içerdiğinden dolayı yıkıcı (destructor) metoda sahip olması gerekiyorsa, sınıfın diğer özel üye fonksiyonlarında "=delete" veya "=default" kullanmanız veya el ile hepsini implement etmenizi söyleyen; C++11 öncesinde 3 Kuralı (Rule of 3), C++11 ve sonrasında ise 5 Kuralı (Rule of 5) olarak adlandırılan kuralın kullanım senaryolarından bahsedilmektedir.

Bölüm 22: Dont Invoke Undefined Behavior (Tanımsız Davranışı Çağırmayın)

Bu bölümde öncelikle C++’ta birçok tanımsız davranış (undefined behavior) durumu bulunduğundan, bunların hepsini izlemenin zor olduğundan ve bunların programın tamamını çökertebilecek sorunlara neden olabileceğinden bahsedilmektedir. Ayrıca sonraki bölümlerde bunların bazılarına değinileceğine ve bunlardan kurtulmak için çeşitli dezenfektan (sanitizer) araçlarından faydalanabileceğinize de değinen özet niteliğinde bir bölümdür.

Bölüm 23: Never Test for this To Be nullptr, Its UB (this Göstericisinin nullptr Olup Olmadığını Asla Kontrol Etmeyin, Bu Bir Tanımsız Davranıştır)

Bu bölümde "this" göstericisinin boş olup olmadığını kontrol etme durumu ele alınmaktadır. Bu kontrolün kendisinin aslında bir tanımsız davranış olmadığından ve derleyicilerin bu kontrolü optimize ederken silebileceğinden bahsedilmektedir. Ancak bu kontrolün silinmediği ve doğru olduğu durumlarda, aslında kodunuzda bir tanımsız davranış olabileceğinden de bahsedilmektdir. Bu durumla ilgili bazı örnekler verilip bu kontrolü asla yapmamanız gerektiği anlatılmaktadır.

Bölüm 24: Never Test for A Reference To Be nullptr, Its UB (Bir Referansın nullptr Olup Olmadığını Asla Test Etmeyin, Bu Bir Tanımsız Davranıştır)

Bu bölümde bir referansın "nullptr" olmasının tanımsız bir davranış olduğundan ve referansın "nullptr" olup olmadığını kontrol etmenize gerek olmadığından bahsedilip bununla ilgili örnekler verilmiştir.

Bölüm 25: Avoid default In switch Statements (switch Deyimlerinde default Kullanmaktan Kaçının)

Bu bölümde örneklerle birlikte hangi senaryolarda "switch" deyiminde "default" kullanmamanız gerektiği açıklanmaktadır.

Bölüm 26: Prefer Scoped enums (Faaliyet Alanına Sahip enum’ları Tercih Edin)

Bu bölümde C stili "enum" tanımları yerine C++11 ile gelen "enum class" (veya "enum struct") kullanmanız gerektiği açıklanmakta ve bununla ilgili çeşitli örnekler verilmektedir.

Bölüm 27: Prefer if constexpr over SFINAE (SFINAE Yerine if constexpr Tercih Edin)

Bu bölümde SFINAE’nin bir tür sadece yazılabilir (write-only) kod olduğundan, "if constexpr" deyiminin aslında tam olarak onun yerini tutamayacağından, ancak mümkün olan her yerde "if constexpr" kullanmanız gerekriğinden bahsedilmektedir.

Bölüm 28: Constrain Your Template Parameters With Concepts (C++20) (Şablon Parametrelerinizi Konseptler ile Sınırlandırın)

Bu bölümde C++20 ile gelen bir özellik olan konseptler (concepts) ile, şablon parametre türlerini nasıl kısıtlayabileceğinizden ve bunu yapmanın avantajlarından bahsedilmektedir.

Bölüm 29: De-template-ize Your Generic Code (Genelleyici Kodlarınızı Şablonluktan Çıkarın)

Bu bölümde kodlarınızı mükün olduğunca şablonların dışına taşımanız gerektiğinden, bunun avantajlarından ve bunu yapmanızın derleme zamanı ile dosya boyutunda önemli azalmalara yol açacağından bahsedilmektedir.

Bölüm 30: Use Lippincott Functions (Lippincott Fonksiyonları Kullanın)

Bu bölümde ismi Lisa Lippincott’tan gelen ve merkezileştirilmiş bir istisna yakalama (exception handling) rutinleri olan Lippincott fonksiyonlarının ne olduğundan ve kullanımlarından bahsedilmektedir. Bu fonksiyonlar ile istisna yakalama sürecinde nasıl DRY (Don’t Repeat Yourself) prensibini uygulayabileceğiniz açıklanmaktadır.

Bölüm 31: Be Afraid of Global State (Global Durumdan Korkun)

Bu bölümde global durumda olan nesneleri yönetmenin zorluğundan, "const" olmayan statik nesneler ile "std::shared_ptr<>" türünden nesnelerin bu durumda kullanıldığında nasıl güvensiz durumlara yol açabileceğinden ve global durumun yakalanması zor hatalara yol açabileceğinden bahsedilmektedir.

Bölüm 32: Make your interfaces hard to use wrong. (Arayüzlerinizi yanlış kullanılması zor hale getirin.)

Bu bölümde tasarladığınız arayüzlerin sizin ilk savunma hattınız olduğundan ve bu arayüzleri yanlış kullanılamayacak şekilde tasarlamanız gerektiğinden bahsedilmektedir.

Bölüm 33: Consider If Using the API Wrong Invokes Undefined Behavior (Yanlış API Kullanımının Tanımsız Davranışa Yol Açabileceğini Göz Önüne Alın)

Bu bölüm, çalıştığınız diğer kütüphanelerde yer alan fonksiyonlardan geri dönen veya onlara gönderebileceğiniz ham göstericilerin bazı durumlarda tanımsız davranışlara yol açabileceği konusunda sizi uyarmaktadır. Bu konuda oldukça dikkatli olmanızı önermektedir.

Bölüm 34: Use [[nodiscard]] Liberally (Özgürce [[nodiscard]] Kullanın)

Bu bölümde öncelikle C++17 ile gelen [[nodiscard]] Attribute’unun ne olduğundan ve geri dönüş değeri ele alınmayan fonksiyonlara bu şekilde nasıl derleyici tarafından uyarı verdirebileceğimizden bahsedilmektedir. Ayrıca bu Attribute’un C++20 ile gelen mesajlı versiyonuna da değinilmektedir. Bu Attribute’u gerekli olan her yerde korkmadan kullanmanız tavsiye edilmektedir.

Bölüm 35: Use Stronger Types (Daha Güçlü Türler Kullanın)

Bu bölümde sınıf veya fonksiyonlarınızda birçok anlama gelebilecek temel türler yerine daha konu bazlı anlamları olan (ve genellikle kendi oluşturduğunuz) türleri kullanmanız gerektiği anlatılmaktadır. Ayrıca fonksiyonlada Boolean türündeki parametreleri kullanmamanız gerektiği, bunun yerine "enum class" (veya "enum struct") kullanmanız gerektiğinden bahsedilmektedir.

Bölüm 36: Dont return raw pointers (Ham göstericileri geri döndürmeyin)

Bu bölümde fonksiyonlardan ham göstericileri geri döndürmenin, o fonksiyonu kullanan kişiler için sahiplik (ownership) anlamında kafa karışıklığına neden olacağı, bunu yapmak yerine referans, akıllı gösterici, sahipliği olmayan gösterici sarmalayıcısı (pointer wrapper) gibi yollarla geri döndürme yapmanın daha uygun olacağı anlatılmaktadır.

Bölüm 37: Prefer Stack Over Heap (Heap Yerine Stack Tercih Edin)

Bu bölümde dinamik olarak yer ayrılmayan ve Stack üzerinde yer kaplayan nesnelerin optimize edilmeye daha uygun olduğu, Cache yapmaya daha uygun olduğu ve gerekli durumlarda optimize eden programlar tarafından tamamen ortadan kaldırılabileceği için dinamik nesnelere göre daha sık tercih edilmesi gerektiği anlatılmaktadır.

Bölüm 38: No More new! (Daha Fazla new Yok!)

Bu bölümde dinamik bellekten yer ayırmaya ihtiyaç duyduğunuz durumlarda C++14 ile gelen "std::make_unique<>()" ile bu yer ayırmayı yapmanız, daha nadir durumlarda ise C++11 ile gelen "std::make_shared<>()" ile bu yer ayırmayı yapmanız tavsiye edilmektedir.

Bölüm 39: Know Your Containers (Konteynerlerinizi Bilin)

Bu bölümde kullandığınız konteyner türleri hakkında bilinçli olarak onları kullanmanız tavsiye edilmektedir. Bölümde yer alan örneğe göre önce "std::array<>", daha sonra "std::vector<>" kullanmayı tercih etmeniz önerilmektedir.

Bölüm 40: Avoid std::bind and std::function (std::bind ve std::function Kullanmaktan Kaçının)

Bu bölümde C++11 dile eklenen ve C++14 ile daha da geliştirilen Lambda ifadelerinin "std::bind" ve "std::function" ile benzer özellikleri sağladığı ve bu nedenle birçok durumda bunlar yerine Lambda kullanmayı tercih etmeniz önerilmektedir.

Bölüm 41: Skip C++11 (C++11’i Atlayın)

Bu bölümde Modern C++’a geçmeyi kabul eden kişilerin C++11 değil de en az C++14 kullanması tavsiye edilmektedir. Bunu C++14 ile dile eklenen ve iyileştirilen özellikleri açıklayarak desteklemektedir. Elbette mümkün oldukça daha ileriki C++ standartlarının ve derleyicilerinin kullanılması gerektiği, ancak silinen özelliklerden dolayı dikkatli olunması gerektiği üzerinde de durulmaktadır.

Bölüm 42: Dont Use initializer_list For Non-Trivial Types (Non-Trivial Türler İçin initializer_list Kullanmayın)

Bu bölümde sıradan olmayan (non-trivial) türlerde neden "initializer_list" kullanılmaması gerektiği örneklerle beraber açıklanmaktadır.

Bölüm 43: Use the Tools: Build Generators (Araçları Kullanın: Build Oluşturucular)

Bu bölümde C++ ile proje yaparken CMake, Meson, Bazel gibi Build oluşturucularını kullanmanız tavsiye edilmektedir.

Bölüm 44: Use the Tools: Package Managers (Araçları Kullanın: Paket Yöneticileri)

Bu bölümde C++ ile proje yaparken Vcpkg ve Conan gibi paket yöneticilerini kullanmanız tavsiye edilmektedir.

Bölüm 45: Improving Build Time (Build Zamanını Geliştirme)

Bu bölümde Build zamanınızı geliştirebilmeniz için şu öneriler sunulmaktadır:

  • Kodlarınızı mümkün olduğunca şablonların dışında tutmak (Bölüm 29’da bahsedilen konu)
  • Anlamlı olan yerlerde ön bildirim (forward declaration) kullanmak
  • Build sisteminizde PCH’ı (Pre-Compiled Headers) etkin hale getirmek
  • “ccache” veya alternatif araçlar kullanmak
  • Unity Build’lerin farkında olmak
  • “extern template” kullanmanın olanakları ve kısıtlamalarının farkında olmak
  • Build zamanının nereye harcandığını öğrenmek için Build analiz araçları kullanmak

Bölüm 46: Use the Tools: Multiple Compilers (Araçları Kullanın: Çoklu Derleyiciler)

Bu bölümde, kullandığınız platformda en az iki farklı derleyici kullanarak işlerinizi yapmanız tavsiye edilmektedir. Böylelikle farklı derleyicilerin kodunuz üzerinde farklı analizler yapmasını sağlayabileceğiniz anlatılmaktadır. Ayrıca WSL kullanrak Windows ortamındaki kodlarınızı kolaylıkla Linux ortamında da test edebileceğinize değinilmektedir.

Bölüm 47: Fuzzing and Mutating (Bulandırma ve Mutasyona Uğratma)

Bu bölümde projelerinizde bulandırma (fuzzing) ve mutasyona uğratma (mutating) tekniklerini kullanan test araçlarını ve testleri kullanmanız tavsiye edilmektedir. Bu şekilde daha hatasız programlar elde edebileceği anlatılmaktadır.

Bölüm 48: Continue Your C++ Education (C++ Eğitiminize Devam Edin)

Bu bölümde C++ öğrenimizin sürekli olması gerektiği ve bu konuda İnternet üzerinde pek çok kaynağın bulunduğundan bahsedilmektedir. Ayrıca nasıl soru sorulması gerektiği, C++ konferansları, yerel grupları ve Web siteleri hakkında bilgiler verilmektedir.

Bölüm 49: Always Initialize Your Values (Değerlerinizi Her Zaman İlklendirin)

Bu bölümde tanımladığınız nesnelere her zaman bir ilk değer vermeniz gerektiği tavsiye edilmektedir.

Bölüm 50: Prefer Spaceships (C++20) (Uzay Gemilerini Tercih Edin)

Bu bölümde C++20 ile dile eklenen ve şeklinden dolayı kendisine uzay gemisi operatörü (spaceship operator) adı verilen "<=>" operatörünü mümkün olan her durumda kullanmanız tavsiye edilmektedir.

Bölüm 51: Understand consteval and constinit (C++20) (consteval ve constinit’i Anlayın)

Bu bölümde C++20 ile dile eklenen "consteval" ve "constinit" anahtar kelimelerinin ne anlama geldiği, nerelerde kullanıldığı ve ne gibi avantajlarının bulunduğu gibi konulardan bahsedilmektedir.

Bölüm 52: Be Aware of Custom Allocation And PMR (Özel Yer Ayırma ve PMR’ın Farkında Olun)

Bu bölümde C++17 ile dile eklenen ve standart konteyner türlerine kolay bir şekilde özel yer ayırma (custom allocation) stratejileri uygulayabileceğiniz PMR (Polymorphic Memory Resources) kavramından bahsedilmektedir. Bu özelliğin elbette her yerde kullanılmaması gerektiği, ancak özelliğin varlığından ve avantajlarından haberdar olunması gerektiği anlatılmaktadır.

Bölüm 53: Consider Designated Initializers (C++20) (Belirlenmiş İlklendiricileri Kullanmayı Göz Önüne Alın)

Bu bölümde öncelikle doğrudan ilklendirme yapmanın öneminden bahsedilmektedir. Daha sonra C++20 ile dile eklenen belirlenmiş ilklendiriciler (designated initializers) anlatılmakta ve kullanım avantajlarından bahsedilmektedir.

Bölüm 54: Thank You (Teşekkürler)

Bu bölüm kitabın sponsor ve eleştirmenlerine teşekkür bölümüdür.

Bölüm 55: Bonus: Understand The Lambda (Bonus: Lambda’yı Anlamak)

Bu bölümde Lambda ifadeleri ile ilgili çeşitli bilgiler listelenmekte ve örnekler gösterilmektedir.

Değerlendirme

Kitap Leanpub’da yayımlandığı için her seferinde yeni öğelerle güncellenmiş, hatalı ve eksik bilgiler giderilmiştir. Böylelikle içeriğin ve notların güncel kalması sağlanmıştır. Oldukça kısa bir kitap olmasına karşın, bugün sektörde kullanılan C++ pratiklerinin çoğunu kapsamaktadır. Jason Turner’ın öğretici yaklaşımı zaten YouTube videolarının söktörde popülerleşmesini sağlamıştı. Bu kitap ile aslında Turner, Web sayfasında ve YouTube’da yayımladığı içerikleri bir yerde özet olarak toplayıp okuyuculara sunmuştur. Kitabın hedef kitlesi tahmin edebileceğiniz gibi zaten C++ dilini kullanmakta olan kişilerdir. Ayrıca C++98 standartlarında çalışan, ancak Modern C++ diline geçen kişiler için de referans kitap olma özelliği taşımaktadır.

Kitap parçalardan değil, her biri belli bir konuya özel bölümlerden meydana gelmektedir. Bazı bölümler bilgilendirme, motivasyon ve teşekkür üzerinedir. Bunları çıkardığımızda geriye dilin teknik kısmı ile ilgili verilen tavsiyeler kalmaktadır. Her bölümde olmasa da çoğu bölümde kod örnekleri kullanılmış ve kitabın en son yayımlanan sürümünde bu kodlardaki anahtar kelimeler renklendirilmiştir. Ayrıca her bölümün sonunda Resources (Kaynaklar) kısmı yer almaktadır. Burada konu ile ilgili Jason Turner’ın videoları başta olmak üzere pek çok faydalı kaynak yer almaktadır. Bölümler genelde 2-3 sayfadan meydana gelse de kaynak kısmı her bölümü zenginleştirmektedir.

Kitapta anlatılan pratiklerin belki de en iyi yanı güncel C++ standartları da içerisinde barındırmasıdır. Bazı başlıkların ve içeriklerin hangi standartta desteklendiği belirtilmiş ve böylelikle içerikler herhangi bir standartta çalışma yapan kişiler için faydalı hale getirilmiştir. Kitapta sıklıkla ara notlar kullanılmış ve bu notlarda hem önemli uyarılara yer verilmiş hem de okyucuya onun zihnini açacak bazı sorular yöneltilmiştir. Egzersizler de ayrı başlıklar altında toplanmıştır. Kitap içerisinde pek çok farklı kütüphane ve araç ismine yer verilmekle beraber, bunlara ulaşabileceğiniz linkler ve önemli kaynaklara da yer verilmiştir.

Sonuç olarak kitap içerik olarak ele alındığında oldukça başarılıdır. Çünkü yapmak istediği aslında ayrıntılı bilgiler vermek değil, bu bilgiler ile ilgili kısa notlar paylaşıp referansları belirtmektir. Bunu da oldukça iyi bir şekilde yapmaktadır. İçerik tamamen eşsizdir diyemesek de (buna benzer kitap ve kaynak çokça bulunduğundan) kendine özgü içerikleri harmanlayıp bu kitabı çıkardığından yine bir özgünlüğü vardır diyebiliriz. Kitapta kullanılan dil oldukça yalın ve anlaşılırdır. C++’ta çok yeni olan kişilerin anlamakta zorlanacağı yerler elbette mevcuttur. Kitapta görsel ve diyagram kullanımı hemen hemen yoktur. Ancak zaten kitabın doğası gereği çoğu yerde gerekli de değildir. Örneklerin kalitesi oldukça başarılıdır. Zaten genellikle her yerde bulabileceğiniz örnekler tercih edilmiştir.

C++ Best Practices İnceleme Özeti


Tam İsim: C++ Best Practices: 45ish Simple Rules with Specific Action Items for Better C++
Basım No: 2nd Edition (12 Temmuz 2022)
Yazarlar: Jason Turner
Yayımlama Tarihi: 12 Temmuz 2022
Sayfa Sayısı: 146
Anlaşılabilirlik/Okunabilirlik
Görsel/Diyagram Kullanımı
İçerik Kalitesi/Eşsizliği
Örneklendirme/Örnek Kalitesi

Sonuç Özeti

Sonuç olarak kitap içerik olarak ele alındığında oldukça başarılıdır. Çünkü yapmak istediği aslında ayrıntılı bilgiler vermek değil, bu bilgiler ile ilgili kısa notlar paylaşıp referansları belirtmektir. Bunu da oldukça iyi bir şekilde yapmaktadır. İçerik tamamen eşsizdir diyemesek de (buna benzer kitap ve kaynak çokça bulunduğundan) kendine özgü içerikleri harmanlayıp bu kitabı çıkardığından yine bir özgünlüğü vardır diyebiliriz. Kitapta kullanılan dil oldukça yalın ve anlaşılırdır. C++’ta çok yeni olan kişilerin anlamakta zorlanacağı yerler elbette mevcuttur. Kitapta görsel ve diyagram kullanımı hemen hemen yoktur. Ancak zaten kitabın doğası gereği çoğu yerde gerekli de değildir. Örneklerin kalitesi oldukça başarılıdır. Zaten genellikle her yerde bulabileceğiniz örnekler tercih edilmiştir.

4.3
0 0 votes
Article Rating
Subscribe
Bildir
guest

0 Yorum
Eskiler
En Yeniler Beğenilenler