知识卡片
GUI与Web只是实现细节,靠用例的完整输入输出数据结构实现设备无关抽象
内容
两个真实案例说明[[无尽的钟摆Web只是计算资源集中分散振荡史的一瞬]]带来的现实风险。Q公司做了一款好用的桌面版个人财务软件,Web热潮来袭后,市场部决定把GUI改成浏览器风格——用户普遍反感,之后几个版本又逐渐把浏览器风格的设计撤了回去,最终恢复成正常桌面UI。A公司是智能手机厂商,最近一次”操作系统”升级大幅改动了各应用外观,作者猜测这背后同样是市场部门的决策,只希望A公司的架构师和应用开发者已经把UI和业务逻辑分离,因为市场推广人员绝不会放过任何一丝耦合的可乘之机。这两个故事归结成一句话:GUI只是一个实现细节,Web是GUI的一种,所以同样是实现细节——软件架构师的职责是把这类细节和核心业务逻辑隔离开。可以把Web理解成一种I/O设备,从60年代起编写设备无关应用程序就很重要,这份重要性至今没变,Web也不例外。有人可能会反驳:Web这样的GUI太特殊、太强大了(复杂的JavaScript数据校验、可拖拽的Ajax调用、无数轻松引入的设计组件),追求设备无关性未必现实——这话在”UI与应用之间频繁交互的具体方式”这个层面确实成立,浏览器与Web应用的交互模式和桌面客户端/服务器的交互模式差异很大,想让浏览器像UNIX里的I/O设备那样被抽象成统一的界面交互模型几乎不可能。但可以换一条边界来抽象:业务逻辑本质上是一组用例的集合,每个用例都能用输入数据、处理过程、输出数据这个流程描述——在UI和应用程序之间的某一点上,输入数据被认为达到完整状态时,用例才被允许进入执行阶段,执行完毕后生成的输出数据再传回UI。只要把完整的输入数据和输出数据标准化成数据结构、提供给执行用例的进程,用例就能以设备无关的方式操作I/O设备——这种抽象化处理并不容易,往往要几个来回才能找到正确方向,但完全可行;而只要市场”大神”们永远不会绝迹,这件事就永远有做的必要。