我应该如何重构我的代码以删除不必要的单身?

e.J*_*mes 20 language-agnostic singleton refactoring

当我第一次看到反单身评论时,我很困惑.我在最近的一些项目中使用了单例模式,并且它运行得很漂亮.事实上,我已经使用了很多次.

现在,在遇到一些问题之后,阅读这个问题,尤其是这篇博文,我理解了我带给世界的邪恶.

那么:我如何从现有代码中删除单例?

例如:
在零售店管理程序中,我使用了MVC模式.我的Model对象描述了商店,用户界面是View,我有一组控制器,它们充当两者之间的联络.大.除了我将Store变成一个单独的(因为应用程序一次只管理一个商店),我还把我的大部分Controller类变成了单例(一个mainWindow,一个menuBar,一个productEditor ......).现在,我的大多数Controller类都可以像这样访问其他单例:

Store managedStore = Store::getInstance();
managedStore.doSomething();
managedStore.doSomethingElse();
//etc.
Run Code Online (Sandbox Code Playgroud)

我应该改为:

  1. 创建每个对象的一个​​实例,并将引用传递给需要访问它们的每个对象?
  2. 使用全局?
  3. 别的什么?

Globals仍然很糟糕,但至少他们不会假装.

我看到#1迅速导致可怕的膨胀构造函数调用:

someVar = SomeControllerClass(managedStore, menuBar, editor, sasquatch, ...)
Run Code Online (Sandbox Code Playgroud)

还有其他人经历过这个吗?如果不是全局变量或单个变量,那么为多个单独的类访问公共变量的OO方法是什么?

mat*_*t b 19

依赖注入是你的朋友.

优秀的Google测试博客上查看这些帖子:

希望有人为C++世界制作了一个DI框架/容器?看起来谷歌发布了一个C++测试框架和一个C++模拟框架,可能会帮助你.