对于IEnumerable<T>
扩展方法的名称添加正确的后缀或前缀是否存在标准做法,如果它们是 derred 而不是立即执行。这是期望的,因此方法的用户立即知道它是否将被延迟执行。
示例(仅用于说明要点并解释我在说什么,不要;认为这些是代码中使用的实际精确方法):
public static IEnumerable<TOut> DoSomething<TIn, TOut>(this IEnumerable<TIn> items, Func<TIn, TOut> transform) {
var list = new List<TOut>();
foreach (var item in items) {
list.Add(transform(item));
}
return list;
}
public static IEnumerable<TOut> DoSomethingDeferred<TIn, TOut>(this IEnumerable<TIn> items, Func<TIn, TOut> transform) {
foreach (var item in items) {
yield return transform(item);
}
}
在上面的示例中,我添加了 Deferred 后缀来指定方法不会立即返回。但是我对这样的命名不满意,有更好的方法,惯例或最佳实践吗?
答案 0 :(得分:0)
我不相信命名此类方法存在“官方”约定。任何惯例都必须由您(如您所做)定义并传达给您的团队。
也就是说,有两种更简单的方法可以在不必定义任何内容的情况下实现目标:
作为惯例,通过返回类型区分它们。所有立即执行的方法的实现通常都会打包一个已知的数据类型来返回;例如List<T>
/ IList<T>
,数组,HashSet<T>
等。只需返回该类型即可。这样,一旦API的返回类型为IEnumerable<T>
,消费者就会知道它的延迟执行;否则,立即执行。
对方法发表评论。 (你应该这样做)。在该评论中,只需添加一个简短的注释,告诉用户该方法是立即执行还是延期。
答案 1 :(得分:0)
如果你看一下标准的LINQ操作,你会发现通常没有延迟版本和同一操作的直接版本,你会看到可以延迟完成的事情({{1} },Where
等),延期完成。基本规则是,如果可以推迟某些事情,那就推迟。
通常,很明显什么是延期的,什么不是。如果它返回Select
,则很可能推迟。如果它返回其他内容,则不能推迟。
所以我说你不需要后缀或前缀,我不认为有一个&#34;标准&#34;一个。你无论如何都不需要它们,因为你必须编写相同方法的两个版本是很少见的。