Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

Есть прецеденты для использования существительного в 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, потому что предположительно это вызывающий, а не делегат, который выполняет работу по вставке в кеш.

Ответ 2

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

loadResult(result);

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

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

Ответ 3

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

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

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