12

所以像这样

public void MyMethod(object parameter)
//....
    BuildSomething(parameter);
    BuildLayers(parameter);
    BuildOtherStuff(parameter);
}

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

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

谢谢

4

3 回答 3

20

这是一个副作用

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

但是,这种模式有时很有用。

C# 对refandout关键字进行了专门编码,以表明预期方法会产生副作用。

于 2012-12-28T12:43:52.870 回答
0

我有不同的观点。

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

基于 Java 或 C# 等现代 OO 语言设计,我支持这样的想法,即如果更改参数值是丑陋的、错误的或不推荐的,他们将定义类型参数作为实例的副本,而不是引用

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

于 2012-12-28T13:42:41.037 回答
0

假设 的类型parameter不是真的object,而是一个包含可写属性或字段的类类型SomeProperty,那么当方法进入时, 的值parameter将是某个对象的标识(例如,自程序开始)。据我所知,该参数的值(意味着它所引用的对象的标识)在整个方法中将继续保持相同。

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

于 2013-01-08T00:28:40.463 回答