Правильна умова іменування для типу .NET Delegate?


83

За умовами класи часто називаються іменниками, методи на зразок дієслів, а інтерфейси - як прикметники.

Яка загальна умова імен для делегата? Або який хороший спосіб розрізнити його назву, коли делегатів перелічено серед типів та інших речей?

Моє безпосереднє припущення полягає в тому, щоб назвати делегата, швидше за все, прикметником, оскільки інтерфейс одного методу часто можна замінити делегатом.

Деякі думки:

delegate object ValueExtracting(object container);

delegate object ValueExtractor(object container);

delegate object ValueExtractionHandling(object container);

delegate object ValueExtractionHandler(object container);

Відповіді:


112

Особисто я використовую кілька різних моделей:

[Task][State]Handler - UITaskFinishedHandler

[Event]Handler - ControlLoadedHandler

[Function Name]Delegate - DoSomeWorkDelegate - використовується, коли мені потрібно створити делегата для виклику функції в іншому / новому потоці

[Task]Callback - ContainerLoadedCallback - використовується, коли елемент керування A запускає дію, керування B виконує більшу частину роботи, а елемент керування A передав залежність до елементу керування B (тобто ControlA, можливо, передав контейнер користувацького інтерфейсу для заповнення ControlB і потребує повідомлення, щоб фактично показати контейнер )

Коли у вас є проект, який використовує багато багатопотокових або асинхронних викликів WCF, у підсумку може плавати багато делегатів, тому важливо прийняти стандарт, який, принаймні, має для вас сенс.


+1 Це гарна згода. Я також погоджуюсь з відповіддю @Aaronaught нижче, де делегат використовує тип події, має мати суфікс "EventHandler" замість просто "Handler".
Самуель

1
"[Назва функції] Делегат" порушує CA1711, на жаль. Я люблю використовувати "[Ім'я функції] Func" або "[Ім'я функції] Дія", залежно від того, має він тип повернення чи ні.
Tinister

1
Це, мабуть, одна з найбільш корисних (і найкоротших) конвенцій, яку я бачив до цього часу. +1 від мене. Дякуємо, що поділилися @slugster
FullStackForger


3
@MelbourneDeveloper розповідають, що хлопці, які створили RequestDelegateдля asp.net-core; -]
t3chb0t

48

Настанови Microsoft Framework Design Guide - альманах іменування для мене, говорить наступне щодо цієї теми:

√ НЕ додайте суфікс "EventHandler" до імен делегатів, які використовуються в подіях.
√ НЕ додайте суфікс "Callback" до імен делегатів, крім тих, що використовуються як обробники подій.
X НЕ додайте суфікс "Делегат" до делегата.


16
Забавно, що MS каже: "НЕ додавати суфікс" Делегат "до делегата", але в цьому прикладі у них є делегат під назвою ProcessBookDelegate...
PadawanLondon

1
@PadawanLondon та ж історія, що і RequestDelegateв asp.net-core - стільки до узгодженості та конвенцій кодування. Думаю, навіть не читають власні документи.
t3chb0t

16

Оскільки делегат - це те, що виконує дію (дієслово), делегатові слід назвати те, що ви називали б тим, що виконує цю дію. Візьмемо Converter<TInput, TOutput>для прикладу. Дієслово - Convert . Те, що робить перетворення, називається перетворювачем , звідси і ім'я делегата.


6

Це залежить від кількох речей.

Якщо делегат буде використовуватися як подія, його завжди слід називати EventHandlerпідтипом, наприклад:

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

Якщо це не подія, то MS кодування керівних принципів (які я ніколи не можу здатися , щоб знайти правильну копію на Google) явно рекомендувати проти включаючи такі слова , як «делегат» або «обробник» у назві делегата, за винятком того, в окремому випадку EventHandlerтипи.

Зазвичай делегатів слід називати за діями , як це буде ValueExtracting(якщо делегат відбувається до вилучення значення) або ValueExtracted(після вилучення).

Func<T1, T2, ..., TResult>Синтаксис делегат також стає все більш поширеним, але якщо у вас є 4 або більше параметрів , що йдуть в неї, вам не потрібно оголошувати свої власні взагалі - просто використовувати існуючий:

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

Цей синтаксис найкращий, коли делегат використовується як закриття . Сам делегат має не надто цікаве ім'я, але аргументом є іменник агента (екстрактор, постачальник, оцінювач, селектор тощо)

Більшість звичаїв делегатів входять до однієї з вищезазначених категорій, тому з’ясуйте, для якої з них він використовується, щоб вибрати його належним чином.


3

Я ніколи не думав про це, в основному , тому що я просто використовувати один з EventHandler<T>, Func<T>або Action<T>перевантажень і ніколи не турбувати визначення моїх. Я б, напевно, вибрав ValueExtractor з тих, які ви перерахували. Це звучить більше як об’єкт, і коли ви його викликаєте, ви будете використовувати цей об’єкт для виконання дії. Наприклад:

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

Крім того, більшість вбудованих делегатів також називаються іменниками. Якщо ви сумніваєтесь, дотримуйтесь платформи .NET.


0

Я б пішов із ValueExtraction ..
Я ніколи не думав, чому, але я здогадуюсь, тому що ви зберігаєте операцію, і це має бути іменник .. строго це не операція, я знаю ...


0

Виходячи з того Enumerable.Sum, я передав делегата як a Func<object, object>та назвав параметр selector:

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

Якщо вам доведеться зробити для цього власного делегата, я б погодився, ValueExtractorоскільки це найбільш описова назва того, що він робить.


Ці загальні представники (Action та Func) відповідають у 95% випадків. Є деякі випадки, коли їх надзвичайно недостатньо - тоді делегат ускладнює підпис І часто передається. В основному, те, що робить кожен аргумент, повинно бути очевидним, якщо це не так, створення іменованого делегата - це гарна ідея.
Matěj Zábský

0

У випадку подій (з делегатами) Windows Forms використовує таку домовленість:

Делегат:

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

Подія:

public event MouseEventHandler MouseClick;

Слухач події:

this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseClick);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.