动作是NoahWeb中极为重要的一个概念,浏览器与服务器一个完整的上下交互行程都可以理解成一个动作。
动作编程与以往的过程编程和对象编程是截然不同的一种编程思路。过程编程已经被某种意义上被淘汰在此就不做讨论,而动作编程与对象编程相比较,他们之间最大的区别在于“高度”的不同。
类、对象带给我们的面向对象编程可以让我们方便的在众多领域中进行复杂、高效的编程实现应用。每个有过对象编程学习经历的人在最初学习时也许都被问过“这个世界是由什么组成的?”通过这个方法以便让大家能直观的了解对象和类,而对象和类更可以让我们用最初认知的世界方式来理解和描述计算机中的各种功能和值。可是,对于网站、MIS或业务系统这些轻量级B/S架构的应用,对象编程也许并不是一种最好选择。
对于客户——程序结构设计重要还是流程设计重要?
类、对象提供了我们一种去描述计算机程序内各种能力和值的方式,可类、对象也是一种很“低级”的描述方式。
我们可以通过类和对象的方式来假设设计一个批发商买卖矿泉水的程序:
首先,您需要使用对象的方式描述水的各种属性和它具有的能力,而水是被装在瓶子里,所以对于装水的瓶子您也需要用类或对象的方式去描述一下瓶子的属性和能力,瓶子需要被装在箱子里,所以您也需要去用类或对象的方式去描述一下箱子……到此暂停!
回头看一下使用类和对象的时候我们在做什么?我们在进行对象之间的关系设计。而我们最初目的是什么?是设计一个批发商买卖矿泉水的流程。
看一下使用动作编程是怎么设计整个流程的:
订单确认—>出库—>装货—>送货—>收款
订单确认、出库、装货、送货、收款每个都是一个动作,而这些动作组合在一起构成了一个买卖矿泉水的动作流程。或许您还认为上述整个买卖矿泉水流程不合理应该是另一个更合理的流程。这样考虑就对了,因为您现在更多的时间已经花在为您的用户设计流程,而不是考虑设计整个类和对象之间的关系。
对于系统的用户我们为他考虑的不应该是程序结构方面的设计,而应该更多的是流程方面的设计。在使用动作方式后,您关注的不再是类和对象之间的关系,而是整个流程的设计。
一级还是多级?
我们还是继续来看批发商买卖矿泉水的流程设计,对象编程时,水和瓶子之间是存在关系,瓶子和箱子之又存在关系,再往上设计,或许还有批发商对象,买卖矿泉水的这个行为是由箱子这个对象来具备的,如下图所示:
这使整个系统对象有了三级的层深。是不是所有系统我们都需要把对象之间的关系弄的那么复杂?我们看一下用动作来设计时的情况:
用动作来设计时,批发商、箱子、瓶子、水或乃至货币在整个流程中仅是以一种资源的形式存在着。水就水、瓶子就是瓶子、箱子就是箱子,他们之间有是一种平面的关系,而没有层级关系。资源存在的目的是为动作去服务,资源之间没有层也没有级的概念,资源可以同另一个资源有关系也可以依赖别的资源,但是这些关系仅是为了完成这个动作而存在。
类和对象虽然可以让我们去描述这个世界的组成,可是类和对象不能让我们去很好的描述一个事物流程,在编写轻量级的应用时,如同现实世界中我们希望从某一个地方到达20公里外的另一地方一样,我们并没有必要为此去研究汽车的各种组成、研究发动机原理、研究圆周率,研究铺路等等这一切世界的物质构成,我们仅仅是需要去那一个20公里外的地方,您所做的只是需要抬手去打一辆车,并且告诉司机您想去的地方。汽车、自行车、飞机、公路、发动机等等这一切对于您仅是一种资源,他们仅是为您而存在。您所要做的仅是去使用他们。
出租车和其他我们常见的东西,如浴缸,这些已存在的对象我们没必要再去定义一次,就如同现实里您想去某个地方时您会去打一辆出租车,而不是坐进一个浴缸里,在这我们已经没必要再用对象和类的方式来区别出租车和浴缸,他们有他们固然存在的对象构成方式,那是科学家或是工程师才有必要去考虑的,而在您使用他们的时候出租车就是出租车,浴缸就是浴缸。世界是由对象来组成,而动作才是去驱动这个世界运转的。
NoahWeb中的动作
稍稍了解历史的人都知道,金字塔是世界奇迹之一。除了外形之谜,建造之谜以外,很奇怪的是,整座金字塔虽然使用石块垒起,但每块石头之间却没有丝毫的粘结物质。换句话说,如果你从塔顶上将石头一块一块往下搬,从理论上讲就可以把整座金字塔拆了。
从这个意义上说,NoahWeb中的“动作”概念很像是金字塔的石块,每个“动作”就是一块石头,而整个应用就是整座金字塔。尽管每块石头紧紧相连,但它们之间从始至终却不存在任何必然的联系。一旦遇到必须的改动,比如需求变更的时候,由于这个特性,你可以任意“搬动”或是“改动”任意一块“石头”而无需考虑其他“石头”。
反观现代的一座座琼楼玉宇,很漂亮很实用,但是由于种种原因,在盖楼的时候,每块砖之间却使用了砂浆之类的粘结物质,目的很简单,只有这样楼才不会塌。
真巧!这和面相对象编程中的类,对象的概念很像。如果说每一块砖就是一个类或是一个对象的话,那么整座大楼也就是整个应用。而类或对象之间的关系恰恰就是粘结它们所使用的砂浆。没有“砂浆”,类或对象之间就不能发生关系,整个应用也就无从谈起了。现在,楼盖起来了,关系形成了,一切都没问题了吗?如果这个时候需求变更了呢?已经“粘”在一起“砖”你能轻松地再把它们分开吗?难道……要把“楼”“炸了”重新“盖”吗?……
NoahWeb中的动作使用一个被预先约定好的环境变量名”action”,无论使用HTTP传输协议中的GET或POST方式对这个变量赋值都可以激发对应的动作。以动作为中心,可控制与调用其他相关的资源,NoahWeb中可用的资源被分为数据库操作、表单、字符、模组四大类。资源基本采用XML方式进行存放甚至描述。可通过使用NoahWeb中结构化的逻辑层(XML方式)来控制对资源的调用。而资源的显示效果则可以通过NoahWeb表现层轻易控制。这样开发出来的项目,资源的分布成平行,而程序逻辑又成线性,其中资源与资源,资源与动作或动作与动作之间完全呈现松偶合状,如下图所示:
这对项目开发中必然会产生的需求变更后的变更灵活性和响应速度带来必要的支持,需求变动后仅需要变更相对应的动作。由于是采用资源松偶合下的动作来进行编程,所以在开发中一个动作的错误和问题并不会影响整个系统的开发进度甚至后期用户对整个系统的使用,有问题的动作仅会影响前后相应动作,不至于使得整个系统瘫痪。如下图所示:
有时候我们也会需要将一个完整的系统拆分成多个小型系统,或将多个小型系统合并成一个大型系统。这时候动作也会带给我们很多便利,如下图所示:
动作还有一个好处就是使得我们通过以现实世界中描述流程的方式来进行系统设计,可用通过分析需求后的用例图同时得到流程和系统结构设计,缩短系统设计时间,如下图所示:
上述仅仅是对动作编程的一个简单介绍,去学习和了解她将会带给您更多的体验与感想。等待着您进入动作带给我们的崭新的编程世界,让我们一起用我们的动作驱动未来。