Prawidłowa konwencja nazewnictwa dla typu delegata .NET?

83

Zgodnie z konwencją klasy są często nazywane rzeczownikami, metodami takimi jak czasowniki i interfejsami, takimi jak przymiotniki.

Jaka jest powszechna konwencja nazewnictwa delegatów? Albo jaki jest dobry sposób na rozróżnienie jego nazwy, gdy delegaci są wymienieni wśród typów i innych rzeczy?

Moim bezpośrednim założeniem jest nazwanie delegata bardziej prawdopodobnym przymiotnikiem, ponieważ interfejs jednej metody można często zastąpić delegatem.

Kilka myśli:

delegate object ValueExtracting(object container);

delegate object ValueExtractor(object container);

delegate object ValueExtractionHandling(object container);

delegate object ValueExtractionHandler(object container);
John K.
źródło

Odpowiedzi:

112

Osobiście używam kilku różnych wzorców:

[Task][State]Handler - UITaskFinishedHandler

[Event]Handler - ControlLoadedHandler

[Function Name]Delegate - DoSomeWorkDelegate - używany, gdy potrzebuję utworzyć delegata do wywołania funkcji w innym / nowym wątku

[Task]Callback - ContainerLoadedCallback - używany, gdy kontrolka A uruchamia akcję, której kontrolka B wykonuje większość pracy, a kontrolka A przekazała zależność do kontrolki B (tj. ControlA mogła przekazać kontener UI do wypełnienia przez ControlB i potrzebuje powiadomienia, aby faktycznie pokazać kontener )

Jeśli masz projekt, który używa wielu wielowątkowych lub asynchronicznych wywołań WCF, możesz skończyć z dużą liczbą delegatów pływających w pobliżu, dlatego ważne jest, aby przyjąć standard, który przynajmniej ma dla Ciebie sens.

slugster
źródło
+1 To fajna konwencja. Zgadzam się również z odpowiedzią @Aaronaught poniżej, w której delegat używa przez typ zdarzenia powinien mieć sufiks „EventHandler” zamiast tylko „Handler”.
Samuel
1
„[Nazwa funkcji] Delegat” niestety narusza CA1711. Lubię używać „[Nazwa funkcji] Func” lub „[Nazwa funkcji] Akcja” w zależności od tego, czy ma typ zwrotu, czy nie.
Tinister,
1
To prawdopodobnie najbardziej przydatna (i najkrótsza) konwencja, jaką dotychczas widziałem. +1 ode mnie. Dzięki za udostępnienie @slugster
FullStackForger
Reguły kodu mówią, aby nie dodawać
Christian Findlay
3
@MelbourneDeveloper powiedz, że faceci, którzy stworzyli RequestDelegatedla asp.net-core; -]
t3chb0t
48

Microsoft Wytyczne projektowe ramowe - almanach nazewnictwa dla mnie, mówi, co następuje na temat:

√ DO dodać sufiks „EventHandler” do nazw delegatów używanych w zdarzeniach.
√ DODAJ sufiks „Callback” do nazw delegatów innych niż te używane jako programy obsługi zdarzeń.
X NIE dodawaj sufiksu „Delegat” do pełnomocnika.

Borislav Ivanov
źródło
16
Zabawne, że MS mówi „NIE dodawaj sufiksu„ Delegat ”do delegata”, ale w tym przykładzie mają delegata o imieniu ProcessBookDelegate...
PadawanLondon
1
@PadawanLondon ta sama historia z RequestDelegateasp.net-core - tyle do spójności i konwencji kodowania. Myślę, że nawet nie czytają swoich własnych dokumentów.
t3chb0t
16

Ponieważ delegat jest czymś, co wykonuje akcję (czasownik), delegat powinien nosić taką nazwę, jak nazwałbyś coś, co wykonuje tę akcję. Weźmy Converter<TInput, TOutput>na przykład. Czasownik to Convert . To, co dokonuje konwersji, nazywa się konwerterem , stąd nazwa delegata.

Kevin Kibler
źródło
6

To zależy od kilku rzeczy.

Jeśli delegat ma być używany jako zdarzenie, należy zawsze nazywać go EventHandlerpodtypem, na przykład:

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

Jeśli nie jest to wydarzenie, to MS wytyczne (który nigdy nie może wydawać się znaleźć odpowiedni egzemplarz w Google) kodujące wyraźnie zalecane przed tym słów takich jak „delegata” lub „obsługi” w nazwie delegat wyjątkiem w szczególnym przypadku EventHandlerrodzaje.

Zwykle delegaci powinni być nazwani po akcjach , które wyglądałyby tak ValueExtracting(jeśli delegat dzieje się przed wyodrębnieniem wartości) lub ValueExtracted(po wyodrębnieniu).

Func<T1, T2, ..., TResult>Składnia delegat jest również coraz bardziej powszechne, ale jeśli nie masz 4 lub więcej parametrów wchodząc w niego, nie trzeba zadeklarować własną rękę w ogóle - po prostu użyć istniejący:

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

Ta składnia jest najlepsza, gdy delegat jest używany jako zamknięcie . Sam delegat nie ma bardzo interesującej nazwy, ale argumentem jest rzeczownik agenta (ekstraktor, dostawca, oceniający, selektor itp.)

Większość zastosowań delegatów pasuje do jednej z powyższych kategorii, więc sprawdź, do której z nich jest używany, wybierz odpowiednio.

Aaronaught
źródło
3

Nigdy nie myślałem o tym, przede wszystkim dlatego, że po prostu użyć jednego z EventHandler<T>, Func<T>lub Action<T>przeciążeniem i nigdy nie przeszkadzało definiując własne. Prawdopodobnie wybrałbym ValueExtractor z tych, które wymieniłeś. To sprawia, że ​​brzmi bardziej jak obiekt, a kiedy go wywołasz, będziesz używać tego obiektu do wykonania akcji. Na przykład:

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

Ponadto większość wbudowanych delegatów nazywa się również jak rzeczowniki. W razie wątpliwości postępuj zgodnie z platformą .NET.

MikeP
źródło
0

Poszedłbym z ValueExtraction ..
Nigdy nie zastanawiałem się dlaczego, ale myślę, że ponieważ przechowujesz operację i powinna to być rzeczownik .. ściśle, to nie jest operacja, wiem ...

Matias
źródło
0

Na podstawie Enumerable.Sum, przekazałbym delegatowi jako a Func<object, object>i nazwałbym parametr selector:

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

Jeśli musisz wyznaczyć do tego własnego delegata, wybrałbym, ValueExtractorponieważ jest to najbardziej opisowa nazwa tego, co robi.

Sam Harwell
źródło
Te ogólne delegaty (Action i Func) są w porządku w 95% przypadków. Są jednak przypadki, w których są one zdecydowanie niewystarczające - wtedy delegat ma skomplikowany podpis ORAZ jest często przekazywany. Zasadniczo to, co robi każdy argument, powinno być oczywiste, jeśli tak nie jest, dobrym pomysłem jest wyznaczenie imiennego delegata.
Matěj Zábský
0

W przypadku zdarzeń (z delegatami) Windows Forms używa następującej konwencji:

Delegat:

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

Zdarzenie:

public event MouseEventHandler MouseClick;

Odbiornik wydarzeń:

this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseClick);
dan
źródło