体系结构风格(精)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
体系结构风格:
我以前做的都是ERP和OA系统,所以体系结构的选择是基于怎么更好的完成业务处理
1、事务处理
a)简单系统可以采用数据库的事务处理功能
优势:简单、易学、性能高
劣势:将业务逻辑绑定在数据库一层,很难使用高级语言来实现
b)复杂系统可以使用EJB来实现
优势:支持分布式不同厂家数据库上的事务处理,可以使用高级语言来实现
劣势:开发复杂,执行效率低
c)注意:需要事务处理的地方不能选用MS的产品和框架,他们的事务处理完全依靠
数据库完成,基本没有扩展的可能。WebService不支持事务,不能承载业务处理
接口,只能提供一些可出错或出错后可重试的功能。
2、业务逻辑的实现:高级语言vs存储过程
除非使用EJB,否则使用存储过程来实现业务处理。从数据库中读取出数据,经过计算,写回计算结果。这样的过程是无法做到访问互斥的。如果同时有线程在处理这些数据,就会产生冲突。就算使用数据库事务也无法解决这个问题,因为数据的读取并不受事务控制,系统不会保证读取、计算和写回的原子性。
所以,使用存储过程来实现复杂业务逻辑是可靠的。特别是如果系统是采用结构化的开发风格,存储过程可以作为最底层的模块供高级语言实现的模块调用。
3、软件系统的分层
a)数据库
b)数据持久层:如果需要用高级语言来实现业务逻辑,则这一层需要提供读写锁操作。
Hibernate好像提供了这种功能,一般还是使用ejb。
c)业务逻辑层:实现核心业务逻辑,例如:入库操作
d)业务外观(facade)层:组织业务逻辑层发布的接口完成业务逻辑处理,还负责一
些外围工作:数据校验、错误处理、日志记录等等
e)界面表现层
i.界面构件:一些基础界面构件,页面框架,样式表等
ii.界面程序
对象化编程风格:
1、和OO课上讲的差不多
结构化编程风格:
1、模块间公共的常量要用宏定义,模块内的公共常量要用静态变量定义
2、不被外部调用的函数不要在头文件中申明
3、模块对外的接口要使用简单数据类型:不要为了接口函数看着简单而把多个参数包装成
一个结构体,而是直接使用多个简单数据类型的参数。好处:易于理解、便于复用、不会造成模块之间依赖关系复杂
4、模块对外的接口中不变的参数需要描述为const,告诉调用方这些数据不会被破坏
5、模块分通常划分为三类:
a)定义类模块
i.定义一些公共变量和公共数据结构。针对公共数据类型的公用操作函数,例如:
结构的初始化、释放、序列化等等函数
ii.还有一个逻辑无关的处理函数可以放在这里,例如:日志打印
b)逻辑处理模块:这类模块一般有很强的内聚性,一般不依赖或少依赖其他模块。一
般只依赖一些定义类模块。这类模块一般针对特定数据结构进行计算操作,不会访
问文件、网络等等外部设备。
c)组装模块
i.接口模块:负责在对逻辑处理模块进行包装。例如:为了使用方便,将逻辑处
理模块中的一个处理函数包装成多种参数的多个函数。在这类模块中,接口函
数可以使用结构体作为参数,而不用严格遵循接口函数简单变量的规定。
ii.调度模块:负责调度各种多个处理单元合作完成工作,及一些高层逻辑,例如:多线程管理、网络套接字管理、缓存管理等等
代码风格:
1、函数头要写注释,说明函数的用途、输入变量的含义和取值范围,输出的结果
2、变量名不要怕长,多个小写英文词用下划线连接
3、函数要进行分类
a)功能简单明确的函数:需要写注释描述函数头
b)将上述简单函数组合起来完成复杂功能的函数:需要在内部写注释说明为什么进行
分支判断和调用那些简单函数
4、不能省略大括号,即:
if (xxx==yyy) {
do_somthing();
}
虽然只有一行,但不要省略大括号,便于别人阅读时知道判断的作用范围
5、不能使用魔鬼数字:不要告诉别的开发人员1代表什么,2又代表什么。把这些都定义
成宏或常量
6、goto一般用于出错处理(跳到错误处理段,通常在函数最后),不允许往上跳
7、避免用同一个函数名来定义不同参数的多个函数
8、避免使用递归函数
基于CVS的分支开发方法
本方法适合多人针对同一个模块进行开发,各人的开发都是在原有模块上增加无关的新功能。为了避免别人的修改造成自己开发和测试中发生问题,所以使用CVS的分支开发功能
1、针对每个新功能,在当前最新版本的基础上建立代码分支XXX_BRANCH
2、在分支上进行开发,版本号的最后一位表示送测次数。如果一次就测试通过则版本号最
后一位为0,如果测试发现错误后修改了再送测则版本号最后一位加1
3、分支开发、测试完毕,则将模块最新版本合并到当前分支上。创建分支时,模块发布的
最新版本号可能是x.y.z,分支测试完毕后x’.y’.z’可能已经发布了。就需要在XXX_BRANCH分支中合并版本x.y.z到x’.y’.z’版本之间的变更。可以使用cvs up –j x’.y’.z’实现。合并完毕后再对合并结果进行回归测试。把XXX_BRANCH定一个版本号,例如:t_XXX_BRANCH
4、合并测试之后,需要将XXX_BRANCH合并到当前release版本x’.y’.z’上。首先使用cvs
up –dr x’.y’.z’把当前目录下的代码切换到x’.y’.z’版本。再使用命令cvs up –j t_XXX_BRANCH –j x’.y’.z’来合并从t_XXX_BRANCH到x’.y’.z’的代码变化。(由于t_XXX_BRANCH分支已经合并过一次x’.y’.z’,所以这一步一般不会发生什么变化,如