改变方法内参数值,这是反模式

本文关键字:模式 方法 参数 改变 | 更新日期: 2023-09-27 17:50:06

像这样

public void MyMethod(object parameter)
//....
    BuildSomething(parameter);
    BuildLayers(parameter);
    BuildOtherStuff(parameter);
}
public void BuildSomething(object parameter)
{
//...
    parameter.SomeProperty = "sadsd";
//...
}

如果这是一个反模式,它叫什么?问题(可能)是您隐式地更改参数并使用更改后的值。我只是想知道这个反模式是什么

谢谢

改变方法内参数值,这是反模式

这是一种副作用。

这些通常是不好的,被认为是一种代码气味,因为它使推理和理解代码变得困难。

然而,这种模式有时是有用的。

c#编写了refout关键字,特别是,以表明一个方法预计会有副作用。

我有不同的观点。

尽管改变参数值会在调试过程或代码可读性中引入一些小问题,但对我来说,将这种做法称为"反模式"是没有意义的。

基于现代面向对象语言的设计,如Java或c#,我支持这样的想法,如果改变参数值是丑陋的、错误的或不推荐的,他们应该把定义的类型参数作为实例的副本,而不是引用

我不同意Oded所说的,我认为refout关键字应该只在你真正想要改变整个实例值的上下文中使用,完全替换它。使用其中一个关键字只是告诉"嘿,伙计,参数值可以在执行堆栈期间更改",对我来说听起来有点粗心。如果您的一个客户看到函数签名并且真的相信他可以替换整个东西怎么办?(在非预期行为的情况下)

假设parameter的类型不是真正的object,而是一个包含可写属性或称为SomeProperty的字段的类类型,那么当方法进入时,parameter的值将是某个对象的标识(例如,自程序开始以来创建的第459,192个对象)。据我所知,该形参的值(即它所指向的对象的标识)将在整个方法中保持不变。

更改传入参数的值(例如说parameter = someOtherObject)可能是代码异味,除非方法足够小,可以明显看到发生了什么