Aracılığıyla paylaş


Parametre 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.

Bu bölüm, bağımsız değişkenleri denetleme yönergelerini içeren bölümler de dahil olmak üzere parametre tasarımıyla ilgili kapsamlı yönergeler sağlar. Ayrıca, Adlandırma Parametreleri bölümünde açıklanan yönergelere de başvurmalısınız.

✔️ DO, üyenin gerektirdiği işlevselliği sağlayan en az türetilmiş parametre türünü kullanır.

Örneğin, bir koleksiyonu numaralandıran ve her öğeyi konsola yazdıran bir yöntem tasarlamak istediğinizi varsayalım. Böyle bir yöntem, örneğin IEnumerable parametresi olarak alınmalı, ArrayList veya IList değil.

❌ Ayrılmış parametreleri KULLANMAYIN.

Gelecekteki bir sürümde üyeye daha fazla girdi gerekiyorsa, yeni bir aşırı yükleme eklenebilir.

❌ İşaretçileri, işaretçi dizilerini veya çok boyutlu dizileri parametre olarak alan genel kullanıma açık yöntemlere sahip DEĞİlDİr.

İşaretçilerin ve çok boyutlu dizilerin düzgün kullanılması nispeten zordur. Neredeyse tüm durumlarda, BU türleri parametre olarak almaktan kaçınmak için API'ler yeniden tasarlanabilir.

✔️ DO, parametre dizileri hariç olmak üzere tüm out parametrelerini, değere göre ve ref parametrelerinden sonra yerleştirin. Bu, aşırı yüklemeler arasında parametre sıralamasında bir tutarsızlığa yol açsa bile (bkz. Üye Aşırı Yükleme).

out Parametreler ek dönüş değerleri olarak görülebilir ve bunları birlikte gruplandırmak yöntem imzasının anlaşılmasını kolaylaştırır.

✔️ Üyeleri geçersiz kılarken veya arabirim üyelerini uygularken parametreleri adlandırmada tutarlılık gösterin.

Bu, yöntemler arasındaki ilişkiyi daha iyi açıklar.

Arasında Sayılayıcı ve Boole Parametreleri Seçimi Yapmak

✔️ Bir üyenin iki veya daha fazla Boole parametresi olması durumunda ENUM'ları kullanın.

❌ İkiden fazla değere hiçbir zaman gerek kalmayacağı kesin olarak emin değilseniz Boole'leri KULLANMAYIN.

Sabit listeleri, değerlerin daha sonra eklenmesi için size biraz alan sağlar, ancak Sabit Listesi Tasarımı'nda açıklanan sabit listelerine değer eklemenin tüm etkilerini bilmeniz gerekir.

✔️ Gerçekten iki durumlu değerler olan ve yalnızca Boole özelliklerini başlatmak için kullanılan oluşturucu parametreleri için Boolean kullanmayı düşünün.

Argümanları Doğrulama

✔️ Genel, korumalı veya açıkça uygulanan üyelere geçirilen bağımsız değişkenleri doğrulamayı ihmal etmeyin. Doğrulama başarısız olursa System.ArgumentException veya alt sınıflarından birini fırlatın.

Gerçek doğrulamanın genel veya korumalı üyenin kendisinde gerçekleşmesi gerekmediğini unutmayın. Bu, bazı özel veya dahili rutinlerde daha düşük seviyede gerçekleşebilir. Asıl nokta, son kullanıcılara sunulan tüm yüzey alanının argümanları kontrol etmesidir.

✔️ Eğer null bir bağımsız değişken geçirilirse ve üye null bağımsız değişkenleri desteklemiyorsa, ArgumentNullException fırlatın.

✔️ DO enum parametrelerini doğrulayın.

Enum bağımsız değişkenlerinin enum tarafından tanımlanan aralıkta olacağını varsaymayın. CLR, değer numaralandırmada tanımlanmasa bile herhangi bir tamsayı değerinin bir numaralandırma değerine dönüştürülmesine olanak tanır.

❌ Numaralandırma aralığı denetimi yapmak için Enum.IsDefined KULLANMAYIN.

✔️ Değiştirilebilir bağımsız değişkenlerin doğrulandıktan sonra değişmiş olabileceğini unutmayın.

Üye güvenlik özelliğine duyarlıysa, bir kopya oluşturmanız ve ardından tartışmayı doğrulayıp işlemeniz tavsiye edilir.

Parametre Aktarımı

Çerçeve tasarımcısının perspektifinden bakıldığında üç ana parametre grubu vardır: değere göre parametreler, ref parametreler ve out parametreler.

Bağımsız değişken değer parametresiyle geçirildiğinde, eleman geçirilen gerçek bağımsız değişkenin bir kopyasını alır. Bağımsız değişken bir değer türüyse, bağımsız değişkenin bir kopyası yığına konur. Bağımsız değişken bir referans türüyse, referansın bir kopyası yığına konulur. C#, VB.NET ve C++ gibi en popüler CLR dilleri varsayılan olarak parametreleri değere göre geçirir.

Bir ref parametresi aracılığıyla bir bağımsız değişken geçirildiğinde, üye, bu geçirilen gerçek bağımsız değişkene bir referans alır. Bağımsız değişken bir değer türüyse, bağımsız değişkenin referansı yığına konur. Bağımsız değişken bir referans türüyse, referansa referans yığına konur. Ref parametreleri, üyenin çağıran tarafından geçirilen bağımsız değişkenleri değiştirmesine izin vermek için kullanılabilir.

Out parametreleri, bazı küçük farklarla parametrelere ref benzer. Parametre başlangıçta atanmamış kabul edilir ve kendisine bir değer atanmadıkça üye gövdesinde okunamaz. Ayrıca, üye dönmeden önce parametresine bir değer atanmalıdır.

out veya ref parametrelerini kullanmaktan KAÇıNıN.

out veya ref parametrelerini kullanmak için işaretçilerle ilgili deneyim gerektirir, değer türleri ve referans türleri arasındaki farkın anlaşılması, ve birden fazla dönüş değerine sahip yöntemlerin işlenmesi gerekir. Ayrıca out ve ref parametreleri arasındaki fark geniş çapta anlaşılmamaktadır. Genel hedef kitle için tasarım yapan çerçeve mimarları, kullanıcıların out veya ref parametreleriyle çalışma konusunda yetkin olmasını beklememelidir.

❌ Başvuru türlerini referans üzerinden GEÇİRMEYİN.

Kuralda, referansları değiştirmek için kullanılabilecek bir yöntem gibi bazı sınırlı istisnalar vardır.

Değişken Parametre Sayısına Sahip Üyeler

Değişken sayıda bağımsız değişken alabilen üyeler, bir dizi parametresi sağlanarak ifade edilir. Örneğin, String aşağıdaki yöntemi sağlar:

public class String {
    public static string Format(string format, object[] parameters);
}

Kullanıcı String.Format yöntemini aşağıdaki gibi çağırabilir:

String.Format("File {0} not found in {1}",new object[]{filename,directory});

C#'taki params anahtar kelimesini bir dizi parametresine eklemek, bu parametreyi params dizi parametresi haline getirir ve geçici bir dizi oluşturmak için bir kısayol sağlar.

public class String {
    public static string Format(string format, params object[] parameters);
}

Bunu yapmak, kullanıcının dizi öğelerini doğrudan bağımsız değişken listesine geçirerek yöntemini çağırmasına olanak tanır.

String.Format("File {0} not found in {1}",filename,directory);

params anahtar sözcüğünü yalnızca parametre listesindeki son parametreye eklenebileceğini unutmayın.

✔️ Son kullanıcıların az sayıda öğe içeren dizileri geçirmesini bekliyorsanız, params anahtar sözcüğünü dizi parametrelerine eklemeyi göz önünde bulundurun. Yaygın senaryolarda çok sayıda öğe geçirilmesi bekleniyorsa, kullanıcılar büyük olasılıkla bu öğeleri satır içi olarak geçirmeyecektir ve bu nedenle params anahtar sözcüğü gerekli değildir.

❌ Çağıranın girdisi neredeyse her zaman zaten bir dizide ise, params dizilerini kullanmaktan kaçının.

Örneğin bayt dizisi parametrelerine sahip üyeler tek tek bayt geçirilerek neredeyse hiçbir zaman çağrılmaz. Bu nedenle, .NET Framework'teki bayt dizisi parametreleri params anahtar sözcüğünü kullanmaz.

❌ Params dizi parametresini alan üye diziyi değiştiriyorsa, params dizilerini KULLANMAYIN.

Birçok derleyicinin argümanları üyeye çağrı sitesinde geçici bir dizi içine alması nedeniyle, dizi geçici bir nesne olabilir ve dolayısıyla dizide yapılan herhangi bir değişiklik kaybolabilir.

✔️ Daha karmaşık bir aşırı yükleme kullanılamasa bile, basit bir aşırı yüklemede params anahtar sözcüğünü kullanmayı düşünün.

Tüm aşırı yüklemelerde olmasa bile kullanıcıların params dizisini tek bir aşırı yüklemede bulundurmaya değer verip vermeyeceğini kendinize sorun.

✔️ DO, params anahtar sözcüğünü kullanmayı mümkün kılmak için parametreleri sıralamayı deneyin.

✔️ Performansa duyarlı API'lerde az sayıda bağımsız değişken içeren çağrılar için özel aşırı yüklemeler ve kod yolları sağlamayı göz önünde bulundurun.

Bu, AZ sayıda bağımsız değişkenle API çağrıldığında dizi nesneleri oluşturmaktan kaçınmayı mümkün kılar. Dizi parametresinin tek bir biçimini alıp sayısal bir sonek ekleyerek parametrelerin adlarını oluşturur.

Bunu yalnızca bir dizi oluşturup daha genel yöntemi çağırmak yerine kod yolunun tamamı için özel durum oluşturacaksanız yapmanız gerekir.

✔️ DO, null değerinin params dizisi bağımsız değişkeni olarak geçirilebileceğini unutmayın.

İşlemeden önce dizinin null olmadığını doğrulamanız gerekir.

❌ Üç nokta olarak da bilinen varargs yöntemleri kullanmayın.

C++ gibi bazı CLR dilleri, yöntem olarak adlandırılan varargs değişken parametre listelerini geçirmek için alternatif bir kuralı destekler. Kural, CLS uyumlu olmadığından çerçevelerde kullanılmamalıdır.

İşaretçi Parametreleri

Genel olarak, işaretçiler iyi tasarlanmış bir yönetilen kod çerçevesinin genel yüzey alanında görünmemelidir. Çoğu zaman işaretçiler kapsüllenmelidir. Ancak, bazı durumlarda birlikte çalışabilirlik nedenleriyle işaretçiler gereklidir ve bu gibi durumlarda işaretçileri kullanmak uygundur.

✔️ İşaretçiler CLS uyumlu olmadığından, işaretçi bağımsız değişkeni alan her üye için bir alternatif sağlayın.

❌ İşaretçi bağımsız değişkenlerinde pahalı bağımsız değişken denetimi yapmaktan KAÇıNıN.

✔️ İşaretçiler içeren üyeleri tasarlarken yaygın işaretçi ilişkili kuralları izleyin.

Örneğin, aynı sonucu elde etmek için basit işaretçi aritmetiği kullanılabildiğinden başlangıç dizinini geçirmeye gerek yoktur.

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