上帝对象替换

时间:2014-01-13 16:38:29

标签: c++ class singleton instance god-object

我现在试图从我的服务器代码中删除上帝对象。

在我的服务器设计开始时,我决定将Worldconst个容器对象作为单身对象。

但我的服务器是多线程的,而单身人士并没有很好的解决方案。

所以我管理了它,并将这些类移动为Core类实例。

例如:

class Core
{
...
private:
World world;
CExpTable exptable;
...
};
新连接上的

CoreSession类提供对象的引用。

new Session(io_pool.getService(), world, exptable ...);

我只需要该对象的一个​​实例。 但上帝的对象是糟糕的设计模式,所以我想问一下,我怎样才能重新设计那个对象,避免它,并且单体模式设计是否良好?

1 个答案:

答案 0 :(得分:3)

首先,您可以阅读许多有关单身人士不良的帖子,例如this。还有很多关于为什么这种模式在大多数情况下并不真正有用的有效点。

至于你的重构:最好的方法是一步一步走。大转动通常会产生错误。根据我的经验,拆除一个神对象并不是很难。

您可以按以下步骤操作:

  • 确定您希望从神对象中提取的小责任
  • 为此职责设计新界面:
    • 开始为实现此新接口的新类编写单元测试。使测试通过新对象中包含的god-object实例传递,然后转发调用
  • 有一组单元测试,你可以从神对象中删除代码片段到新对象

下一步是在新职责的上下文中用新界面替换god-object类的所有用法,然后重新执行。

如果你有一些 state 需要由这些职责使用/处理(比如你的例子中的World实例),那么你必须让它共享。例如,您可以将其转换为shared_ptr,因此可以将其保留在重构过程的上帝对象中,并在新类中使用它。