C++ temel ilkeleri – 2 (enum türleri)

Enum.1: Numaralandırma sabitleri önişlemci makrolarına tercih edilmelidir.

Gerekçe: Makrolar bilinirlik alanları (scope) kurallarına uymazlar. Bilinirlik alanı derleyiciyi ilgilendiren bir kavramdır. Makrolar için derleyicinin doğrudan bir tür kontrolü yapması mümkün değildir. Makrolar önişlemci program tarafından bir yer değiştirme işlemine tabi tutulduklarından koddan silinirler. Debugger gibi yardımcı araçlar ya da programlar makroları görmezler.
Eski ve kötü bir kod örneği:

Bunun yerine numaralandırma türleri kullanılmalıdır:

Yukarıdaki kodda isim çakışmasını engellemek için enum sınıfları kullanılıyor.
Kontrol noktaları:
Tamsayı değerlerine tanımlanan makrolar için uyarı iletisi verilebilir.

Enum.2:  Birbirleriyle ilişkili isimlendirilmiş sabitler oluşturmak için numaralandırma türleri kullanılmalıdır.

Gerekçe: Numaralandırmalar birbirleriyle ilgili sabitlere verilen isimleri bir arada gösterirler ve isimlendirilebilen türlerdir.
Örnek:

Not: Numaralandırma sabitlerine bağlı switch deyimi oluşturmak çok yaygındır. Derleyiciler alışılmışın dışında case etiketlerine sahip switch deyimleri için uyarı iletisi verebilirler.
Örneğin numaralandırma sabitlerine göre bir switch deyimi oluşturmak sık karşılaşılan bir durumdur:

Yukarıdaki örnekteki gibi, son numaralandırma sabitine ilişkin case etiketi bulunmayan switch deyimlerinin tipik nedeni, son numaralandırma sabitinin sonradan eklenmesi ve gerekli testlerin yapılmamasıdır.
Kontrol noktaları:

case etiketleri numaralandırma değerlerinin çoğunu kapsayan ancak tüm numaralandırma değerlerini içermeyen switch deyimleri için uyarı iletisi verilebilir.
Numaralandırma türüne ilişkin bazı numaralandırma sabitlerini kullanan, ancak default case içermeyen switch deyimleri için uyarı iletisi verilebilir:

Enum.3: enum sınıfları düz (geleneksel) enum türlerine tercih edilmelidir.

Gerekçe: Düz numaralandırma türünden değerler otomatik olarak (implicitly) int türüne dönüştürülürler:
Örnek:

Bunun yerine enum class kullanılmalıdır:

Kontrol noktaları:
Düz enum türleri (enum class olmayan) için uyarı iletisi verilebilir.

Enum.4: Güvenli ve kolay kullanım için numaralandırma türüne ilişkin operatör işlevleri tanımlanmalıdır.

Gerekçe: Numaralandırma türleri bu şekilde daha kolay kullanılabilir ve kodlama hatalarından kaçınılır.
Örnek:

Kontrol noktaları:
enum türlerine dönüştürülen yinelenen ifadeler için uyarı iletisi verilebilir.

Enum.5: Numaralandırma sabitlerine verilen isimlerin tüm karakterleri büyük harf olmamalıdır.

Gerekçe: Tüm karakterleri büyük harften oluşan numalandırma sabitleri makrolarla çakışma riski içerir.
Kötü örnek:

Kontrol noktaları:
Tüm karakterleri büyük harften oluşan numaralandırma sabitleri için uyarı iletisi verilebilir.

Enum.6: İsimlendirilmemiş numaralandırma türlerinden kaçınılmalıdır.

Gerekçe : Bir enum türü uygun bir şekilde isimlendirilemiyor ise tanımlanan numaralandırma sabitleri arasında bir ilişki yok demektir.
Kötü örnek:

Tamsayı sabitlerine isimler vermek için alternatif diğer araçların olmadığı dönemlerde bu tür enum kullanımları yaygındı.
Alternatif: Bunun yerine constexpr değişkenleri kullanılmaldır. Örneğin:

Kontrol noktaları:
İsimlendirilmemiş numaralandırma türleri için uyarı iletisi verilebilir.

Enum.7: enum türüne ilişkin baz türü (underlying type) yalnızca gerekli durumlarda belirlenmelidir.

Gerekçe: Varsayılan baz tür okuması ve yazması en kolay olandır. int varsayılan tamsayı türüdür. int türü aynı zamanda C dili enum türleri ile de uyumludur.
Örnek:

Not: Numaralandırma türlerinin ön bildirimleri (forward declaration) için baz tür belirlemesi gereklidir:

Enum.8: Yalnızca gereken durumlarda numaralandırma sabitleri için tamsayı değerleri belirlenmelidir.

Gerekçe: Hem en kolay kullanım budur hem de böylece yinelenen numaralandırma değerlerinden kaçınılmış olur. Varsayılan değerlerinin ardışık olması daha iyi switch deyimlerinin yazılmasına destek olur.
Örnek:

Ayların sıra numarası gibi alışılmış değerleri oluşturmak ya da 2‘nin kuvvetleri gibi bitsel maskeleri kullanabilmek için numaralandırma sabitleri için değerler belirlenebilir.

Kontrol noktaları:
Aynı enum türüne ilişkin yinelenen numaralandırma değerleri için uyarı iletisi verilebilir.
Tamamı ardışık olan ve değerleri belirlenmiş numaralandırma sabitleri için uyarı iletisi verilebilir.

Necati Ergin

C ve Sistem Programcıları Derneğinde eğitmen olarak çalışıyor.

Bunlar da ilginizi çekebilir

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Kod Eklemek İçin Okuyun