前言

近期重读 An introdution to Morphic, 本文翻译自其中的部分章节。

Morphic 介绍

Morphic 是一个用户界面框架,它使构建生动的(lively)交互式用户界面变得简单而有趣。Morphic 处理了大部分显示更新、事件调度、拖放、动画和自动布局的繁琐工作,从而将编程者解放出来,专注于设计而不是机制。有些用户界面框架需要大量的模板代码来完成简单的事情, 而在 Morphic 中,少量的代码就能发挥很大的作用,几乎不浪费任何努力。

译文

morphic 的第一个版本是由 John Maloney 和 Randy Smith 在 Sun Microsystems Laboratories 里开发的,作为 Self 4.0 系统的用户界面构建环境。 Self 是一种基于原型的语言,类似于 Smalltalk,但没有类和赋值。 Randy 之前在 Alternate Reality Kit 项目上的工作, 以及他对具体性和统一性的热情对 morphic 的设计做出了巨大贡献。 至于 Squeak,morphic 在 Smalltalk 中从头开始重写。 虽然细节有所不同,但 Squeak 版本保留了原始 morphic 的精神和感觉,它需要感谢 Self。

Morphic vs MVC

morphic 与传统的 Smalltalk 模型-视图-控制器 (MVC) 框架有何不同? 一个区别是 morph 通过处理用户输入和显示来结合控制器和视图这两个角色(roles)。 这种设计源于一种简化的愿望,并且观察到大多数视图和控制器类是如此相互依赖,以至于它们必须作为不可分割的一对来使用。

模型呢? 许多 morph 是不需要模型的独立图形对象,有些 morph 是它们自己的模型。 例如, StringMorph 拥有自己的字符串,而不是引用一个可能共享的 StringHolder 模型。 然而,morphic 还支持 MVC 在同一模型上拥有多个视图的能力,使用更新机制通知所有视图模型的更改。 morphic 浏览器和其他编程工具与它们的模型的接口与它们的 MVC 对应物完全相同。

morphic 的活性(liveness)目标也不同于 MVC。 在 MVC 中,在任何给定时间只有一个顶层视图(即窗口)处于控制之中。 只有该视图可以在显示器上绘制,并且只能在自己的边界内绘制。 如果它显示这些边界之外的任何内容,例如弹出菜单或滚动条,则它必须保存并恢复弹出对象下方的显示像素。 这种显示管理设计比 morphic 的增量重新显示机制更有效,因为当最前面的窗口保持控制时,最前面的窗口后面的任何东西都不会被重绘。 对于开发 MVC 的相对较慢的机器来说,这是一个极好的选择。 然而,MVC 设计很难支持活性,因为没有简单的方法让多个实时视图在不相互绘制的情况下交错其屏幕更新。 相比之下,Morphic 的损坏报告和增量屏幕更新的集中化让 liveness 变得容易。

Morphic 的具体性也背离了 MVC。 在 MVC 中,移动窗口或调整窗口大小的反馈以空心矩形的形式提供,而不是实心对象。 同样,这更高效, 当反馈矩形被拖动时,只有几个屏幕像素被更新, 并且不需要运行视图显示代码, 对于速度较慢的机器来说是正确的选择。morphic 也支持仅轮廓窗口拖动来调整大小作为慢速机器的一个选项。

Morphic 的未来

Morphic 的未来是什么? Squeak 系统发展如此之快,以至于任何关于其未来的预测在发布时都可能成为旧闻。 尽管如此,还是有几个方向值得一提。

首先,morphic 急需对旋转和缩放的处理进行彻底改革, 这些功能在初始设计和实现完成后很长时间才重新安装到其中。 拥有一个统一的全局坐标系的最初设计决定可能需要被逆转; 然后每个 morph 都会为其 submorphs 提供坐标系,并带有可选的旋转和缩放。

Morphic 非常擅长直接操作图形对象,因此使用 morphic 本身通过拖放组件来组装 ScorePlayerMorph 等工具似乎很自然。 事实上,这已经可以做到,尽管目前的工具相当粗糙。 真正的问题是如何处理构建后的 morph 。 它存储在哪里? 如何实例化? 以及它的更新和改进如何在 image 内和更大的用户社区传播? 这些问题都不算棘手,但它们都需要作为通过 直接操作实现 morph 构造 的一部分来解决。

morphic 的 Self 版本支持多个用户在一个叫做 “Kansas” 的大而平坦的空间中一起工作。 从一开始,就计划将此功能添加到 Squeak morphic,但除了一项名为 “telemorphic” 的早期实验外,并没有做太多工作。 然而,最近人们对这个领域的兴趣又回来了,而且很快就可以让多个用户在互联网上共享一个 morphic world。

正在努力支持 3-D 硬件加速,并允许 MPEG 电影播放器等外部软件包显示为 morph。 这些目标要求 morphic 与其他代理共享屏幕。 随着 3-D 性能的提高,morphic 可能会完全整合 3-D 和 2-D 世界。 今天的 2-D 变形可能只是 3-D 环境中一些平坦的特例,而不是在 2-D morph 中显示 3-D 世界。