it-roy-ru.com

Правильное соглашение об именах для делегата .NET?

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

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

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

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

delegate object ValueExtracting(object container);

delegate object ValueExtractor(object container);

delegate object ValueExtractionHandling(object container);

delegate object ValueExtractionHandler(object container);
74
John K

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

[Task][State]HandlerUITaskFinishedHandler

[Event]HandlerControlLoadedHandler

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

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

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

98
slugster

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

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

38
Borislav Ivanov

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

15
Kevin Kibler

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

Если делегат будет использоваться как событие, его следует всегда именовать подтипом EventHandler, например:

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

Если это не событие, то в руководствах по кодированию MS (которые я никогда не смогу найти нужную копию в Google) явно рекомендовать против, включая такие слова, как "делегат" или "обработчик" в имени делегата. , кроме в особом случае типов EventHandler.

Обычно делегаты должны быть названы после actions, что будет похоже на ValueExtracting (если делегат происходит до извлечения значения) или ValueExtracted (после извлечения).

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

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

Этот синтаксис лучше всего подходит, когда делегат используется как закрытие. Сам делегат не имеет очень интересного имени, но аргументом является существительное агента (экстрактор, поставщик, оценщик, селектор и т.д.)

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

6
Aaronaught

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

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

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

3
MikeP

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

0
Matias

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

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

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

0
Sam Harwell