分解成员函数
在类中有一个相当长的成员函数。假设我们有
class Customer {
public:
void process();
...
};该方法过程自然是长的,由几个不同的步骤组成。您希望这些步骤是它们自己的函数,以避免在流程方法中有多个抽象级别。我想过这些不同的选择(包括备选方案):
为类之外的步骤创建独立函数。
double step_a(vector<Order> orders, double foo);
void step_b(double bar);
void Customer::proccess()
{
double foo;
...
double bar = step_a(this->orders, foo);
...
step_b(bar);
};注意事项:这门课不那么独立。独立函数对于流程函数是如此的特殊,以至于任何其他代码都不会对它们感兴趣,因此将它们排除在类之外是不自然的。
创建私有方法。
class Customer {
public:
void process();
private:
double step_a(double foo);
void step_b(double bar);
};注意事项:这些步骤的私有方法(至少其中一些)根本不会对任何类成员进行操作。它们没有副作用,它们只从参数中计算一个值并返回它,因此它们根本不需要成为类的成员函数。
离开客户::按原样处理
注意事项:函数变得很长,并且可能很难阅读,因为步骤中的所有细节使得很难看到流程包含的步骤的总体情况。
问题:
处理这件事最干净的方法是什么?
(也许没有上述任何一件事,但有些事我没有想到。)
发布于 2011-09-28 09:37:24
问题并不是语言不可知论。并非所有语言都有独立的功能。在C++或C#中,我可能会使用私有成员函数(如果可能的话是静态的)。
在C++中,您可以使用独立的函数(可能在匿名名称空间中),因此外部看不到它们。
发布于 2011-09-28 10:23:30
我要指出的是重构书籍--尤其是Martin的重构,和Joshua对模式的重构。这些书中对这个问题作了较深入的探讨。
您所描述的“独立”选项通常称为“辅助方法”;除了它们常常成为该方法的核心之外,这种方法本身没有什么问题,这会导致依赖性爆炸。
如果代码与所涉类的职责直接相关,则最好使用私有(静态)方法。
让它保持原样是可以的,但方法的复杂性与它包含bug的可能性之间存在着相当好的相互关系。如果这是一个活的代码库,我会重构它。
https://stackoverflow.com/questions/7581088
复制相似问题