Skip to content

Latest commit

 

History

History
155 lines (125 loc) · 11 KB

File metadata and controls

155 lines (125 loc) · 11 KB

Başlık Dosyaları (Header Files)

  • gereksiz yere bir başlık dosyası include edilmiş mi? (gereksiz başlık dosyalarının include edilmesinden kaçınılmalı)
    • ön bildirim (forward declaration) yapmak yerine gereksiz yere başlık dosyası include edilmiş mi?
  • başlık dosyasında olmaması gereken using bildirimi var mı? (başlık dosyalarında using bildirimi olmamalı namespace üyesi isimler başlık dosyalarında nitelenerek kullanılmalı)
  • başlık dosyasında olmaması gereken using namespace direktifi var mı? (başlık dosyalarında using namespace bildirimi olmamalı namespace üyesi isimler başlık dosyalarında nitelenerek kullanılmalı)
  • başlık dosyasında tek tanımlama kuralını (ODR) çiğneyen bir tanımlama var mı? (tek tanımlama kurallarına uyulmalı)

Önişlemci (Preprocessor)

  • Koşullu derleme komutları (conditional compiling) dışında makrolar kullanılmış mı? (makro kullanımından kaçınmak gerekiyor)
    • sembolik sabit olarak makro kullanılmış mı? (makro kullanımından kaçınmak gerekiyor)
    • fonksiyonel makrolar (functional macro) kullanılmış mı? (makro kullanımından kaçınmak gerekiyor)

Değişken Bildirimleri

  • Aritmetik türlerden ya da pointer türlerinden ilk değer verilmeden tanımlanan değişkenler var mı? (akis yönde bir zorunluluk olmadıkça değişkenlere ilk değer verilmeli)

Const Doğruluğu (Const Correctness)

  • değişkenler varsayılan biçimde (default) const olarak tanımlanmamış mı? (default olarak parametre değişkenleri dışındaki değişkenler const olmalı)
  • salt okuma (read-only access) amaçlı kullanılacak değişkenler const yapılmamış mı?
    • arama tablosu (lookup table) olarak kullanılan veri yapıları const yapılmamış mı?
    • okuma amaçlı erişim sağlayan referans parametreler const yapılmamış mı?
    • gösterici değişkenlerin tanımında gereken yerlerde const anahtar sözcüğü kullanılmış mı?
      • low level const olması gerekenler low level const yapılmış mı?
      • top level const olması gerekenler top level const yapılmış mı?
    • aralık tabanlı for döngülerinde okuma amaçlı kullanılacak döngü değişkeni olarak kullanılan sol taraf referansları const yapılmamış mı?
    • const olması gereken üye fonksiyonları const yapılmamış mı?

constexpr & consteval

  • Derleme zamanında hesaplanabilecek değerler için constexpr olmayan fonksiyonlar kullanılmış mı?
  • Derleme zamanında hesaplanması gereken değerler için consteval olmayan fonksiyonlar (C++20) kullanılmış mı?

Yorum satırları (Comment Lines)

  • gereksiz yorum satırı var mı? (gereksiz yorum satırlarından kaçınmak gerekiyor)
    • kodun açık ve net olduğu yerlerde (selfexplanatory) açıklama satırları kullanılmış mı? (gereksiz yorum satırlarından kaçınmak gerekiyor)
  • güncellenmesi (update) gereken yorum satırları güncellenmemiş mi?
  • yorum satırları gereksiz yere uzun tutulmuş mu? (uzun açıklamalardan kaçınılmalı)
  • değişken bildirimleri için açıklama satırı var mı? (değişken bildirimleri için açıklama yapılmış ise muhtemelen kötü isimlendirme söz konusudur)
  • debug amaçlı comment out yapılmış kodlar kaynak dosyada bırakılmış mı?

İsimlendirme (Naming)

  • anlaşılmaz isimler kullanılmış mı? (isimler anlaşılır ve betimleyici olmalı)
  • Türkçe isim kullanılmış mı? (isimler Türkçe olmamalı)
  • isimlendirmede tutarlı biçimde bir konvensiyon kullanılmamış mı?
  • birbirine çok yakın isimler seçilmiş mi? (x1, x2, x3 gibi)
  • görsel olarak 0 ile karıştırılma riski olan 'o' karakteri kullanılmış mı?
  • fonksiyon isimleri fonksiyonun yaptığı işe betimlemiyor mu?
  • tamamı büyük harf olan (all caps) isimler kullanılmış mı? (all caps isimler kullanılmamalı)
  • isimlerde gereksiz ön ekler kullanılmış mı?
  • standart kütüphane tarafından rezerve edilmiş isimler kullanılmış mı?

Sabitler (constants)

  • nullptr yerine NULL makrosu kullanılmış mı? (NULL makrosu kullanılmamalı)
  • nullptr yerine tam sayı sabiti olarak 0 kullanılmış mı? (nullptr sabiti kullanılmalı)
  • tam sayı ve gerçek sayı sabitlerinin türü doğru seçilmiş mi?
  • isimlendirilmesi gereken sabitler isimsiz olarak kullanılmış mı? (özel anlama sahip sabitler isimlendirilmeli)
  • büyük tam sayı sabitlerinin yazımında basamak ayıracı (digit separator) kullanılmamış mı? (kodun kolay okunması için basamak ayraçları kullanılmalı)

Numaralandırmalar (enums)

  • kapsamlı enum türü (enum class) yerine kapsamsız enum türü kullanılmış mı? (zorunlu durumlar dışında kapsamsız enum türlerinin kullanımından kaçınılmalı)
  • isimlendirilmemiş bir enum türü kullanılmış mı? (kodun kolay okunması için enum türleri isimlendirilmeli)
  • gereksiz biçimde numaralandırma sabitlerinin değerleri belirlenmiş mi? (gerekmiyorsa tüm numara sabitleri varsayılan değerlere sahip olmalı)
  • gereksiz biçimde baz tür (underlying type) belirlenmiş mi? (gerekmedikçe baz tür belirtilmemeli)
  • numaralandırma sabitleri tamamı büyük harf (all caps) isimlendirilmiş mi? (all caps isimlerden kaçınılmalı)

İfadeler ve Operatörler (Expressions & Operators)

  • karmaşık ve fazla sayıda operatör içeren ifadelerde öncelik parantez(ler)i kullanılmamış mı? (uzun ve karmaşık ifadelerin okunmasını kolaylatırmak ve kodlama hatalarından kaçınmak için öncelik parantezleri kullanılmalı)

Kontrol Deyimleri (Control Statements)

  • STL algoritmaları yerine ham döngü deyimleri (raw loops) kullanılmış mı? (ham döngülerden mümkün olduğunca kaçınılmalı)
  • gereksiz do while döngüsü kullanılmış mı? (do while döngü deyimleri kod okumayı zorlaştırıyor ve hata yapma riskini arttırıyor. Gerekli durumların haricinde do while döngülerinden kaçınılmalı)
  • aralık tabanlı for döngü deyimleri (range-based for loop) yerine geleneksel for döngü deyimi kullanılmış mı?
  • gereksiz goto deyimi kullanılmış mı?
  • switch deyimlerinde gereksiz default case kullanımı var mı?

Tür Dönüşümleri ve Tür Dönüştürme Operatörleri

İsim Alanları (Namespaces)

  • global fonksiyonlar namespace içinde değil mi? (isim çakışmalarına karşı önlem almak için global fonksiyonlar bir namespace içinde olmalı)
  • isim alanları isimleri tamamı küçük harf mi (all lower case) ?

Fonksiyonlar

  • fonksiyon ismi iyi seçilmiş mi?
  • verilen isim yeterince betimleyici değil mi?
  • fonksiyonlara birden fazla görev yüklenmiş mi? (fonksiyonların tek bir görevi olmalı, bir fonksiyona birden fazla görev yüklenmemeli)
  • küçük birden fazla fonksiyon yerine tek bir (uzun) fonksiyon tanımlanmış mı? (uzun fonksiyonlardan kaçınılmalı, hata yapma riski artıyor, kod değişikliği yapmak ve test etmek zorlaşıyor)
  • kullanılmayacak parametreler (gereksiz yere) isimlendirilmiş mi? (kullanılmayacak [dummy] parametrler isimlendirilmemeli)
  • fonksiyon parametre sayısı fazla mı? (parametre sayısı minimize edilmeli, fazla parametreye sahip fonksiyonlara yapılan çağrılarda hata riski artıyor)
  • variadic fonksiyon tanımlanmış mı? (variadic fonksiyonlar yerine variadic template(ler) kullanılmalı)
  • fonksiyon parametreleri için strong type yerine doğrudan tam sayı türleri kullanılmış mı?
  • uzun kod satırlarına sahip (10 satırdan fazla) inline fonksiyonlar tanımlanmış mı? (uzun inline fonksiyonlar tipik olarak bir avantaj sağlamıyor)
  • geri dönüş değeri adres türlerinden olan fonksiyonlar var mı? (adres döndüren fonksiyonlar hata riskini arttırıyor)

Fonksiyon Yüklemesi (Function Overloading)

Argüman Gönderimi (Parameter Passing)

Operatör Yüklemesi (Operator Overloading)

  • operatör yüklemeleri anlaşılır ve kolay kullanılabilir mi (intuitive)?
  • aritmetik operatörler yüklenmiş ancak işlemli atama operatörleri yüklenmemiş mi?
  • karşılaştırma operatörleri için three way comparison (C++20) kullanılmış mı?
  • programcı türleri(user defined types)_ için önek ++ operatör fonksiyonu yerine sonek ++ operatörü kullanılmış mı?

Lambda İfadeleri (Lambda Expressions)

  • lambda ifadesinin kullanılması gereken (daha iyi olan) yerlerde global fonksiyon tanımlanmış mı?

Kapsam ve Kapsam Sızıntısı (Scope & Scope Leakage)

  • değişkenler ilk kullanıldıkları yerde (yere yakın) tanımlanmamış mı? (değişken isimlerinin kapsamı mümkün olduğunca daraltılmalı)
  • yerel bir isim global bir ismi maskeliyor mu?
  • yerel bir isim sınıf kapsamındaki bir ismi maskeliyor mu?
  • değişken isimlerinin kapsamları gereksiz yere geniş tutulmuş mu?
  • gereken yerlerde kapsam daraltılması için ilk değer vermeli if deyimi (if with initializer) kullanılmamış mı?
  • gereken yerlerde "yapılandırılmış bağlama" (structured binding) kullanılmamış mı?

Tür Çıkarımı (Type Deduction)

Taşıma Semantiği (Move Semantics)

  • sınıfın move member'ları delete edilmiş mi? (move memberler delete edilmemeli)
  • return ifadesinde std::move işlevi çağrılmış mı? (copy elision ya da derleyici optimizasyonu devre dışı bırakılmış olabilir)

Kopyalamanın Eliminasyonu (Copy Elision)

Sınıflar (Classes)

  • oluşturulan sınıf cohesive mi?
  • veri gizleme ilkelerine uyulmuş mu?
  • tek sorumluluk (Single Responsibility Principle) ilkesine uyulmuş mu?
  • üye fonksiyonlar
    • const olması gereken üye fonksiyonlar const yapılmış mı?
    • üye fonksiyon içinde gereksiz yere (sık tekrarlanan) this kullanımı var mı?
    • üye fonksiyon içinde if (this == nullptr) sınaması var mı?

Exception Handling

  • sınıfların move constructor, move assignment, swap işlevleri noexcept olarak tanımlanmış mı?
  • catch bloklarının sırası doğru mu? (özelden genele)
  • verilmemesi gereken noexcept garantisi verilmiş mi?
  • kod tekrarı yerine exception handling fonksiyonları (lippincott functions) kullanılmış mı?

Akıllı Göstericiler (Smart Pointers)

  • new ve delete operatörleri doğrudan kullanılmış mı?
  • dinamik ömürlü nesneler ham göstericiler (raw pointers) ile kullanılmış mı?

Attribute'lar

  • geri dönüş değerinin kullanılması lojik açıdan zorunlu olan fonksiyonlar için [[nodiscard]] attribute'ı kullanılmış mı?
  • switch deyimlerinde gerekli yerlerde [[fallthrough]] attribute'ı kullanılmış mı?

Concurrency

STL

  • C dizisi (C array) kullanılan yerler var mı? _(istisnai durumlar dışında std::array kullanılmalı) _

Kod Yerleşimi (Code Layout)

  • kod yerleşiminde tutarlı ve istikrarlı şekilde bir konvensiyon kullanılmış mı?
  • genel kabul görmüş istisnalar dışında 80 karakterden daha uzun kod satırı var mı?

Diğer Konular ve Araçlar (Miscellaneous)

  • deprecated dil ya da standart kütüphane öğeleri kullanılmış mı?