2

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

起初我的服务器设计,我决定做World, 和const容器对象作为单例。

但是我的服务器是多线程的,单例没有好的解决方案。

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

例如:

class Core
{
...
private:
World world;
CExpTable exptable;
...
};

Core在新连接上为Session类提供对对象的引用。

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

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

4

1 回答 1

3

首先,你可以阅读很多关于为什么单例不好的帖子,例如this。关于为什么这种模式在大多数情况下并不是真正有用的原因,还有很多有效的观点。

至于你的重构:最好的方法是一步一步来。大革命通常会产生错误。根据我的经验,拆解一个神物并不难。

您可以进行如下操作:

  • 确定一个你想从上帝对象中提取的小责任
  • 为此职责设计一个新界面:
    • 开始为实现这个新接口的新类编写单元测试。通过包含在新对象中的上帝对象的实例进行测试,然后转发调用
  • 拥有一组单元测试,您可以将上帝对象中的代码片段剪切到新对象中

下一步是在新职责的上下文中用新接口替换所有使用的神对象类,然后再做一次。

如果您有一些需要由这些职责使用/处理的状态World(例如您示例中的实例),那么您必须将其共享。您可以将其转换shared_ptr为例如,因此可以将其留在神对象中以进行重构,也可以在新类中使用它。

于 2014-01-13T17:03:52.217 回答