我正在使用通过实例变量传递状态的类型。所以你会看到这样的方法:
public MyType MyMethod()
{
DoThisMethod();
DoThatMethod();
AndDoThis();
return _bleh;
}
这是公认的方法吗?
使用此代码有点令人不安,因为如果您不完全理解代码,实例变量可能会在您不知情的情况下通过其他方法进行转换。如果通过方法参数传递状态,那么您可以对传入的参数的值非常有信心。
答案 0 :(得分:5)
如果这些方法调用的顺序很重要,我会称之为“错误编程” - 正如您所说的,任何需要较早调用的方法都应该使用指示此方法的方法参数。
我非常确定Code Complete提供了一些很好的例子。
基本上类似于以下内容,其中每个方法都需要先前的调用结果。
public MyType MyMethod()
{
thisResult = DoThisMethod();
thatResult = DoThatMethod(thisResult);
_bleh = AndDoThis(thatResult );
return _bleh;
}
其次,我希望尽可能保持方法“正交”(即它们仅依赖于您提供它们的状态)。有关正交代码的精彩摘要,请参阅this article。
答案 1 :(得分:4)
广泛地说,功能分解。您描述的模式有时表示代码(a)过于彻底地分解,导致您必须跟踪执行路径以查看最终的组合行为,或(b)执行过多操作的问题。通过转换这些方法来获取参数而不是依赖于内部状态,您可以使它们更易于测试并且可能更具可读性。您可以根据需要在最外层函数中改变状态。
答案 2 :(得分:2)
这与函数式编程相反。我能想到的最接近的是“有状态编程”,但这似乎不够贬义。但它可能有资格成为结构化编程。
顺便说一句,如果您认为HTTP请求类似于方法调用,而“Session”实现就像对象实例一样,那么这正是许多网站设计的方式。而且(恕我直言)它也不是一个好的设计。
答案 3 :(得分:1)
看起来像是对全局错误的误解。我不知道这个特定样式的名称,但是知道它几乎和使用全局变量一样糟糕 - 我想如果函数被调整乱序,事情就会破坏。
答案 4 :(得分:0)
如果那些调用顺序的方法受到限制,也可以识别“顺序耦合”(http://en.wikipedia.org/wiki/Sequential_coupling)。