Aracılığıyla paylaş


Numaralandırma Tasarımı

Uyarı

Bu içerik, Çerçeve Tasarım Yönergeleri: Kurallar, Deyimler ve Yeniden Kullanılabilir .NET Kitaplıkları için Desenler, 2. Sürüm'den Pearson Education, Inc.'in izniyle yeniden yazdırılır. Bu baskı 2008'de yayımlandı ve kitap o zamandan beri üçüncü baskıda tamamen revize edilmiştir. Bu sayfadaki bazı bilgiler güncel olmayabilir.

Numaralandırmalar, değer türünün özel bir türüdür. İki tür sabit listesi vardır: basit sabit listeleri ve bayrak sabit listeleri.

Basit numaralandırmalar, küçük kapalı seçenek kümelerini temsil eder. Basit sabit listesi için yaygın bir örnek, bir renk kümesidir.

Bayrak sabit listeleri, sabit listesi değerleri üzerinde bit düzeyinde işlemleri destekleyecek şekilde tasarlanmıştır. Bayraklar enum'unun yaygın bir örneği, seçenekler listesidir.

✔️ DO, parametreleri, özellikleri kesin olarak yazmak ve değer kümelerini temsil eden değerler döndürmek için bir sabit listesi kullanır.

✔️ DO, statik sabitler yerine bir enum kullanmayı tercih eder.

❌ Açık kümeler (işletim sistemi sürümü, arkadaşlarınızın adları vb.) için numaralandırma KULLANMAYIN.

❌ Gelecekte kullanım için tasarlanan ayrılmış enum değerlerini SAĞLAMAYIN.

Daha sonraki bir aşamada mevcut sabit listesine istediğiniz zaman değer ekleyebilirsiniz. Numaralandırmalara değer ekleme hakkında daha fazla ayrıntı için bkz. Numaralandırmalara Değer Ekleme. Ayrılmış değerler yalnızca gerçek değerler kümesini kirleter ve kullanıcı hatalarına yol açma eğilimindedir.

❌ Yalnızca tek bir değeri olan enumları herkese açık hale getirmekten kaçının.

C API'lerinin gelecekteki genişletilebilirliğini sağlamaya yönelik yaygın bir uygulama, yöntem imzalarına ayrılmış parametreler eklemektir. Bu tür ayrılmış parametreler tek bir varsayılan değere sahip sabit değerler olarak ifade edilebilir. Bu, yönetilen API'lerde yapılmamalıdır. Yöntem aşırı yüklemesi, gelecek sürümlerde parametre eklemeye olanak tanır.

❌ Numaralandırmalara (enum) sentinel değerleri EKLEMEYİN.

Bazen çerçeve geliştiricilerine yardımcı olsalar da, sentinel değerleri çerçeve kullanıcılarının kafasını karıştırır. Bunlar, enumun temsil ettiği kümedeki değerlerden biri olmaktan ziyade enumun durumunu izlemek için kullanılır.

✔️ DO, basit sabit listelerinde sıfır değeri sağlar.

Değeri 'Yok' olarak adlandırmayı göz önünde bulundurun. Belirtilen bu enum için böyle bir değer uygun değilse, enum için en yaygın varsayılan değere temel değeri olarak sıfır atanmalıdır.

✔️ Aşağıdakilerden herhangi biri doğru olmadığı sürece bir numaralandırmanın temel türü olarak (çoğu programlama dilinde varsayılan) kullanmayı Int32 GÖZ ÖNÜNDE BULUNDURUN:

  • Enum bir bayraklar sabit listesi ve 32'den fazla bayrağınız var veya gelecekte daha fazlasının olmasını bekliyorsunuz.

  • Yönetilmeyen kod farklı boyutlu sabit listeler beklediğinde daha kolay birlikte çalışabilirlik sağlamak için temel türün Int32'den farklı olması gerekir.

  • Daha küçük bir temel tür, alanda önemli ölçüde tasarruf sağlar. Enumerasyonun esas olarak kontrol akışı için bir argüman olarak kullanılmasını bekliyorsanız, boyutun pek bir farkı yoktur. Aşağıdakiler durumunda boyut tasarrufları önemli olabilir:

    • Enum'un çok sık oluşturulan bir yapıda veya sınıfta alan olarak kullanılmasını bekliyorsunuz.

    • Kullanıcıların enum örneklerinin büyük dizilerini veya koleksiyonlarını oluşturmasını bekliyorsunuz.

    • Enum türünün çok sayıda örneğinin serileştirilmesini umarsınız.

Bellek içi kullanımda, yönetilen nesnelerin her zaman DWORD-hizalı olduğunu unutmayın; dolayısıyla fark yaratabilmek için, bir örnek içinde daha küçük bir enum'u paketlemek adına birden fazla enum veya başka küçük yapılar bulundurmanız gerekir. Bunun nedeni, toplam örnek boyutunun her zaman bir DWORD değerine yuvarlanacak olmasıdır.

✔️ Flag numaralandırmalarını çoğul isimler veya isim öbekleri, basit numaralandırmaları ise tekil isimler veya isim öbekleri ile adlandırınız.

❌ Doğrudan genişletmeyin System.Enum .

System.Enum , CLR tarafından kullanıcı tanımlı numaralandırmalar oluşturmak için kullanılan özel bir türdür. Çoğu programlama dili, bu işleve erişmenizi sağlayan bir programlama öğesi sağlar. Örneğin, C# enum dilinde bir numaralandırma tanımlamak için anahtar sözcük kullanılır.

Bayrak Enumlar Tasarlama

✔️ Çek numaraları işaretlemek için System.FlagsAttribute uygulayın. Bu özniteliği basit enum'lara uygulamayın.

✔️ DO, bit düzeyinde OR işlemi kullanılarak serbestçe birleştirilebilmeleri için bayrak sabit listesi değerleri için iki güç kullanır.

✔️ Yaygın olarak kullanılan bayrak birleşimleri için özel numaralandırma değerleri sağlamayı GÖZ ÖNÜNDE BULUNDURUN.

Bit düzeyinde işlemler gelişmiş bir kavramdır ve basit görevler için gerekli olmamalıdır. ReadWrite bu tür özel bir değere örnektir.

❌ Belirli değer bileşimlerinin geçersiz olduğu bayrak sabit listeleri oluşturmaktan KAÇıNıN.

❌ Değerin "tüm bayraklar temizlendi" değerini temsil etmediği ve bir sonraki kılavuzda belirtildiği gibi uygun şekilde adlandırılmadığı sürece sıfırın bayrak sabit listesi değerlerini kullanmaktan KAÇıNıN.

✔️ DO, bayrak sabit listelerinin sıfır değerini adlandırın None. Bir bayrak numaralandırması için, değerin her zaman "tüm bayraklar temizlendi" anlamına gelmesi gerekir.

Sabitlerin Değerlerine Değer Ekleme

Bir enum'u yayımladıktan sonra ona değerler eklemeniz gerektiğini keşfetmek çok yaygındır. Yeni eklenen değer mevcut bir API'den döndürülürken olası bir uygulama uyumluluk sorunu vardır çünkü kötü yazılmış uygulamalar yeni değeri doğru işleyemeyebilir.

✔️ Küçük bir uyumluluk riskine rağmen sabit listelerine değer eklemeyi GÖZ ÖNÜNDE BULUNDURUN.

Bir sabit listesi eklemelerinden kaynaklanan uygulama uyumsuzluklarıyla ilgili gerçek verileriniz varsa, yeni ve eski değerleri döndüren yeni bir API eklemeyi ve eski API'yi kullanımdan kaldırmayı göz önünde bulundurun; bu da yalnızca eski değerleri döndürmeye devam etmelidir. Bu, mevcut uygulamalarınızın uyumlu kalmasını sağlar.

Porsiyonlar © 2005, 2009 Microsoft Corporation. Tüm hakları saklıdır.

Pearson Education, Inc. tarafından Krzysztof Cwalina ve Brad Abrams'ın Yeniden Kullanılabilir .NET Kütüphaneleri için Çerçeve Tasarım Yönergeleri: Sözleşmeler, Deyimler ve Kalıplar, 2. Baskı eserinden izniyle yeniden basılmıştır. Addison-Wesley Professional tarafından Microsoft Windows Geliştirme Serisi kapsamında 22 Ekim 2008'de yayımlanmıştır.

Ayrıca bakınız