Правильное соглашение об именах для делегата .NET? - PullRequest
74 голосов
/ 27 февраля 2010

По соглашению классы часто называют как существительные, методы как глаголы и интерфейсы как прилагательные.

Каково общее соглашение об именах для делегата? Или как можно отличить его имя, когда делегаты перечислены среди типов и прочего?

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

Некоторые мысли:

delegate object ValueExtracting(object container);

delegate object ValueExtractor(object container);

delegate object ValueExtractionHandling(object container);

delegate object ValueExtractionHandler(object container);

Ответы [ 7 ]

98 голосов
/ 27 февраля 2010

Лично я использую пару разных шаблонов:

[Task][State]Handler - UITaskFinishedHandler

[Event]Handler - ControlLoadedHandler

[Function Name]Delegate - DoSomeWorkDelegate - используется, когда мне нужно создать делегата для вызова функции в другом / новом потоке

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

Когда у вас есть проект, который использует много многопоточность или асинхронные вызовы WCF, вы можете получить множество делегатов, поэтому важно принять стандарт, который, по крайней мере, имеет для вас смысл.

38 голосов
/ 23 сентября 2014

Microsoft Framework Design Guidelines - альманах именования для меня говорит следующее по теме:

√ СЛЕДУЕТ добавлять суффикс "EventHandler" к именам используемых делегатов. в событиях.
√ ДОБАВЛЯЙТЕ суффикс «Обратный звонок» к именам делегатов других чем те, которые используются в качестве обработчиков событий.
X НЕ добавляйте суффикс «Делегат» к делегату.

15 голосов
/ 27 февраля 2010

Поскольку делегат - это то, что выполняет действие (глагол), делегат должен быть назван так, как вы бы назвали то, что выполняет это действие. Возьмите Converter<TInput, TOutput> для примера. Глагол Преобразовать . То, что выполняет преобразование, называется преобразователь , отсюда и название делегата.

6 голосов
/ 27 февраля 2010

Это зависит от нескольких вещей.

Если делегат будет использоваться в качестве события, он должен всегда именоваться подтипом 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 голосов
/ 27 февраля 2010

Я никогда не думал об этом, в основном потому, что я просто использовал одну из перегрузок EventHandler<T>, Func<T> или Action<T> и никогда не удосужился определить свою собственную. Я бы, вероятно, выбрал ValueExtractor из тех, что вы перечислили. Это делает его более похожим на объект, и когда вы вызываете его, вы будете использовать этот объект для выполнения действия. Например:

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

Кроме того, большинство встроенных делегатов также именуются как существительные. Если есть сомнения, следуйте .NET Framework.

0 голосов
/ 27 февраля 2010

На основании Enumerable.Sum я передам делегата как Func<object, object> и назову параметр selector:

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

Если вам нужно сделать для этого собственного делегата, я бы выбрал ValueExtractor, поскольку это наиболее описательное имя для того, что он делает.

0 голосов
/ 27 февраля 2010

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

...