【发布时间】:2013-03-12 13:47:29
【问题描述】:
返回 void 但更改其参数状态(即提供隐藏或隐式返回值)的方法通常是不好的做法吗?
我发现它们很难模拟,这表明它们可能是糟糕设计的标志。
有哪些模式可以避免它们?
一个非常人为的例子:
public interface IMapper
{
void Map(SourceObject source, TargetObject target);
}
public class ClassUnderTest
{
private IMapper _mapper;
public ClassUnderTest(IMapper mapper)
{
_mapper = mapper;
}
public int SomeOperation()
{
var source = new SourceObject();
var target = new TargetObject();
_mapper.Map(source, target);
return target.SomeMappedValue;
}
}
【问题讨论】:
-
如何使用 void Initialize() 方法,它返回 void 并且仅用于更改对象状态?还是 void Fill(object o) 对对象 o 执行一些操作?返回类型与内部状态和参数无关。方法的语义应该清楚地表明状态或参数是否会改变。如果方法做了更多的事情,它是有意的,那么它就是一种反模式。它更多的是关于干净的编码。
-
这正是我所追求的——语义不清楚,或者至少在这些情况下是混乱的。
标签: unit-testing mocking anti-patterns