用于IO操作的C++设计模式



我想开发一个需要从外部数据源(数据库/文件/…(检索数据的应用程序,但我找不到一个好的模式。

假设我在数据库中有以下结构:

  • VariableTypeTable:id+一些东西
  • VariableTable:id+一些东西+对VariableTypeTable的引用

我可能想要3个类:

封装VariableType内容的VariableType
  • Variable相同
  • VariableManager来管理我的对象生存期+和一些业务操作(搜索等(
  • 是否有加载数据的通用模式?我应该在哪里以及如何处理IO操作?

    一些想法:

    • VariableVariableType不应该知道(或者至少做(任何关于IO的事情
    • 也许VariableManager可以提供一些IO操作,但我会将业务逻辑和IO放在同一个位置(破坏SRP?(
    • 如果我拆分管理器和IO操作,我如何保持同步?例如,创建一个新变量应该将该变量添加到数据库中,并使管理器保持更新
    • VariableManager中注入一些接口VariableManagerIO来处理IO,并且只操作管理器。我应该如何报告IO错误

    编辑:

    我给出的例子过于简化了,但我的主要问题超出了反射/持久性。

    我也将这个问题延伸一点。如果某个业务函数需要查询数据,因为它更简单(例如使用复杂的SQL请求(,该怎么办。

    听起来您正在寻找某种风格的数据库持久对象。如果你搜索c++ database persistence,你会得到一些点击。我对那些图书馆都不熟悉。

    这是一个比看上去更复杂的问题。多年来,出现了无数的持久对象系统。我用了大约十几个(可能有几百个(。他们都以这样或那样的方式失败了,但你通常可以用他们中的任何一个来完成任务。

    我自己滚。我可以在睡眠中编写PSQL对象处理,而且我通常会编写建模工具和代码生成器。我保持简单。

    对象本身并不知道它们正在被持久化。他们不知道它们可能存储在数据库中。我使用一组平行的类来阅读和写作它们。然而,他们可能知道如何使用我正在使用的任何JSON库,因此从平面JSON文件中保存/加载变得微不足道。非常非常容易编码。

    我在我的宠物项目中使用的一个版本是:

    https://github.com/jplflyer/Persist

    取决于:

    https://github.com/jplflyer/ShowLib

    这对于我做事的方式来说是非常具体的,并且假设是PostgreSQL。


    对于管理更新,我的工具不会为您做这件事。你必须知道你已经做出了改变,并自己坚持下去。这就是所有各种持久化对象库变得混乱的地方。有些人做得比其他人好。

    我更喜欢";POJO"——这实际上是一个Java术语。普通的旧Java对象。在这种情况下,是普通的老C++对象。一旦你开始教你的对象它们生活在数据库中,它们就会变得非常混乱。因为我可以控制更新的方式,所以我也可以在更新的同时向持久化引擎添加一个调用。

    但如果你需要自动化,也许我在第1段中建议的谷歌页面中的一个链接会对你有所帮助。

    最新更新