Правильное соглашение об именах для типа .NET Delegate?
По условным классам часто называются именами, такими как глаголы и интерфейсы, как прилагательные.
Каково общее соглашение об именах для делегата? Или какой хороший способ отличить его имя, когда делегаты перечислены среди типов и других вещей?
Мое непосредственное предположение - скорее назвать делегата скорее прилагательным, потому что один интерфейс метода часто может быть заменен делегатом.
Некоторые мысли:
delegate object ValueExtracting(object container);
delegate object ValueExtractor(object container);
delegate object ValueExtractionHandling(object container);
delegate object ValueExtractionHandler(object container);
Ответы
Ответ 1
Лично я использую пару разных шаблонов:
[Task][State]Handler
- UITaskFinishedHandler
[Event]Handler
- ControlLoadedHandler
[Function Name]Delegate
- DoSomeWorkDelegate - используется, когда мне нужно создать делегат для вызова функции в другом/новом потоке
[Task]Callback
- ContainerLoadedCallback - используется, когда элемент управления A запускает действие, управление которым B выполняет большую часть работы, и элемент управления A прошел зависимость для управления B (то есть ControlA мог пройти интерфейс контейнер для ControlB для заполнения и требует уведомления для фактического отображения контейнера)
Когда у вас есть проект, который использует много многопоточных или асинхронных вызовов WCF, вы можете столкнуться с большим количеством делегатов, плавающих вокруг, поэтому важно принять стандарт, который по крайней мере имеет смысл для вас.
Ответ 2
Microsoft Framework Design Guidelines - именной альманах для меня, говорит следующее по теме:
√ добавляйте суффикс "EventHandler" к именам делегатов, которые используются в событиях.
√ добавляйте суффикс "обратный вызов" к именам делегатов, кроме тех, которые используются в качестве обработчиков событий.
X НЕ добавляйте суффикс "Делегат" к делегату.
Ответ 3
Поскольку делегат - это то, что выполняет действие (глагол), делегат должен быть назван тем, что вы бы назвали тем, что выполняет это действие. Возьмите Converter<TInput, TOutput>
, например. Глагол Преобразовать. То, что делает преобразование, называется конвертер, поэтому имя делегата.
Ответ 4
Это зависит от нескольких вещей.
Если делегат будет использоваться как событие, его всегда следует называть подтипом 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);
Этот синтаксис лучше всего, когда делегат используется как закрытие. Сам делегат не имеет очень интересного имени, но аргумент является существительным агента (экстрактор, поставщик, оценщик, селектор и т.д.).
Большинство применений делегатов вписываются в одну из вышеуказанных категорий, поэтому выясните, какой из них он использует для выбора соответствующим образом.
Ответ 5
Я никогда не думал об этом, главным образом потому, что я просто использую одну из перегрузок EventHandler<T>
, Func<T>
или Action<T>
и никогда не буду определять свои собственные. Вероятно, я бы выбрал ValueExtractor из тех, которые вы указали. Это делает звук более похожим на объект, и когда вы его вызываете, вы будете использовать этот объект для выполнения действия. Например:
ValueExtractor extractor += Blah;
var value = extractor(data);
Кроме того, большинство встроенных делегатов называются именами. Если вы сомневаетесь, следуйте платформе .NET.
Ответ 6
Я бы пошел с ValueExtraction..
Я никогда не думал, почему, но я думаю, потому что вы храните операцию, и она должна быть существительным.
строго это не операция, я знаю...
Ответ 7
На основе Enumerable.Sum
я передал делегат как Func<object, object>
и назову параметр selector
:
void Foo(Func<object, object> selector) ...
Если вам нужно сделать для этого свой собственный делегат, я бы пошел с ValueExtractor
, так как это самое описательное имя для его создания.