【问题标题】:What is the preferred naming convention for Func<TResult> method parameters?Func<TResult> 方法参数的首选命名约定是什么?
【发布时间】:2011-05-19 16:04:16
【问题描述】:

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

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

我的问题是:我应该如何命名函数参数?

  • 我是否应该将其命名为对象,例如cacheLoader?
  • 我是否应该将其命名为方法,例如loadResult?
  • 我是否应该明确地将其称为函数,例如cacheLoadFunction? (我不喜欢这样。)

我对我应该如何命名 this 特定函数参数不太感兴趣,而对如何命名函数参数更感兴趣。 Stack Overflow 社区,你们怎么说?

【问题讨论】:

  • 它是一个函数,所以我会像其他函数一样命名它。
  • @codymanix 这也是一个让事情变得更糟的变量;)我更喜欢乔的回答。

标签: c# lambda naming-conventions


【解决方案1】:

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

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);

这个名词通常是与an agentive suffix 相称的动词。

在您的示例中,我将使用类似loader 或可能valueFactory 的内容。我个人不喜欢cacheLoader,因为大概是调用者而不是委托人来完成插入缓存的工作。

【讨论】:

  • 虽然我喜欢@Reed 将其命名为方法的想法,这样称呼它看起来更自然,但在我看来,框架先例是王牌。
【解决方案2】:

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

loadResult(result);

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

您可以附加诸如MethodDelegateLambda 之类的后缀,但这些通常只会使其冗长而不会增加清晰度。这可能取决于情况和您的编码标准,当然还有您的偏好。

【讨论】:

  • 我有点喜欢这个逻辑,除了一件事。应该选择参数名称以使调用者清楚地了解目的,而不一定要让方法的实现者...
  • @Reed:你说得对,这是有利于调用者的利益冲突。如果一个库公开了一个公共 API,那么参数的命名是神圣的。这是编码标准的一个例子。
  • 是的,参数名称似乎应该与调用者通信“传入一个可以执行此操作的方法”。无论调用者是实现方法还是找到方法,他都需要知道它应该做什么。
【解决方案3】:

我通常在我的命名中使用 delegate 这个词,以表明这个参数正在接收一个委托。例如,我可能会命名上述内容:

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

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

【讨论】:

  • 答案 here 说 MS 违反了这个约定。
猜你喜欢
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 2018-01-18
相关资源
最近更新 更多