我正在阅读Martin Fowler的《重构》一书中的常见代码气味。在这种情况下,我想知道我在代码库中看到的一种模式,并且可以客观地将其视为一种反模式。
模式是一种将对象作为参数传递给一个或多个方法的模式,所有这些方法都会更改对象的状态,但是没有一个返回对象。因此,它依赖于C#/。NET(在这种情况下)的按引用传递特性。
var something = new Thing();
// ...
Foo(something);
int result = Bar(something, 42);
Baz(something);
我发现(尤其是方法名称不正确时),我需要研究此类方法以了解对象状态是否已更改。由于我需要跟踪调用堆栈的多个级别,因此这会使代码理解更加复杂。
我想建议改进此类代码,以返回具有新状态的另一个(克隆的)对象,或在调用站点更改该对象所需的任何操作。
var something1 = new Thing();
// ...
// Let's return a new instance of Thing
var something2 = Foo(something1);
// Let's use out param to 'return' other info about the operation
int result;
var something3 = Bar(something2, out result);
// If necessary, let's capture and make explicit complex changes
var changes = Baz(something3)
something3.Apply(changes);
在我看来,第一个模式是根据假设选择的
- 减少了工作量或减少了代码行
- 它使我们既可以更改对象,又可以返回其他一些信息
- 效率更高,因为我们的实例更少
Thing
。
我举例说明了一种替代方法,但要提出它,则需要对原始解决方案提出争议。如果有什么论据可以证明原始解决方案是反模式?
我的替代解决方案有什么问题(如果有的话)呢?