OpenGL 随想(二):声明式与 MVC

上篇的结尾提到了声明式 DSL 和 OpenGL 的汇编风格的差别和联系。其实我当时还联想到 model-view-controller 模式,这次另起一篇。

能有这样的联想是因为引入 OpenGL 的产品几乎都是 MVC 架构,而且代码中 OpenGL 相关的部分几乎完全被限制在 view 模块中。具体点说,在基于 Cocoa 的代码中,OpenGL 的使用几乎完全被限制在 NSView 子类的 drawRect: 消息中。在 Win32 程序中几乎完全被限制在 WM_PAINT 的处理函数中。也就是说,复杂的 MVC 架构的应用是用汇编风格来写 view 。另一方面,可以把 model 看成是 view 的声明式描述。

所以可以这样来解释 MVC 模式:每个 model 模块的定义都是一个针对当前应用定制的声明式 DSL ,每个 view 模块都是这个 DSL 的(可视化)解释器。OpenGL 的风格正好符合高效解释器通常需要汇编语言来编写这个惯例。在一个设计良好的 MVC 应用中,不仅是模块功能的分离,而且隐含了两种编程范式(paradigm)—— 声明式和命令式。

如果有一天真的出现了声明式的 3D 引擎又会如何呢?比如 Java 3D 当年就尝试过类似声明式的概念。我想也许到那时 view 模块会成为 MVC 模式中对底层引擎很薄的一层封装(而今天 MVC 中 controller 是最简单的一层)。又或许我们的应用永远需要一个比通用的声明式语言更定制化的 DSL ,而 view 就成为这两种声明式 DSL 的翻译器。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

您正在使用您的 WordPress.com 账号评论。 注销 /  更改 )

Twitter picture

您正在使用您的 Twitter 账号评论。 注销 /  更改 )

Facebook photo

您正在使用您的 Facebook 账号评论。 注销 /  更改 )

Connecting to %s


%d 博主赞过: