.NET Delege türü için uygun adlandırma kuralı?


83

Kurallara göre sınıflar genellikle isimler, fiiller gibi yöntemler ve sıfatlar gibi arayüzler gibi adlandırılır.

Temsilci için ortak adlandırma kuralı nedir? Ya da delegeler türler ve diğer şeyler arasında listelendiğinde adını ayırt etmenin iyi bir yolu nedir?

Benim ilk varsayım, bir temsilciye daha büyük olasılıkla bir sıfat vermektir, çünkü tek bir yöntem arabirimi genellikle bir temsilci ile değiştirilebilir.

Bazı düşünceler:

delegate object ValueExtracting(object container);

delegate object ValueExtractor(object container);

delegate object ValueExtractionHandling(object container);

delegate object ValueExtractionHandler(object container);

Yanıtlar:


112

Şahsen ben birkaç farklı model kullanıyorum:

[Task][State]Handler - UITaskFinishedHandler

[Event]Handler - ControlLoadedHandler

[Function Name]Delegate - DoSomeWorkDelegate - farklı / yeni bir iş parçacığı üzerinde bir işlevi çağırmak için bir temsilci oluşturmam gerektiğinde kullanılır

[Task]Callback - ContainerLoadedCallback - kontrol A, kontrol B'nin işin çoğunu yaptığı bir eylem başlattığında ve kontrol A, kontrol B'ye bir bağımlılık geçirdiğinde kullanılır (yani ControlA, ControlB'nin doldurması için bir UI konteynerini geçmiş olabilir ve konteyneri gerçekten göstermek için bildirim gerektirebilir )

Çok sayıda çoklu iş parçacığı veya zaman uyumsuz WCF çağrısı kullanan bir projeniz olduğunda, etrafta dolaşan çok sayıda delege ile karşılaşabilirsiniz, bu nedenle en azından sizin için anlamlı olan bir standart benimsemek önemlidir.


+1 Bu güzel bir kongre. Ayrıca, bir olay türü tarafından kullanılan bir temsilcinin yalnızca "İşleyici" yerine "Olay İşleyicisi" son ekine sahip olması gereken aşağıdaki @Aaronaught yanıtına da katılıyorum.
Samuel

1
"[İşlev Adı] Temsilcisi" maalesef CA1711'i ihlal ediyor. Bir dönüş türü olup olmadığına bağlı olarak "[Fonksiyon Adı] Func" veya "[Fonksiyon Adı] Eylem" kullanmayı seviyorum.
Tinister

1
Bu muhtemelen şimdiye kadar gördüğüm en yararlı (ve en kısa) kongre. Benden +1. @
Slugster'ı

Kod kuralları, herhangi bir temsilciye Delegate docs.microsoft.com/en-us/visualstudio/code-quality/…
Christian Findlay

3
@MelbourneDeveloper, RequestDelegatefor asp.net- core'u oluşturan adamların ; -]
t3chb0t

48

Microsoft'un Çerçeve Tasarım Kuralları - Benim için adlandırma almanak, diyor şu konu üzerine:

√ Olaylarda kullanılan delegelerin adlarına "EventHandler" sonekini EKLEYİN.
√ Olay işleyicisi olarak kullanılanlar dışındaki delege adlarına "Geri Arama" sonekini EKLEMEYİN.
X Bir delegeye "Delege" sonekini EKLEMEYİN.


16
MS'in 'Bir delegeye "Delege" son ekini EKLEMEYİN' ProcessBookDelegate
demesi komik

1
@PadawanLondon RequestDelegateasp.net-core ile aynı hikaye - tutarlılık ve kodlama kuralları için çok fazla. Sanırım kendi belgelerini bile okumuyorlar.
t3chb0t

16

Temsilci, bir eylemi (bir fiil) gerçekleştiren bir şey olduğundan, temsilci, bu eylemi gerçekleştiren bir şeye ad vermeniz gerekir. Converter<TInput, TOutput>Örneğin alın . Fiil Dönüştür'dür . Dönüştürme yapar şey denir dönüştürücü temsilci dolayısıyla adı.


6

Bu birkaç şeye bağlıdır.

Temsilci bir etkinlik olarak kullanılacaksa, buna her zaman bir EventHandleralt tür olarak atıfta bulunulmalıdır , örneğin:

public delegate void ValueExtractingEventHandler(object sender,
    ValueExtractingEventArgs e);

O bir olay, daha sonra (Google'da doğru kopyasını bulmak gibi asla) kurallarına kodlama MS değilse açıkça tavsiye karşı temsilci adına "temsilci" veya "işleyici" gibi ifadeler içeren dışında özel durumlarda EventHandlertürleri.

Normalde, temsilciler (temsilci değer çıkarılmadan önce gerçekleşirse) veya (ayıklamadan sonra ) gibi eylemlerden sonra adlandırılmalıdır .ValueExtractingValueExtracted

Func<T1, T2, ..., TResult>Temsilci sözdizimi da daha yaygın hale geliyor, ancak bunu içine gidiş 4 veya daha fazla parametre yoksa, hiç kendi ilan etmek gerekmez - sadece varolan bir kullanın:

object ExtractObject(object source, Func<object, object> extractor);

Bu sözdizimi, temsilci kapatma olarak kullanıldığında en iyisidir . Temsilcinin kendisinin çok ilginç bir adı yoktur, ancak argüman bir aracı isimdir (çıkarıcı, sağlayıcı, değerlendirici, seçici vb.)

Temsilci kullanımlarının çoğu yukarıdaki kategorilerden birine girer, bu nedenle hangisinin kullanıldığını uygun şekilde seçin.


3

Sadece birini kullanın çoğunlukla çünkü hiç düşünmemiştim EventHandler<T>, Func<T>ya Action<T>aşırı ve kendi tanımlama asla rahatsız. Muhtemelen listelediklerinizden ValueExtractor'ı seçerdim. Bu, daha çok bir nesne gibi görünmesini sağlar ve onu çağırdığınızda, bir eylemi gerçekleştirmek için o nesneyi kullanırsınız. Örneğin:

ValueExtractor extractor += Blah;
var value = extractor(data);

Ek olarak, yerleşik delegelerin çoğu isimler gibi adlandırılır. Şüpheniz olduğunda, .NET çerçevesini takip edin.


0

ValueExtraction ile giderdim ..
Nedenini hiç düşünmedim, ama sanırım bir operasyonu depoladığınız için ve bir isim olmalı .. kesinlikle bu bir operasyon değil, biliyorum ...


0

Buna bağlı olarak Enumerable.Sum, temsilciyi bir olarak iletir Func<object, object>ve parametreyi adlandırırdım selector:

void Foo(Func<object, object> selector) ...

Bunun için kendi temsilcinizi yapmanız gerekiyorsa, ValueExtractoryaptığı şey için en açıklayıcı isim bu olduğu için giderim .


Bu jenerik delegeler (Action ve Func), vakaların% 95'inde iyidir. Yine de çılgınca yetersiz oldukları bazı durumlar vardır - bu, delegenin karmaşık imzaya sahip olduğu VE çokça etrafta dolaştığı zamandır. Temel olarak, her bir argümanın ne yaptığı açık olmalıdır, eğer değilse, adlandırılmış bir delege yapmak iyi bir fikirdir.
Matěj Zábský

0

Olaylar durumunda (Temsilcilerle) Windows Forms aşağıdaki kuralı kullanır:

Temsilci:

public delegate void MouseEventHandler(object sender, MouseEventArgs e);

Etkinlik:

public event MouseEventHandler MouseClick;

Etkinlik İşleyici:

this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseClick);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.