【问题标题】:Design issue in wrapping "C" API into OO wrapper将“C”API 包装到 OO 包装器中的设计问题
【发布时间】:2015-11-26 23:46:59
【问题描述】:

我正在尝试构建一个面向对象的包装器,它将包装 API 规范;这包括许多结构、事件和 API。 该 API 规范每年都会进行修订,并发布新规范;更新可能具有更新的结构、事件和 API。更新还将包括 对现有结构、事件和 API 的更新,API 本身不会改变,但它们将各种结构作为参数,最终会有更新

挑战

  1. API 规范不过是下层的 SDK, 我正在尝试构建的也是一个 SDK,但将是一个对象 定向包装此 SDK。
  2. 要求是用户 需要对象和方法,而不需要像“C”这样的结构和 API
  3. 频繁的版本变化应该不会对高层产生任何影响 应用程序,并且应该与任何底层 API 无缝协作 版本
  4. 较旧的应用程序应该可以在较新的 API 上运行
  5. 较新的应用程序应该在较旧的 API 上运行

最后一个比较棘手,我的意思是新应用程序在看到旧版本的 SDK 时应该以某种方式将自己转换为旧版本的 API

是否有任何设计模式可以帮助我完成这项任务,并与内部数据的频繁更改联系起来,同时实现向后兼容和向前兼容?

操作系统:Windows 开发环境:Visual C++

【问题讨论】:

    标签: oop design-patterns architecture


    【解决方案1】:

    您的问题太高了,无法通过设计模式来回答。 您要求的是架构原则。

    这些您应该基于您有充分根据的设计决策(“API 使用版本控制向后兼容,因为...”)这反过来又基于您的要求(例如“旧应用程序应该在新的 API 上工作”)。

    看看这个(Joshua Bloch 关于 API 设计的演讲主题演讲):

    How to Design a Good API and Why it Matters

    【讨论】:

      【解决方案2】:

      1) 目前想到的一切,如果 sdk API 涉及手动资源分配:

      RAII,或ctor,dtor 资源管理:https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization

      2-5) 确定您正在构建的 API 的函数分解,它可以根据 SDK API 的每个版本层来表达。半正式函数分解的一些细节在这里(朝向底部):

      http://jfeltz.com/posts/2015-08-30-cost-decreasing-software-architecture.html

      然后,您可以获取生成的函数组合,并在必要时使它们成为可构造的对象。在您对所涉及的函数组合有一定的了解之前,不要担心最终的对象模型。一开始这很难,但相信我,它比迭代几种可能的对象模型设计要强大得多。

      对于 C++,您可能需要针对每个上游 SDK API 的版本方案执行 #define 预处理,除非您的 sdk 将其版本编码到某个文件中,这样您就可以进行 dll 加载(在这种情况下,这可能是工厂设计模式),但我怀疑你已经知道了。

      【讨论】:

      • 你的文章太复杂了,我无法理解..感谢您对此进行调查
      • 函数的复杂之处是什么?你每天都使用它们:)。如果您对这篇文章有任何具体问题,请告诉我,我很乐意为您解答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 2011-01-28
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多