【问题标题】:Converting singleton classes to a type of context将单例类转换为一种上下文
【发布时间】:2011-03-07 02:04:23
【问题描述】:

一段时间以来,我一直在摸索如何删除我一开始愚蠢地添加的单例的最佳方法。作为背景,这个应用程序是一个股票投资组合跟踪器。我目前有三个班级,我认为这是唯一的例子:

  1. 价格(一个类包含一个列表 历史价格、股息、 分裂)
  2. 投资组合(一个类管理 一组投资组合对象,其中一些 有用的包装函数)
  3. 查询(一个 读取和写入的类 数据库)

为了满足用户的要求,我添加了从多个数据库打开和保存的功能。每个数据库(查询类)理论上都会被传递到投资组合和价格的构造函数中以加载数据。

我面临的问题是所有 3 个类都是相互关联的。如果我打开 C:\database1.sqlite,我应该无法混合和匹配 C:\database2.sqlite 中的价格和投资组合。此外,任何编辑都必须保存到适当的数据库中。

我最初的想法是创建一个由这些类组成的上下文对象并传递它。但是,阅读Can you explain the Context design pattern?,我认为这不是正确的解决方案。

如何删除单例,但仍保持对象之间的完整性?谢谢。

【问题讨论】:

  • 如果您的查询层与您的价格或投资组合类有任何连接,则您的设计存在严重错误。我知道可能为时已晚,但无论使用单例模式如何,您的设计似乎都有一个非常根本的缺陷。
  • 无论这个“上下文模式”认为是什么,您引用的问题的链接都已失效,并且该模式还不够流行,无法出现在谷歌搜索中。一旦你解决了奇怪的相互依赖关系,只需在高层次上实例化对象,并将引用传递给需要它们的任何对象。
  • Serapth,查询层不知道价格或投资组合类,但价格和投资组合类使用它来加载并保存到数据库。

标签: c++ qt


【解决方案1】:

我会考虑从“复数”到“单数”你会做出哪些改变。如果您的对象是一个事物而不是一些事物,那么推理您的系统会容易得多。

例如

class Price;
class Portfolio;
class Query;

如有必要,您可以随时添加:

typedef std::vector<Price> Prices;
typedef std::vector<Portfolio> Portfolios;
typedef std::vector<Query> Queries;

但我的拙见是,您可能应该在这些事物的单个实例之间计算出您想要的交互,然后在您有一对多关联时进行您想要的交互(即这些类​​的一个实例可以引用另一个的多个实例?),然后明确定义。

基本上,努力使交互的推理变得简单。您可能有多个价格和投资组合,但很难记住适用于一个实例的操作与适用于多个实例的操作,因此请区分这些差异并让一个实例简单明了。

【讨论】:

    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 2012-01-01
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多