我是 C# 新手,必须维护一个 C# 应用程序。现在我找到了一个有 32 个参数的方法(不是自动生成的代码)。
从 C/C++ 我记得经验法则“4 参数”。它可能是一个老式的规则,可以追溯到旧的 0x86 编译器,其中 4 个参数可以容纳在寄存器(快速)或堆栈中。
我不关心性能,但我确实感觉每个函数 32 个参数即使在 C# 中也不容易维护。
还是我完全不是最新的?
C# 的经验法则是什么?
谢谢你的任何提示!
我是 C# 新手,必须维护一个 C# 应用程序。现在我找到了一个有 32 个参数的方法(不是自动生成的代码)。
从 C/C++ 我记得经验法则“4 参数”。它可能是一个老式的规则,可以追溯到旧的 0x86 编译器,其中 4 个参数可以容纳在寄存器(快速)或堆栈中。
我不关心性能,但我确实感觉每个函数 32 个参数即使在 C# 中也不容易维护。
还是我完全不是最新的?
C# 的经验法则是什么?
谢谢你的任何提示!
没有普遍的共识,这取决于你问谁。
一般来说 - 可读性受到影响的那一刻,有太多......
Bob Martin 说,理想的参数数量是 0,而 3 正在拉伸它。
32 个参数是一种巨大的代码气味。这意味着这个类有太多的责任,需要重构。即使应用参数对象重构听起来我也觉得它会隐藏一个糟糕的设计而不是解决问题。
来自第 10 周清洁代码提示:
函数应该有少量的参数。没有论据是最好的,其次是一、二、三。超过三个是非常值得怀疑的,应该避免带有偏见。
嗯 32 个参数太多了。我猜的人有多少规则。然而,常识表明超过 6 个变得笨拙。
当您有这么多参数时,最好将对象作为单个参数传递并将参数作为属性,至少更易于阅读。
C# 不限制参数的最大数量,AFAIK。
但 IL 确实:0x1FFFFFFF。
当然,这篇文章并不是编写具有大量参数的方法的指南。
我相信开发者社区的普遍感觉是最多 5 或 6 个参数。我见过像你这样的方法的时候,有人做类似“SaveCustomer”的事情并传递每个字段而不是传递客户对象。
对此没有灵丹妙药的答案。一切都取决于您和您的开发团队。参数的数量也可能达到 32 之类的数字,即使这会导致考虑糟糕的设计,但这是在职业生涯中可能会遇到的事情。
对此的普遍共识是
使用重载函数,在不同函数之间分割参数
func A(a,b)
{
A(a,b,c);
}
可以使用params
关键字在数组中传递任意信息,例如object[]
可以使用Key-value
可以保存大量信息并恢复它的商店
一般来说,他们说code-line
不必太长,然后限制您在编辑器中水平滚动,即使这与问题主题并不严格相关,但可能会导致一些想法。
希望这可以帮助。
您可以通过创建一个作为单个参数传入的对象来采取另一种方法?
对于参数,我从来没有经验法则,但常识和实用性通常占上风。
虽然我怀疑这个问题会因为争论而结束,但 32 肯定太多了。
一种选择是查看构建器模式,这至少会使任务更具可读性。
我认为现在最重要的是人类的可读性,而不是性能。我怀疑 .NET 中是否存在类似的性能行为,但即使确实存在,正确的代码也比执行稍快但做错事的代码有用得多。通过使其易于理解,您可以增加代码正确的机会。
少数参数——根据我的经验,很少超过 5 个——在大多数情况下是最好的。您可以考虑通过在随后调用该方法的类上以属性的形式提供参数来重构需要更多的代码。
我认为每个方法有零到五个参数是令人愉快的。但这取决于不同的东西,比如编码风格和类设计。
查看 .NET Framework,您会经常看到:
一个类,其方法几乎没有或几乎没有参数,但使用很少的属性来控制类的行为(而不是 30 个参数)。
具有大量方法的类,参数较少或没有参数,几乎没有属性。例如BinaryReader
。
使您的公共 API 尽可能简单。更少的参数可以帮助其他开发人员使用您的类,而无需了解太多“它是如何工作的”。使代码更易读。
瓦伦丁你有正确的感觉,32 个参数只意味着一个 - 完全出错了。根据我过去的 C++ 经验,我只看到了一个“参数”领导者:
它是 Win32 APi CreateWindow,有 11 个参数。
你永远不应该使用如此大量的参数。
另一方面,如果您对理论上的问题感兴趣(可能可以在面试时提出)-方法允许多少参数?
因此,正如上面提到的,C# 方法的参数不能超过 0x1FFFFFFF(IL 限制)。
您可以使用 params[] 数组来设置如此庞大的数量。
为什么会有这样的限制?
因为,如果您将此值转换为字节和参考大小的倍数(4 字节),您将收到 2 GB。
.NET 中的所有对象都有 2 GB 的限制,您永远不能创建超过 2 GB 的单个对象。
据我所知,对于您应该拥有多少参数并没有任何硬性规定。这完全取决于你在做什么。
但是对于大多数应用程序来说,32 个参数听起来有点太多了。这可能表明设计不好。如果您仔细观察,可能有一种方法可以简化事情。