language-agnostic - 我应该如何重构我的代码以删除不必要的单例?

标签 language-agnostic refactoring singleton

当我第一次开始看到反单例的评论时,我很困惑。我在最近的一些项目中使用了单例模式,并且效果很好。这么多,事实上,我已经用过很多次了。

现在,在遇到一些问题后,阅读 this SO问题,尤其是this博客文章,我了解我给这个世界带来的邪恶。

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

例如:
在零售店管理程序中,我使用了 MVC 模式。我的模型对象描述了商店,用户界面是 View ,我有一组 Controller 作为两者之间的联系。伟大的。除了我把 Store 变成了一个单例(因为应用程序一次只管理一个商店),我还把我的大部分 Controller 类变成了单例(一个 mainWindow、一个 menuBar、一个 productEditor...)。现在,我的大部分 Controller 类都可以像这样访问其他单例:

Store managedStore = Store::getInstance();
managedStore.doSomething();
managedStore.doSomethingElse();
//etc.

我应该改为:
  • 为每个对象创建一个实例并将引用传递给需要访问它们的每个对象?
  • 使用全局变量?
  • 还有什么?

  • 全局变量仍然很糟糕,但至少它们不会是 pretending .

    我看到#1 很快导致了可怕的构造函数调用:
    someVar = SomeControllerClass(managedStore, menuBar, editor, sasquatch, ...)
    

    还有其他人经历过吗?让许多单独的类访问公共(public)变量而不是全局或单例的 OO 方法是什么?

    最佳答案

    Dependency Injection是你的 friend 。

    查看 excellent Google Testing Blog 上的这些帖子:

  • Singletons are pathologic liars (但如果你问这个问题,你可能已经明白了)
  • A talk on Dependency Injection
  • Guide to Writing Testable Code

  • 希望有人为 C++ 世界制作了一个 DI 框架/容器?看起来谷歌已经发布了 C++ Testing FrameworkC++ Mocking Framework ,这可能会帮助你。

    关于language-agnostic - 我应该如何重构我的代码以删除不必要的单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/474613/

    相关文章:

    algorithm - 加权图中的最小惩罚路径

    algorithm - 生成彼此相邻的数字组

    c# - 应该如何从两个几乎相同的 Controller Action 转移到一个处理两个必要任务的 Action ?

    ruby-on-rails - 在 Rails 中重构 View 逻辑

    c# - 正确使用共享静态 'Random' 单例实例?

    php - 我应该在 switch 语句中使用 continue 吗?

    design-patterns - 是否有任何理由为非常基本的数据对象提供接口(interface)?

    ruby-on-rails - 重构方法不接受属性

    singleton - 对象的类型别名和val之间的区别

    php - 在 PHP 中访问单例方法