将所有函数转换为类

时间:2011-04-20 08:53:32

标签: c++ refactoring oop

我正在阅读Fowler的书“重构:改进现有代码的设计”,它用相同的名称替换函数调用,并调用该类的构造函数代替原始函数调用。

我的问题是将所有函数(或多或少,除非非常简单的函数)转换为对象以使代码变得更加模块化是个好主意?

谢谢,

4 个答案:

答案 0 :(得分:5)

在我之前的评论中稍微扩展一下:

在C ++中,绝对没有理由将所有函数转换为类,某种处理对象。只需计算并返回一个值,函数就可以正常工作。

然而,如果你有一个大函数创建一个内部状态并在其处理过程中在几个地方使用它,或者(喘气!)将一些状态存储在全局变量中,该函数可能是一个变相课。在这种情况下,最好将状态存储在一个类对象中,其中有几个较小的成员函数在该公共状态下进行工作。

另一方面,从其参数计算值的函数通过将其放入类中而得到改进。

答案 1 :(得分:2)

不,为什么会这样?如果您具有逻辑上功能(无状态计算)的功能,并且没有令人信服的理由将其实现为类,那么只需将其实现为函数。

“使用相同名称类替换函数调用并调用该类的构造函数来代替原始函数调用”的建议是完全错误的:如何替换

int y = f(x);

class f和对其构造函数的调用?构造函数没有返回值!要使其发挥作用的唯一方法是在operator()上重载class f,以便您可以使用其中一个

int y = f(x)();
int y = f()(x);

这两者都毫无意义。 (另外,你必须记住你定义的每个函数对象需要哪一个。)

必须有一些你没有告诉我们的东西。

答案 2 :(得分:1)

在我看来,将函数转换为类是绝对没有意义的。你为什么要那样做?

当您将函数转换为对象时,您没有获得任何东西。方法调用实际上是相同的普通函数调用,只有隐藏参数this。在您的情况下,该参数将是多余的,因为您的对象没有任何状态。

我能想到将函数转换为对象的唯一原因是将函数作为对象传递给其他函数,但为此我们有函数指针或boost :: function或c ++ 0x lambdas。

答案 3 :(得分:0)

绝对没有! 将任何函数转换为类是没有意义的。

类即将管理某些对象状态并隐藏信息,函数是全局的,而且大部分是无状态的。许多失败的课程使软件效率低下且无法维护。