Func<TResult>方法参数的首选命名约定是什么?

30

我承认这个问题很主观,但我对社区的看法很感兴趣。我有一个缓存类,它需要一个Func<TResult>类型的缓存加载器函数,用于从数据库中检索并将其存储在缓存中。

public static class Cache
{
    public TResult Get<TResult>(string cacheKey, Func<TResult> cacheLoader) 
    {
        // Implementation
    }
}
我的问题是:如何给函数参数命名?
  • 我应该像一个对象一样命名它,比如cacheLoader吗?
  • 我应该像一个方法一样命名它,比如loadResult吗?
  • 我应该明确地将其称为函数,比如cacheLoadFunction吗?(我不喜欢这个。)

我对如何通常命名函数参数更感兴趣,而不仅仅是针对这个特定的函数参数。 Stack Overflow社区有何建议?


3
这是一个函数,所以我会像给其他函数命名一样给它命名。 - codymanix
@codymanix 这也是一个变量,让事情变得更糟糕了;)我更喜欢Joe的答案。 - nawfal
3个回答

34

在框架中使用名词是有先例的,例如:

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,因为假设是调用者而不是委托者将工作插入到缓存中。


1
虽然我喜欢 @Reed 的想法,即像方法一样对其进行命名,这样调用看起来更自然,但在我看来,框架的先例是王牌。 - John Bledsoe
我会对这个框架提出批评。它并不是一个值得效仿的范例。它是由大量开发人员为了满足公司的截止日期而编写的。通常它的可读性和整洁度都不够好。 - Vimes

8

我喜欢将其命名为方法,这样当你调用它时,就像这样:

loadResult(result);

它看起来像是一个普通的方法调用,但大小写表明它是一个变量,因此两个信息都被传递了。

你可以添加后缀,例如MethodDelegateLambda,但这些通常只会使它冗长而没有增加清晰度。这取决于情况和您的编码标准,当然还有您的偏好。


我有点喜欢这个逻辑,除了一件事。参数名称应该被选择为使调用者清楚其目的,而不一定是方法实现者... - Reed Copsey
@Reed:你说得对,这是一种利益冲突,有利于调用者。如果一个库公开了API,参数的命名就是神圣的。这是编码标准的一个例子。 - Rick Sladkey
是的,看起来参数名称应该向调用者传达“传递一个将执行此操作的方法”。无论调用者实现方法还是找到一个,他都需要知道它应该做什么。 - John Bledsoe

6

通常我会在命名中使用单词delegate,以明确表明此参数接收一个委托。例如,我可能会将上述命名为:

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

我这样做是为了避免问题中建议的命名方式造成混淆。 cacheLoader 听起来太像一个对象,而 loadResult听起来像一个对象/类型(结果本身)。 我也不喜欢使用 functionmethod,因为委托实际上不是一个函数,而是一个引用函数的类型 - 委托。


2
这里的答案(https://dev59.com/qXE95IYBdhLWcg3wXcnd#25993838)说微软反对那个约定。 - nawfal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接