使用参数时不好的做法是什么?
使用参数时是否有任何原则要记住? 或者我可以看看他们只是一个让方法返回多个值的好方法吗?
语言devise者在指定输出参数时有什么想法?
一些想法后编辑:
正如我现在想的那样,我会倾向于说,过度使用输出参数可能会引起代码异味。 如果一个方法需要返回多于一个特定types的实例,则意味着该方法有一个以上的关注,这是违反SRP的。
就我个人而言,我不太喜欢超出既定TryParse
约定的参数。 我更愿意返回封装了不同参数的特定types的实例,因为它使代码更容易阅读imo。
如果您不想为此定义特定types,则可以在即将推出的.NET框架中使用Tupletypes。 元组基本上是一堆包装在一个types中的值。 他们在F#中使用很多。
根本不使用参数通常是不好的做法。 它通常表示一种方法正在做一个以上明确定义的事情。 我推荐使用它们的唯一时间是Interop场景,因为API的签名,它们有时是必需的。
class级devise工具专门说“避开参数” ,并进行长时间的讨论。
除非有一个很好的理由为一个方法使用out参数,通常最好是使用自定义的类或结构来保存结果。 使用输出参数会降低API的可用性。
需要注意的一个重要的警告是,在.NET 3.5 SP1之前,取值或返回值types的方法从不内联。 这可能会对小型和频繁调用的方法(例如向量math库的方法)产生巨大的性能影响。
这是SlimDXvectormath库提供使用参数而不是返回值的重载的主要原因之一; 它可以作为潜在的微观优化。
当我在我的类上编写静态TryParse方法时,我使用了参数。 只是为了保持与CLR同步。
除此之外,返回一个你所需要的类可能是一个更好的主意。
虽然out
参数有其用处,但在使用之前,应停下来思考,如果真的需要的话。 你可能会想出一个更简单,更干净的实现,不需要out
。
为什么是在networking中的参数错误的想法有更多的信息。
我通常将参数视为“代码味道”,如果碰到它们,会尝试重构为不同的方法。 正如有人已经指出,通常重构将创build一个新的类,汇总了你将通过参数返回的值。
只有返回值相同 – 即。 请小心所有被召集的会保留和使用的东西。 总的来说,我更喜欢一个包装对象, 使调用代码更具可读性。
在返回值types和成功指示符时,我经常使用可为空的types,而不是返回一个bool,并使用outtypes的out参数。 我甚至包装TryParse方法,以便它返回一个空值。
输出参数也不好,因为它们必须使用本地variables或字段。 你不能轻易地重构你的代码来使用属性。
创build一个自定义的类/结构几乎总是最好的,使用元组或空types。
有两种情况在使用参数时根本看不出问题,而这些情况通常是相互发生的:
- 当一个方法必须返回多个值时;
- 在私有方法中使用时,特别是在具有较低抽象级别的命令性子例程中。
基本原理的评论:
- 有时你可以拥有改变多个状态的操作,所以你可能只用一个函数调用来操作属于一个进程的一组对象(可能在语义上更有意义)。
- 由于class内variables应该具有较高的凝聚力,因此耦合度较高,所以我相信用这些方法
out
参数是“不伤人”的。 对于您期望在API中find的公共函数,情况恰恰相反; - 在C#中,out参数在源自更多过程API移植到OO的代码中似乎显示了很多。 数值和科学例程是我能find的最好的例子(alglib,AForge等)。 这强化了我的观点,即可以根据问题领域采取非常程序化的方式来解决内部实施细节问题。
作为一个改变两个相关但独立variables的语义“primefaces”操作的例子,下面是一些Python代码以及如何将它移植到C#中(在一个私有方法中):
python:
p1, p2 = FindClosestPair(p, listOfValues)
C#:
Point3D p1, p2; FindClosestPair(p, listOfValues, out p1, out p2);
我想不出一个更直接的做法(但我想知道可能的替代scheme)。