gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:10:10 25 4
gpt4 key购买 nike

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

现在,在遇到一些问题后,阅读 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com