在上一章中,简单提出了信息树的概念,可能大家都有了初步的概念,本章将会根据上一章的实例进行扩展,并通过实践的代码示例说明如何运用信息树。
在<<代码大全2>>中,作者认为程序编码是整个系统开发中最不可或缺的环节,可以没有需求分析、设计、测试,但不能没有程序编码,因为如缺少这一环节,则无交付物,反之亦可。
故本人认为,系统的开发应以开发为核心,即把开发人员当成需求方,而需求分析、设计、测试只是为开发提供一系列的服务,为其保证开发质量。
那么从开发人员角度出发,他们希望获得什么才能编写出高质量的代码呢?本人认为编码基本可以归结为三类:逻辑判断、赋值、计算,以下将分别说明:
(1) 逻辑判断
在代码中主要通过if语句进行判断,即根据其判断条件和结果,进行相应的逻辑处理,
其分为静态、动态判断,静态判断为通过已保存的状态(如status状态)进行判断,而动态判断包含一定的实时计算,如超时、订购量、可支付金额等
(2) 赋值
即数据如何从web、app端传输到业务层,再从业务层传输到数据层,反之亦从数据层->业务层->web、app,由于其涉及多层、多业务,故其在整个编码过程中可以说是最繁杂的地方
(3) 计算
其实逻辑判断、赋值、计算,此三者是互相嵌套的,这里的计算只是相较于逻辑判断、赋值来说,较复杂的逻辑,这也是较难处理的地方
而在信息树中,可一次解决以上三个问题(对于计算问题,可能目前解决方式较单一),且最大的好处在于,可提高业务人员、开发、测试的沟通效率,做到文档即编码,保持文档与代码的一致性,且其可高效扩展,做到修改文档即修改代码。
下面我在将上一章的信息树进行扩展,并进行讲解,如下图:
在上图中,为订购的一个简易流程,简单说明了逻辑判断、赋值,并对其进行了相应抽象,且可便于今后的扩展,下面为大家详细解释。
(1) 首先会有一个“订购新增信息”,其“consume”为业务执行的前置条件,如满足则进行生产,但此处的生产只是原材料的生产,生产完后发起通知
(2) 其“订购成功信息”如收到其“订购新增信息”已生产完毕的通知,则进行生产,
而“Set”为产品的标记(此处为静态判断,动态判断在之后的章节会进行讲述),通过此标记可识别此产品,而“Save”则表示生产完成后入库。
(3) 而“订购有效信息”可以认为是“订购成功信息”的包装,就像是给已生产的产品进行包装,已便于销售
在此需特殊说明的是,其“订购新增信息”与“订购有效信息”,对“订购成功信息”进行了封装,以便于进行扩展,假如今后如业务发生变化,比如其“订购有效信息”为订购成功且支付成功,则可进行相应简单修改即可。
而如果在“订购新增信息”后,有新的状态加入,也只需简单修改就可进行扩展,并且此图可同时供业务、开发、测试阅读,统一其沟通语言。
需要注意的是,此处有一个难点,即对每个信息的业务定义,即类似于Restful中的资源。如“订购有效信息”的业务定义是什么,一旦定义完成就不可改变,如有新的业务定义,应新增相应的信息进行匹配。
另其所消费的信息,应是业务抽象化的信息(原材料除外),这样便于扩展,且可进行信息叠加。
以下将以代码方式,说明如何实现以上信息操作,由于代码示例较复杂,故分为两阶段描述,此章先对“赋值”进行描述,而下章则会加入“逻辑判断”(包括静态与动态),以下代码基于个人所写的doc-eq-code-Dgremlin项目,具体地址为:https://github.com/szlwin/doc-eq-code-Dgremlin
首先我们进行业务建模,具体如下:
用户信息(User.xml):
<?xml version="1.0" encoding="utf-8"?>
<orm--data-mapping>
<dataname="user">
<property-info>
<propertyname="id" type="int"/>
<propertyname="uidd" type="string"/>
<propertyname="uid" type="string"/>
<propertyname="name" type="string"/>
<propertyname="activeTime" type="date"/>
<propertyname="status" type="int"/>
<propertyname="password" type="string"/>
</property-info>
<table-info>
<tablename="userInfo" data-source="data1" key="u_id"key-type="increment">
<columnname="u_id" ref-property="id" type=""/>
<columnname="u_name" ref-property="name"/>
<columnname="u_password" ref-property="password"/>
</table>
<tablename="userInfo" data-source=