详解引擎技术之约定式编程的实现理念

jopen 8年前
 

在前端世界里,我们经常会听说某某引擎,某某框架,那么到底什么样子的东西可以称之为引擎呢?如果我们自己希望编写引擎应该如何做呢?在编写引擎的时候,我们至少需要注意哪些方面呢?引擎技术到底能给我们带来什么呢?

本文皆旨在平时的学习交流中遇见很多值得讨论的问题,抽取部分有价值的观点,和大家一起谈论学习。

作者简介

曲毅,51 CTO WOT峰会特邀嘉宾,曾为第七届WOT移动互联网开发者大会的特约讲师。从事互联网研发工作11年。曾在高阳,空中网,乐蜂网等互联网公司担任构架师,高 级技术经理,技术总监等职位。近4年专注移动互联网,是国内资深HTML 5专家和研究者,对HTML 5技术有非常深刻的认识和理解,有着丰富的实践经验,是HTML 5引擎Crow 5的创造者。多次受邀在中关村在线,iweb峰会和GITC全球互联网大会上担任嘉宾和专家。

详解引擎技术之约定式编程的实现理念

七乐康高级技术总监

一、到底什么是引擎?什么是轻量级框架?什么是重量级框架?

其实引擎并没有我们想的那么神奇,可以理解成封装的更方便用的框架。引擎技术其实也是框架技术。两者没有本质上的区别。前端我们适用的框架,大家 熟知的有jquery,zepto,sea,Kissy等都是优秀的框架。这些框架使用简单,轻量,学习门槛很低。这些都是优点。这些框架就像小积木一 样,每一种框架都有自己的特点,针对具体的使用场景,解决开发中遇见的痛点问题。例如jquery封装了大量的Javascript的方法,解放工程师的 重复编码,浏览器兼容,动画特效处理。但是我们在做移动方面的项目的时候会发现Jquery这样的库,不太实用,很显然Jquery解决了很多PC浏览器 兼容方便的事情,相对移动设备来说体积太大,很多兼容问题不复存在。那么就出现了zepto框架。zepto定位就是移动设备,这样它的体积就小了很多。 在例如我们处理javascript模块加载问题的时候可以使用Sea.js。sea是一个遵循CommonJS规范的javascript模块加载框 架,可以实现javascript的模块开发及加载框架。

每一种框架都有自给的一种设计理念和针对痛点给出的解决方法。尽可能的用少的代码量,去解决更多的问题,同时给出一个方便使用的API。这些都是 轻量级框架的优点。但是这样对于我们开发工程师来说,就面临一个问题。我们在做一个项目的时候,会遇见很多很多问题,除了要模块开发,还要动态加载,还要 有模版技术,还有动画处理。还有缓存处理,如果做的功能复杂点,还需要调用地理位置,重力感应。需要许许多多的的小框架。如果不使用库,自己去写那么就要 万丈高楼从地起,一个一个的坑自己填。使用库就像玩卡牌游戏一样各种拼凑才能搞定。那么有没有一个什么好的框架能一下搞定我们所有呢?

这个世界就是很奇妙,只要你有需要,就会有人解决你的需求。答案是有的,在前端的世界,在开源的世界里,想要什么都有现成的东西。说的优点绝对 了,但是我们从来不缺少工具。那么就出现了很多重量级框架,例如YUI,EXT,Anglar.js,Bootstrap等等。这些都属于重量级框架,使 用他们的好处是,大一统车同轨,书同文,统一度量衡。除了你要加载他们的核心库以外,你想要什么,这些重量级框架还给你提供了很多很多插件,让你用的爽歪 歪。但是问题来了,首先这么重的东西,我们真的能用多少功能?而且重量级框架都有一个通病就是绑架了码农,码农的思维被束缚住了。只能按照他们的方式去编 写代码。需要什么功能就是机械的去找插件,没有完全匹配的就得扩展插件,一个不小心一个小问题搞半天。运气再差点,出现个什么坑,还很难解决。很多灵活性 就这样的被吞噬了,现在我们都知道,开发速度意味着什么。还有就是重量级框架的学习无疑像学了一门语言一样,对于团队的学习成本也是很高的。出于种种原 因,重量框架在实际中使用情况并不是特别的多。反正还是拼拼凑凑,不好用了自己换换来的实际。程序员宁愿自己拼凑,也不太想弄个套餐。所以才有了包括 YUI这样的重量级框架已经不在更新的事情。

时代和观念一直在改变和修正,重量级框架有太多的优点但是不能真正的占据绝对份额,除了使用也还受限网络等诸多原因。

简言之,重量级框架集成了很多轻量级框架的特点,提供了统一的编码规则。集成了很多小框架,避免了拼凑。但是它失去了灵活,绑架了开发,阻碍了扩展。增加了学习成本。

那么引擎到底是什么呢?首先引擎是框架。然后引擎要具备轻量级的优点小,快,是个插件,是个模式。还要具备重量级框架的思想,可以给出统一的方法论,避免拼凑。同时引擎不应该像重量级框架一样去绑架开发,应该可以提供灵活的方式去让开发人员去使用。

二、引擎技术是怎么诞生的?

引擎技术要发扬轻量级框架的优势。插件开发而且是不侵入式开发,是面向切面的,在愿意使用的时候使用,不愿意的时候也能较为方便的抽离,引擎要继续向重量级框架学习统一的思想,能给出完整的解决方案去尽可能的解决问题。

我们在编码的时候,最常用的一个思想就是封装,这也是框架和引擎技术的重要思想。我们把操作类的,动画类的,渲染类的,业务类的都封装完,然后看 看是否还能再抽取一些更小的粒度,最后把这些封装成一个一个类库,最后按照一个良好的目录和命名规则存放。方便引用,然后再给出一个合适的加载和调度的方 式,去组合代码。程序员在开放的时候,会不断的扩充各种粒度库。以后的开发就有点像搭积木了。那么,一个简单的适用于我们项目的小框架就已经有了雏形。

但是有这些远远不够,因为还至少缺失一个重要的东西,就是规则。虽然编写代码的时候可以按照搭积木的方式去垒代码,已经少了很多硬生生的编写。但 是还是有垒代码的操作。最后,我们会发现,在做一个功能的时候,大体上总是会有加载模版资源,请求数据,渲染处理,事件处理等等看上去不太一样,但是方法 论无数遍重复的工作。试想一下,如果我们能把这些重复的方式也变成了规则,让代码可以自动按照某种关系去自动执行这些重复,我们就可以省去很多机械的重复 的垒代码的过程。

基于这个思想,我设计了规则引擎。Crow5就是在这样的指导思想下诞生的。虽然不能完全实现代码自动去生成代码,但是应该尽可能的让代码趋近于 生成更多的代码。那么代码凭什么可以自己按照某种逻辑去生成代码呢?很简单,我写了一个内核,这个内核啥也不干,就是去读取我下达的指令,通过我下达的指 令去完成垒代码的过程。那么,指令是什么呢?就是我给这个内核的一个配置文件。在这样的一个思索过程中就有了以下的设计。

按照模块开发,我们以前是control,service,module,dao分层去处理功能,最后模式发生了改变。分层最后是由内核去拼装代码,最后我们只要给出指令就好了。

详解引擎技术之约定式编程的实现理念

可以看到上图,我们在编写代码的时候,方式发生了改变,以前需要写逻辑控制代码,功能代码等。现在只需要提供一个叫做配置文件的指令。