【发布时间】:2011-08-04 11:29:51
【问题描述】:
我有两种方法:
BuildThing(Thing a);
BuildThings(IEnumerable<Thing> things);
从干净的代码的角度来看,这很好吗? 还是只使用 BuildThings 并仅通过一件事传递 IEnumerable 会更好?还是使用参数?
谢谢。
【问题讨论】:
标签: c# methods parameters refactoring
我有两种方法:
BuildThing(Thing a);
BuildThings(IEnumerable<Thing> things);
从干净的代码的角度来看,这很好吗? 还是只使用 BuildThings 并仅通过一件事传递 IEnumerable 会更好?还是使用参数?
谢谢。
【问题讨论】:
标签: c# methods parameters refactoring
你可以做一件事:
BuildThings(params Thing[] things);
这使您可以使用:
BuildThings(thing1, thing2, thing3, ...);
【讨论】:
个人喜好如下
界面:
void Build(Thing thing);
void Build(IEnumerable<Thing> things);
实现:
void Build(Thing thing)
{
Build(new [] { thing });
}
void Build(IEnumerable<Thing> things)
{
//do stuff
}
我更喜欢使用此模式的原因是因为它确保您保持DRY,同时为您提供具有多个重载的灵活性,这与您必须转换任何非数组可枚举的params 方式不同到一个数组。
【讨论】:
params 对于您的方法来说不是一个好的解决方案。
我认为只要你只有一个实现,就有 2 种或更多方法是可以的。
public void BuildThing(Thing a)
{
this.BuildThings(new List<Thing>(){a});
}
【讨论】:
您提供的方法似乎是一种很好的做法。当您只构建一个实例而不是多个实例时,您可能想做不同的事情。
我不会使用params,因为这会迫使您创建一个数组,例如,如果您有一个列表。
【讨论】:
纯粹从“干净代码”的角度来看,这完全没问题。尽管从功能上讲,替代方案可能更适合您,也可能不适合您。例如,使用params 会强制在调用之前枚举集合,而不是在调用内部延迟枚举。
【讨论】:
我会考虑两种情况:
BuildThing(Thing a) 中,我将使用BuildThings(IEnumerable<Thing> things) 并仅通过一件事传递 IEnumerableparams 创建一个方法 此选项有一个缺点 - 如果您想传递多个参数,则必须将每个 IEnumerable 转换为 Array(当然数组除外)。我可能会选择params 解决方案。
【讨论】: