【问题标题】:Is it acceptable to provide a C++ Singleton class library but provide the instance() method outside of the library提供 C++ Singleton 类库但在库外提供 instance() 方法是否可以接受
【发布时间】:2019-02-12 10:33:22
【问题描述】:

我有一个名为 SingletonDemo 的类库,但我选择在库之外提供静态访问方法 SingletonDemo::GetInstance(),所以当我为生产构建代码时,我想要一个版本的 Getinstance(),当我为单元测试构建时,我想要另一个版本。

【问题讨论】:

  • 为什么不为此使用条件编译(即#ifdef)?
  • 为了测试目的而大量修改代码,会带来测试与生产不同的东西的风险。
  • 您为什么想要两个不同版本的Getinstance?它们之间可能有什么区别?通常,getter 函数是微不足道的。您不会有任何机会实现某种 meyers 单例吗?
  • 这是一个迈耶斯单身人士。是的!

标签: c++ static singleton


【解决方案1】:

您不会为此使用预编译器指令吗? 似乎更易于维护和可读...

#ifdef unit_test
    //unit test implementation
#else
    // normal implementation...
#endif

这样您就可以在实现之间自动切换。

但您可能会考虑不这样做...您会遇到将行为从测试代码转移到发布。

【讨论】:

  • 可以想象我正在测试很多软件,而对于单元测试,我正在创建一个 SingletonDemo 实例,该实例与单元测试中的实例有很大不同。可以将 SingletonDemo 的实例想象为一个模拟。所以也许我可能将 SingletonDemo 作为一个抽象类,ProductionDemo 和 UnitTestDemo 都是从 Singleton Demo 派生的。我正在寻找我的 SingletonDemo 是否位于库中但我的 SingletonDemo::GetInstance() 在库外的实现是否可以接受的答案。
  • 任何特定实现的条件包含被移到构建时间而不是编译时间的领域,这避免了代码中的#ifdef。这有助于解耦代码。
  • 从学术角度来说是,拆分的实现不是很实用。我想到一个想法,是从库类派生并简单地覆盖函数......也许这会有所帮助,或者我只是不明白这个问题。
  • 为此目的有工厂设计模式。 link to wikipedia
  • @Cactus 我喜欢你的方法 =)
猜你喜欢
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 2023-03-22
相关资源
最近更新 更多