一年前,我在一个偶然的机会接触到一个项目,由于种种原因最后,这个项目在技术取向上确立为B/S架构。这个项目是一个产品类型的项目,属企业方面的应用,从市场上已经的同类产品来看,他的操作风格及操作习惯均为C/S, 所以当时经过仔细考虑,我们普遍认为如果完全按B/S的风格来做,可能将来的使用效果不太理想,甚至客户不能接受,所以最后决定采用AJAX来进行开发。
在这之前,我已经进行过一些有关AJAX方面的研究,但尚未在工程中大规模实践,所以手里并没有成型的架构。研发过程进行得既顺利又艰苦,说顺利是因为我们在研发过程中从定位、设计、实现、应用上把握得都比较精确,中间没出现过大的失误,每一步都在计划和意料之中完成。说艰苦是因为,当时我所带的团队是一个长期从事DELPHI做C/S开发的团队,而我们开发采用的是APS.NET+C#,没有人能协助我进行研发,公司也不愿意再招相关人员(当时的这些人员在公司是老员工工资都比较高,可能这是老板不愿意再招收人员的原因),最后我迫不得已,自已兼任了架构师,在三个半月的时间,我一共只休息了四天的时间,其余的时间没日没夜的工作,除了周末基本没休息外,平时一天也至少会加一个半到三个半小时的班。三个多月后,我们项目顺利成型。其后,我在总结这个项目的研发过程中的得与失时感触颇多,闲遐之余,随便写写把其中AJAX框架设计部分的一个主要成果写出来写大家分享,限于时间有限,我就不再对其中的运作过程作阐述,仅对技术设计过程作个分享之述。
在许多程序员看,追求AJAX就是要追求他的无刷新效果,很多时候把AJAX当作一种技巧来使用。其实无刷新,仅仅是AJAX的一种表面现象而矣。我个人认为在适合采用AJAX实现的项目中(也就是说不是所有项目都适合用AJAX),用好AJAX应该从理论到实践上进行转变。C/S的应用程序能达到其交互友好的效果,是有其自己的特点的,在用AJAX来实现与其相当效果的应用时,一定要认真分析C/S为什么能有如此的效果,然后确立在AJAX中要做什么以及怎么做。就我所体会到的而言,要做好AJAX要非常熟悉“分布式系统”这一类的应用程序的开发(比如以智能客户端为技术基础的这类应用),因为在采用AJAX这种开发方式后,应用程序的运行过程和这类程序极为相似,与以服务端为主的BS有很大的差别。所以如果在使用AJAX之前不能彻底排除“以服务器端为主要方式”的这种开发习惯,我认为做好AJAX的开发是不太可能的。这种转变体现在几个方面:
(1)代码结构的组织应以C/S的结构方式来组织。
这种组织方式的改变最明显的成效就是:代码的逻辑结构显得十分清晰,而传统的B/S很多时候服务器端代码做的是客户端的事,导致代码结构不清晰。就以ASP.NET为例,如果做了个按钮点击事件,当点击按钮的时候,我们很希望直接从这个按钮脚本开始分析跟踪代码,但事实上在这之前和之后,APS.NET为了“保持状态”还要运行其它很多代码,这显然是我们不希望看到的。但如果采用AJAX的方式后,在这个处理过程中,运行的起点就是按钮的脚本,整个运行脉络十分清楚,而这也正是C/S应用程序代码结构上具有的优点。或许这个说明比较简单,当页面结构再复杂一些,你就能体会到“代码运行过程脉络的清晰程度”对开发直接产生的影响是多么巨大了。所以,我个人认为从根本上采用C/S的代码组织方式来组织代码,彻底改变服务端编程模式把“客户端”和“服务器”的逻辑混在一起的代码组织方式,是AJAX成功的起点。否则,顶多AJAX也只能被作为一个技巧在工程中运用。
(2)突破心理障碍认真对待JS
在这之前,JS在我心目中的地位一直是个“配角”,但其实你认真研究之后,你会发现其实几乎所的面象对象的特性在JS都是可以比较容易实现的,比如:封装、继承、重载、多态、接口、反射、委托等都可以直接或间接实现,完全可以比较完备的支持一般面向对象语言的开发习惯和理念,只是在形式上有所差别而矣,而且其实现是比较简单的,并非象很多开源框架那样搞得比较复杂。如果采用AJAX开发项目,JS必须作为一个重量级的语言来使用,所以突破心理障碍,把JS玩转,是AJAX成功的又一条件。
(3)设计重心的确立
就我们的体会而言,我们在开发过程中,在技术上主要有三个重点:
a. 顺利完成从客户端到服务器端的数据交换。
这里我们采用了AJAXPRO这个第三方包,然后对数据接收略为作了扩展,使其对数据接收能比较顺利的从JS的类转换成C#的类。
b. 找到或实现能和C/S操作风格及习惯相匹配的UI组件
这是比较难的一关,我们找了三套控件,都是比较出名的,但最后发现他们使用过于麻烦,一时半会不能研究透,另外就是重要的的基本特性没有,比如在我们的软件中,经常用到控件的两个特性:设置可用与不可用、设置可见与不可见,我们找到的三套控件都不能完整的支持,有的压根就没这些特性。但这对我们来说非常重要。另外就是,这些控件基本上是纯JS的和VS的开发环境不能很好的融合起来,这使我感觉用这些控件,有点退回到当初DOS下写FOXBASE程序的那种感觉,它会导致团队熟悉过程加长,而我们当时的时间是不允许的。权衡之后,又仔细分析自己写一套控件的工作量,我们认为自己写也没传说中的那么困难,最自己写了一套控件,其中包括:Tree, Grid, TabControl, spinner, dateTimePicker, toolBarButton, button, pageBar等常用控件,而且完全支持C/S的操作习惯,并支持在VS中直接拖放。最后是成功的解决了UI的问题,大概前前后后花了我一个人接近一个月的时间,当然这中间有早期研究时的一些成果。而且这个过程没有影响到其它人的开发。
c.成功写出一个能体现“整个代码组织思想”和对“常见应用实现过程”的DEMO
这个是很重要很重要的,如果这个DEMO写得过于全面团队接受起来会比较吃力,如果写得过于简单往往不能包容变化,而导致团队用不起来。这个DEMO设计和实现的要领就是要找一个不含业务功能的简单示例,但实现过程的结构要很完善,这样团队既能快速接受,又能理解思想,达到包容变化的目的。
(4) 其它方面
除了以上三点是最重要也是工作量最大的部分外,也还有一些比较小的要注意的地方,如果做不好对成功实现和运作AJAX框架有很大影响,但那些更多属于管理的范筹我就不再讨论了。
总之,在AJAX框架设计过程中,我认为只要把握住以上所说的几点,就能真正从WEB1.0过渡到WEB2.0, 如果有兴趣的朋友可以一起探讨这个问题,特别是如果手里有比较好的UI组件,而且用得比较成熟的朋友,不妨借来学习学习。