Каково предпочтительное соглашение об именах для параметров метода Func <TResult>? - PullRequest
20 голосов
/ 19 мая 2011

Я признаю, что этот вопрос субъективен, но меня интересует мнение сообщества. У меня есть класс кеша, который принимает функцию загрузчика кеша типа Func<TResult>, которую он использует для извлечения значения из базы данных и сохранения его в кеше.

public static class Cache
{
    public TResult Get<TResult>(string cacheKey, Func<TResult> cacheLoader) 
    {
        // Implementation
    }
}

Мой вопрос: Как мне назвать параметр функции?

  • Должен ли я назвать его как объект, например, cacheLoader
  • Должен ли я назвать это как метод, например, loadResult
  • Должен ли я явно ссылаться на него как на функцию, например, cacheLoadFunction? (Мне это не нравится.)

Меня меньше интересует, как я должен назвать этот конкретный параметр функции, и меня больше интересует, как вы называете параметры функции в целом. Что скажете вы, сообщество Stack Overflow?

Ответы [ 3 ]

22 голосов
/ 19 мая 2011

Существуют прецеденты для использования существительного в Framework, например,

Enumerable.Average<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector)

Enumerable.Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)

Enumerable.GroupBy<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)

ConcurrentDictionary<TKey,TValue>.GetOrAdd(TKey key, 
            Func<TKey, TValue> valueFactory);

Существительное часто является подходящим глаголом с агентивным суффиксом .

В вашем примере я бы использовал что-то вроде loader или, возможно, valueFactory. Лично мне не нравится cacheLoader, потому что, предположительно, вставка в кеш выполняет не вызывающий, а вызывающий.

7 голосов
/ 19 мая 2011

Мне нравится называть его как метод, чтобы при его вызове, вот так:

loadResult(result);

это похоже на обычный вызов метода, но регистр указывает, что это переменная, поэтому передаются обе части информации.

Вы можете добавить суффикс, например Method или Delegate или Lambda, но они часто делают его многословным, не добавляя ясности. Это может зависеть от ситуации, ваших стандартов кодирования и, конечно, ваших предпочтений.

2 голосов
/ 19 мая 2011

Обычно я использую рабочий делегат в своих именах, чтобы было очевидно, что этот параметр получает делегата.Например, я бы назвал выше:

public static class Cache
{
    public TResult Get<TResult>(string cacheKey, Func<TResult> cacheLoadingDelegate) 
    {
        // Implementation
    }
}

Я делаю это специально, чтобы избежать путаницы с предлагаемым наименованием в вопросе.cacheLoader звучит слишком похоже на объект, а loadResult - на объект / тип (сам результат).Мне также лично не нравится использовать function или method, поскольку делегат на самом деле не функция, а делегат - тип, который ссылается на функцию.

...