Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 分解大成员函数 分解成员函数_Oop_Language Agnostic_Coding Style_Class Design - Fatal编程技术网

Oop 分解大成员函数 分解成员函数

Oop 分解大成员函数 分解成员函数,oop,language-agnostic,coding-style,class-design,Oop,Language Agnostic,Coding Style,Class Design,在类中有一个相当长的成员函数。假设我们有 class Customer { public: void process(); ... }; 方法过程本质上很长,由几个不同的步骤组成 步骤。您希望这些步骤是它们自己的函数,以避免 过程方法中的多层次抽象。我已经想到了这些 不同的选项(包括noop备选方案): 为类外的步骤创建独立函数。 担心:步骤的私有方法(至少其中一些)不会 对任何班级成员进行操作。它们没有副作用,只是 从参数中计算一个值并返回它,这样它们就完全不需要 成为该类

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

class Customer {
public:
        void process();

...
};
方法过程本质上很长,由几个不同的步骤组成 步骤。您希望这些步骤是它们自己的函数,以避免 过程方法中的多层次抽象。我已经想到了这些 不同的选项(包括noop备选方案):

为类外的步骤创建独立函数。 担心:步骤的私有方法(至少其中一些)不会 对任何班级成员进行操作。它们没有副作用,只是 从参数中计算一个值并返回它,这样它们就完全不需要 成为该类的成员函数

保持客户::流程不变 关注点:函数变得很长,并且可能很难阅读,因为 这些步骤中的细节使得我们很难看到哪些步骤的大局 该过程包含

问题: 处理这个问题最干净的方法是什么?
(也许以上都没有,但有些是我没有想到的。)

这个问题并不是真正的语言不可知论。并非所有语言都有独立的函数。 在C++或C语言中,我可能使用私有成员函数(如果可能的话,静态)。
<>在C++中,你可以使用独立的函数(可能在匿名命名空间中),这样它们就不可见了。

< P>我会指出你的重构书籍,特别是Martin Fowler的重构,以及Joshua Kerievsky的重构到模式。这些书对这个问题进行了深入的探讨

您描述的“独立”选项通常称为“帮助器方法”;这并没有本质上的错误,只是它们经常爆发成为方法的核心,这导致依赖性爆发

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


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

静态私有函数似乎是合理的。你同意我所说的选项吗?你对此有更多的想法吗?很多很多语言都有类和独立函数。即使它们没有独立的函数,我的两个listen选项仍然有效。如果必须平等地适用于所有语言,那么语言不可知的问题不是很少吗?我的意思是,总是会有脑力操…@Joel-Re你关心的问题:我认为特定的独立功能没有问题,只要它们是外部看不见的。可能通过使用匿名命名空间来避免链接器问题,以防其他代码使用同名的帮助器函数。私有成员函数更为明显。如果它们不在类成员上操作,则将其设置为静态。我完全同意你最后的担忧:无论如何:重构。我建议遵循坚实的编程原则,特别注意tje单一责任原则。请详细说明如何为我解决这个问题。
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);
};