完全查看图层不可知的应用程序体系结构

时间:2012-07-11 16:03:25

标签: c++ qt architecture backbone.js web-frameworks

我想编写一个C ++应用程序框架,它将完全视图不可知。理想情况下,我希望能够使用以下任何一种作为"前端"

  1. Qt的
  2. 网络前端
  3. 我知道像web toolkit(wt)等的开发,但我想避免这些,因为至少有下列原因之一:

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

    2. AFAIK,他们强加了一个"前端"你的框架 - 例如,我不能使用CakePHP,Symfony,Django等来创建网页,只有#34;小部件"在页面绑定到服务器端C ++应用程序。我希望可以自由使用我想要的任何网络框架,因此我可以从许多流行的和已建立的模板框架中受益(例如Smarty等)。

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

      这是我打算继续下去的方式:

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

        我。 QT前端的事件

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

      我上面描述的模式是否有名称 - 并且(在我开始编码之前),我应该注意哪些(如果有的话)存在任何问题/性能问题(网络延迟除外)?

1 个答案:

答案 0 :(得分:1)

从它的声音来看,它是一个MVC,插件在控制器和视图之间实现Bridge。我无法找到一个MVC的变体,它特别有一个桥梁作为设计的参与者;但是,它们都没有排除协作或实现MVC的桥梁或其他模式。

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

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

另外,考虑利用其他模式来帮助解耦。例如,如果需要通过抽象层传递具体类型Foo,并且实现A将其转换为Foo_A,而实现将其转换为Foo_B,然后考虑让插件提供Abstract FactoryFoo将成为Foo_AFoo_B的抽象基类,插件将提供工厂来创建实现Foo的对象,允许控制器分配确切的类型该插件期待。