分解大会员功能

时间:2011-09-28 09:29:37

标签: oop language-agnostic coding-style class-design

分解成员函数

在一个类中有一个相当长的成员函数。假设我们有

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);
};

担忧:步骤的私有方法(至少其中一些)不会 对所有班级成员开展工作。它们没有副作用,只有它们 从参数计算一个值并返回它,所以他们根本不需要 是该班的成员职能。

保留Customer :: process按原样

担忧:由于所有这些原因,功能变得很长,而且可能难以阅读 步骤中的细节使得很难看到哪些步骤的大局 该过程包含。

问题:

处理这个问题最干净的方法是什么?

(也许上述情况都没有,但有些我没有想过。)

2 个答案:

答案 0 :(得分:1)

这个问题并非与语言无关。并非所有语言都具有独立功能。 在C ++或C#中,我可能会使用私有成员函数(如果可能的话,静态)。

在C ++中,您可以使用独立函数(可能在匿名命名空间中),因此它们对外部不可见。

答案 1 :(得分:1)

我会指出你的重构书 - 特别是马丁福勒的重构,以及约书亚凯里夫斯基的重构模式。在这些书中深入探讨了这个问题。

您描述的“独立”选项通常称为“辅助方法”;这没有什么本质上的错误,除了它们经常爆炸成为方法的核心,这导致依赖性爆炸。

如果代码与相关类的职责直接相关,则私有(静态)方法最佳。

保持原样可以 - 但是方法的复杂性和包含错误的可能性之间存在相当清楚的相关性。如果这是一个活的代码库,我会重构它。