c++ - 将一个模块的所有代码放在一个接口(interface)后面。好主意与否?

标签 c++ architecture

我有几个模块(主要是 C)需要重新设计(使用 C++)。目前主要存在的问题是:

  • 应用程序的许多部分都依赖于模块的功能
  • 应用程序的某些部分可能想要否决模块的行为

我在考虑以下方法:

  • 重新设计模块,使其具有清晰的现代类结构(使用接口(interface)、继承、STL 容器……)
  • 编写可用于访问模块的任何功能的全局模块接口(interface)类
  • 编写此接口(interface)的实现,将接口(interface)方法简单地映射到接口(interface)中正确类的正确方法

当前直接使用该模块的 C 函数的应用程序中的其他模块,应通过此接口(interface)的[实现]。这样一来,如果应用程序想要更改模块某个功能的行为,它只需继承此默认实现并否决它想要的任何功能。

一个例子:

  • 假设我完全重新设计了我的模块,这样我就有了像这样的类:Book、Page、Cover、Author……所有这些类都有很多不同的方法。
  • 我制作了一个名为 ILibraryAccessor 的全局接口(interface),其中包含许多纯虚拟方法
  • 我做了一个默认实现,称为 DefaultLibraryAccessor,而不是简单地将所有方法转发到正确类的正确方法,例如
    • DefaultLibraryAccessor::printBook(book) 调用 book->print()
    • DefaultLibraryAccessor::getPage(book,10) 调用 book->getPage(10)
    • DefaultLibraryAccessor::printPage(page) 调用 page->print()
  • 假设我的应用程序有 3 种窗口
    • 第一个允许所有功能,作为一个应用程序我想允许它
    • 第二个也允许所有功能(内部),但我想从应用程序中防止打印单独的页面
    • 第三个也允许所有功能(内部),但我想从应用程序中阻止打印某些类型的书籍
  • 构建窗口时,应用程序将 ILibraryAccessor 的实现传递给窗口
    • 第一个窗口将获得 DefaultLibraryAccessor,允许一切
    • 我将向第二个窗口传递一个特殊的 MyLibraryAccessor,在 MyLibraryAccessor 中,我将否决 printPage 方法并让它失败
    • 我将向第三个窗口传递一个特殊的 AnotherLibraryAccessor,在 AnotherLibraryAccessor 中,我将否决 printBook 方法并在我调用 book->print() 之前检查图书的类型。

这种方法的优点是,如示例所示,应用程序可以否决它想要否决的任何方法。缺点是我得到了一个相当大的接口(interface),并且对于所有想要访问这个其他模块的模块来说,类结构完全丢失了。

好不好?

最佳答案

您可以用嵌套接口(interface)表示类结构。例如。而不是 DefaultLibraryAccessor::printBook(book),有 DefaultLibraryAccessor::Book::print(book)。否则它对我来说看起来是个不错的设计。

关于c++ - 将一个模块的所有代码放在一个接口(interface)后面。好主意与否?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4397866/

相关文章:

c++ - 转发声明使用 enable_if : ambiguous call 的函数

c++ - boost进程间是否支持在进程之间共享包含指针的对象?

php - 如何确定我的操作系统是 32 位还是 64 位?

php - 多站点系统的数据库结构 - 数据库和 PHP

c++ - 如何打印带有空格作为千​​位分隔符的数字?

c++ - 变量 'sortArray'周围的堆栈已损坏

iphone - 我们如何处理没有armv7s切片的第三个库

architecture - "dapper-dot-net"中的交易

c++ - 计算类型范围

tomcat - 如何确定 Tomcat 在窗口服务器上是 32 位还是 64 位?