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);

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.


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


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.


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.


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.


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


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.


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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.