在一个类中有一个相当长的成员函数。假设我们有
class Customer {
public:
void process();
...
};
方法进程本质上很长,由几个不同的组成 脚步。你希望这些步骤成为他们自己的功能,以避免拥有 过程方法中的多个抽象级别。我已经想到了这些 不同的选择(包括noop-alternative):
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);
};
担忧:步骤的私有方法(至少其中一些)不会 对所有班级成员开展工作。它们没有副作用,只有它们 从参数计算一个值并返回它,所以他们根本不需要 是该班的成员职能。
担忧:由于所有这些原因,功能变得很长,而且可能难以阅读 步骤中的细节使得很难看到哪些步骤的大局 该过程包含。
(也许上述情况都没有,但有些我没有想过。)
答案 0 :(得分:1)
这个问题并非与语言无关。并非所有语言都具有独立功能。 在C ++或C#中,我可能会使用私有成员函数(如果可能的话,静态)。
在C ++中,您可以使用独立函数(可能在匿名命名空间中),因此它们对外部不可见。
答案 1 :(得分:1)
我会指出你的重构书 - 特别是马丁福勒的重构,以及约书亚凯里夫斯基的重构模式。在这些书中深入探讨了这个问题。
您描述的“独立”选项通常称为“辅助方法”;这没有什么本质上的错误,除了它们经常爆炸成为方法的核心,这导致依赖性爆炸。
如果代码与相关类的职责直接相关,则私有(静态)方法最佳。
保持原样可以 - 但是方法的复杂性和包含错误的可能性之间存在相当清楚的相关性。如果这是一个活的代码库,我会重构它。