首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分解大成员函数

分解大成员函数
EN

Stack Overflow用户
提问于 2011-09-28 09:29:37
回答 2查看 66关注 0票数 3

分解成员函数

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

代码语言:javascript
复制
class Customer {
public:
        void process();

...
};

该方法过程自然是长的,由几个不同的步骤组成。您希望这些步骤是它们自己的函数,以避免在流程方法中有多个抽象级别。我想过这些不同的选择(包括备选方案):

为类之外的步骤创建独立函数。

代码语言:javascript
复制
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);
};

注意事项:这门课不那么独立。独立函数对于流程函数是如此的特殊,以至于任何其他代码都不会对它们感兴趣,因此将它们排除在类之外是不自然的。

创建私有方法。

代码语言:javascript
复制
class Customer {
public:
        void process();
private:
        double step_a(double foo);
        void step_b(double bar);
};

注意事项:这些步骤的私有方法(至少其中一些)根本不会对任何类成员进行操作。它们没有副作用,它们只从参数中计算一个值并返回它,因此它们根本不需要成为类的成员函数。

离开客户::按原样处理

注意事项:函数变得很长,并且可能很难阅读,因为步骤中的所有细节使得很难看到流程包含的步骤的总体情况。

问题:

处理这件事最干净的方法是什么?

(也许没有上述任何一件事,但有些事我没有想到。)

EN

回答 2

Stack Overflow用户

发布于 2011-09-28 09:37:24

问题并不是语言不可知论。并非所有语言都有独立的功能。在C++或C#中,我可能会使用私有成员函数(如果可能的话是静态的)。

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

票数 1
EN

Stack Overflow用户

发布于 2011-09-28 10:23:30

我要指出的是重构书籍--尤其是Martin的重构,和Joshua对模式的重构。这些书中对这个问题作了较深入的探讨。

您所描述的“独立”选项通常称为“辅助方法”;除了它们常常成为该方法的核心之外,这种方法本身没有什么问题,这会导致依赖性爆炸。

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

让它保持原样是可以的,但方法的复杂性与它包含bug的可能性之间存在着相当好的相互关系。如果这是一个活的代码库,我会重构它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7581088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档