完全与视图层无关的应用程序体系结构

Application architecture that is COMPLETELY view layer agnostic

本文关键字:应用 程序体系结构 图层 视图      更新时间:2023-10-16

我想编写一个C++应用程序框架,该框架将完全与视图无关。理想情况下,我希望能够使用以下任一项作为"前端"

  1. Qt
  2. Web前端

我知道网络工具包(wt)等的发展,但我想避免这些,因为至少有以下一个原因:

  1. 他们使用cgi/fastcgi方法(当使用Apache时)

  2. AFAIK,他们给你强加了一个"前端"框架——例如,我不能使用CakePHP、Symfony、Django等来创建网页,并且在页面中只有绑定到服务器端C++应用程序的"小部件"。我希望可以自由使用我想要的任何web框架,这样我就可以从许多流行和成熟的模板框架中受益(例如Smarty等)。

我认为MVC模式的一些变体(不确定哪种变体)在这种情况下可以很好地工作。

我打算这样做:

  • 模型和控制器层用C语言实现++
  • 一个插件位于控制器和视图之间
  • 该视图使用QT或第三方web框架实现
  • 视图(前端)和插件之间的通信使用以下任一方法完成:

    i。QT前端的事件

    ii。用于web前端的AJAX/PUSH机制(也许backbone.js可以在这里使用?)

我上面描述的模式有名字吗?(在我开始编码之前),我应该注意什么(如果有的话)问题(除了网络延迟)?

听起来,它是一个MVC,插件实现了控制器和视图之间的桥梁。我找不到MVC的一个变体,它专门有一个桥梁作为设计的参与者;然而,它们都不排除桥接或其他模式协作或实现MVC。

实现这一点的困难可能来自于桥接抽象。可能很难:

  • 防止实现细节影响抽象。例如,如果实现A的错误代码只对实现A有意义,而实现B的错误代码相似但发生在不同的条件下,那么错误将如何在不失去太多意义的情况下通过抽象
  • 考虑实现之间的行为差异。这通常需要对被抽象的实现有一个坚实的理解,以便能够满足抽象的先决条件和后决条件。例如,如果实现A支持异步读取,而实现B只支持同步读取,那么需要在抽象层中做一些工作来考虑线程
  • 在去耦和性能之间找到一个可接受的折衷方案。这将是一种平衡行为。一如既往,尽量避免过早进行优化。通常情况下,为了性能考虑引入一点耦合比解耦高性能代码更容易

此外,考虑利用其他模式来帮助解耦。例如,如果具体类型Foo需要通过抽象层,并且实现A将其转换为Foo_A,而实现将其转换成Foo_B,那么考虑让插件提供抽象工厂。Foo将成为Foo_AFoo_B的抽象基类,插件将提供一个工厂来创建实现Foo的对象,从而允许控制器分配插件所期望的确切类型。