ERP平台开发过程分析.docx

上传人:b****4 文档编号:24886182 上传时间:2023-06-02 格式:DOCX 页数:13 大小:27.14KB
下载 相关 举报
ERP平台开发过程分析.docx_第1页
第1页 / 共13页
ERP平台开发过程分析.docx_第2页
第2页 / 共13页
ERP平台开发过程分析.docx_第3页
第3页 / 共13页
ERP平台开发过程分析.docx_第4页
第4页 / 共13页
ERP平台开发过程分析.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

ERP平台开发过程分析.docx

《ERP平台开发过程分析.docx》由会员分享,可在线阅读,更多相关《ERP平台开发过程分析.docx(13页珍藏版)》请在冰豆网上搜索。

ERP平台开发过程分析.docx

ERP平台开发过程分析

ERP平台开发过程注意事项

1.说明

本文是以程序员的视角出发,针对基于ERP开发平台上业务开发过程中遇到的问题及相关注意事项进行总结成册,对我们的经验及时总结共享,方便大家日后进行参照和查阅。

基于ERP开发平台上业务开发,大致有四个过程:

理解需求,业务设计,业务开发,用例测试;每一个环节都十分重要,不能轻视任何一个阶段。

2.理解需求

1.1基本要求

拿到需求文档后,首先对需求文档进行粗略阅读,查看该用例有几个功能点,有几个主要分支。

有哪些前置用例和后置用例(目的是为了组内交流,确认需求设计是否步调统一)。

用例是哪种类型(可以根据类型,确定出有哪些注意点——需要进一步完善)。

1.2注意事项

了解基本功能后,就需要进一步详细理解需求文档,着重关注以下几个方面:

1.2.1需求文档总的逻辑是否只有if没有else,如果有两个排斥分支,那么这两个排斥分支是否在逻辑上就存在着排斥关系。

(考察需求逻辑的完整性,避免特定场景的问题发生)

1.2.2根据条件查询表的数据时,是否按照业务主键(根据TF表去查看业务主键)查找,是否能够查询到数据,如果没有查询到数据,该如何处理(是发布消息还是继续),如果查询到数据,是否有可能返回多条数据,查询出记录后,需要使用的属性是否为空,如果空该如何处理。

(避免程序运行的空指针异常)

1.2.3各个校验的规则,当前是否只是对单个数据进行校验,以后是否支持批量校验。

1.2.4类似“期间”的字段,在查询和保存时,是否需要补齐;类似“编号”的字段,是否有非数字的字符,如果只有数字,那么在排序时,是否按照数字的规律进行排序;类似“行号”的字段,是否需要补齐,排序时是否按照数字的规律进行排序;枚举值是否同给定的枚举值表统一;百分比类的字段,存储值是否为*100%后的数值。

使用时,是否需要/100%。

(为模块之间的统一处理奠定基础)

1.2.5充分利用需求文档中前置用例,后置用例,充分挖掘各个用例之间的关系。

1.2.6遇到不懂的问题,不要立即询问需求,在积累一定量的问题后,再考虑寻求需求人员的帮助;在最佳的时间寻求需求的支援。

(可能看了后面的需求,前面就明白了)

1.2.7考虑将需求文档备份,在备份上注释出对需求的理解包括不懂的问题和自己的理解概括。

3.业务设计

1.3基本要点

基于面向对象思想,对用例进行分析设计;

1.4注意事项

1.4.1设计是在对需求详细了解的基础上进行的;花费一定的时间进行了设计是有意义的——磨刀不误砍柴功;设计并不是说必须绘制出各种类图、顺序图;设计的内容需要有一定的载体记录,哪怕是一张草纸,一个类、方法、变量的注释(设计的平民化,设计无处不在)。

1.4.2合理封装模型,考虑以下几个方面:

输入条件和查询的数据(包括描述)的存储方式,减少公共方法的声明(多声明一个就意味多一份责任)。

数据集合的存储,数值类型的属性是否有初始值0。

1.4.3加锁解锁的合理性,数据传递的合理性(数据量大小决定不同的屏幕传递方式,PBO或缓存方式)。

1.4.4录入类用例,当前是否只是处理录入一条,以后是否支持批量录入。

1.4.5是否采用了MVC模式,界面和模型有相互转换的方式,PAI和CPBO在设置值到界面的功能上,是否采用了调用同一个方法。

1.4.6是否有必要将界面的域名用一个类封装起来,是否有必要将整个事务的缓存键字用一个类封装起来。

1.4.7功能、业务逻辑类似的用例,是否可以采用统一的方法进行处理(考虑反射的调用)

1.4.8设计中是否考虑系统的性能,避免日后因为性能原因将用例半数推倒。

1.4.9设计是否充分考虑性能问题,对于锁也要充分重视,是否需要加锁,加什么样的锁,对什么加锁,何时解锁_赵利华

4.业务开发

1.5基本说明

1.5.1版权声明的书写,每个类的代码必须要有版权声明。

1.5.2注释的书写:

类文件注释和方法中注释。

类文件已经要记录文件的基本用途和关联窗口的信息,例如主窗口名称等。

方法的注释要写明方法的目的,凡是在代码中声明的集合变量,一定要注释出集合中数据的存储格式(包括类文件中的属性变量、参数变量、临时变量),方便日后的查找和用例的交接。

这里作者中文名是必须的(EJB方法和多人合作编写的类的方法)。

如果是更改他人的程序,一定要要变更注释,标明更改人和更改时间,在方法的入口,要用debug打出数据参数,在捕获异常的时候也要用debug打出可供理解的信息_王宇仁

1.5.3开发工具JBuilder的快捷键的使用,完全由自己编写的一个类的代码提交前,用格式化方式将代码格式化(Ctl+Shift+K),并优化导入的类(Ctl+I),导入的类一定要指定具体的类,而不是将整个包导入,查询类文件(Ctl+减号),查询代码在路径中的应用(Ctrl+P),在当前类中的应用(Ctl+F)

1.5.4熟悉开发环境中应用包的配置、服务的配置、引用代码的优先级、weblogic的配置应用,并能指导其他同志进行配置。

1.5.5逐渐熟悉底层代码的处理方式,减少问题的解决成本。

1.5.6程序中的编码除了注释,日志外,不允许有直接引用汉字的位置,需要出现汉字必须通过资源文件的形式,逻辑不完整的处理,可以采用Debug.logError()的处理。

1.5.7程序中出现的常量,对于自己增加的控制程序分支的常量,尽量采用包含语意的常量进行控制,而不是直接声明为1.2,3等,逻辑判断常量放在前。

1.5.8避免大方法和大类的出现,细化抽取方法(PAI中避免所有的详细处理代码都在pai()方法中)

1.5.9建立一种思维:

凡是有规律可遵循的操作,建议都将其用方法封装起来。

便于代码的精简和维护。

1.6注意事项

1.6.1获取当前日期,调用CGlobleUtil/SGlobleUtil.getServerTime(),而不是用System.currentTimeMillis()

1.6.2日期的比较,不能简单的调用Date.before()或者Date.after()方法进行比较,而是要先查看这里的日期是否需要比较时分秒。

1.6.3日历(Calendar)中日期的月份是从0开始的。

通过日历类设置日期的值时,要考虑月份的开始值问题。

1.6.4数值类型尤其是BigDecimal类型,要即使进行四舍五入的处理(注意保留的小数位并不都是2位)。

是否相等,要用compareTo(),进行比较。

1.6.5发布消息时,消息中的参数,日期要符合当前用户的日期格式,数值要保留相应的小数位,百分比要在最后增加百分比符号。

1.6.6记录用Map存储时,如果用业务主键做键,复合的业务主键,尽量不要用字符串连接做键,而要用专门的数组模型做键(例如ArrayInterface(SimpleArrayImp))。

Map效率比List要高_李平

1.6.7参数的应用传递,List对象被调用的方法更改,则该参数也被更改

1.6.8查询出记录后,然后执行set方法,后来又flush(),则数据会更新到数据中。

1.6.9循环嵌套循环时,需要注意循环索引变量是否引用正确。

1.6.10搜索帮助。

定义的搜索帮助,如果有描述作为输出项,那么也要将描述作为输入项。

自定义的搜索帮助是否支持模糊(*、?

)查询。

1.6.11迭代器(Interator)的正确循环处理。

1.6.12Object类的关键方法的含义和应用:

equals():

在List.contains()中被调用,hashCode():

在Map.put()中被调用,clone():

在数据复制中应用

1.6.13排序的处理:

利用TreeSet,TreeMap(),进行处理,Comparable的接口的含义,compareTo();

1.6.14合理利用反射(只在必要的时候使用:

数据量不大时,反射不一定用真正的反射)。

1.6.15在使用循环语句是,变量要尽可能放在循环体外,同时判断条件,注意用break,continue,减少循环的次数_王宇仁

1.7客户段开发:

界面的绘制

1.7.1是否满足高度、宽度要求(特别是标签);

1.7.2类型是否正确,是否显示数字类型数据,却用了字符串类型控件;

1.7.3年度和期间是否应该使用位补齐类型数字字符串;

1.7.4是否上、下、左、右间距满足要求。

1.7.5是否应该绘制为搜索帮助类型(尤其是显示类型的域,为将来描述查询、表格定位打好基础)

1.7.6表格中的列的坐标是否方便日后列的增加,是否可以将列标题显示完整。

1.7.7窗口的描述信息是否定义完整,例如:

表格屏幕的定义是否完整,影响数据导出默认的文件名。

1.7.8是否会使用绘制的屏幕保存为模板,以作备份。

1.7.9数值类型的数据,界面为空,获取后,是否有必要设置为初始值0。

1.7.10表格类型的数据,取一行的数据,是否用getColumnValue(),逐个单元格获取。

getRowValue(introw)。

1.7.11采用ServiceProxyFactory.getService()获取服务,然后调用具体的服务,这样可以避免服务更改了,但是调用者不知道,导致编译不出错,但是运行出错。

1.7.12调用的服务方法参数为int,long等小数据类型时,传递的类型是int.class,long.class,数组Object[],应该用Object[].class

1.7.13是否将消息的内容重复的消息过滤掉了,是否有错误消息时,设置了错误域。

1.7.14通常采用统一的方式发布,即调用CGlobleUtil.showMessage()方法发布多个消息,而不是采取循环发布每个消息。

需求有特殊要求则除外

1.7.15必须用Message.RETURN_HASWRONG等判断,不允许用固定的1、2等固定值判断

1.7.16PAI中拆分各个功能码对应的处理方法,将PAI方法处理的各个功能处理过程单独提取一个方法。

PAI中对各个功能码只是进行简单的逻辑处理。

1.7.17按照一定的逻辑分支编写事件处理,例如:

先写GUI事件,然后是焦点事件,回车事件等。

逻辑结构清晰,便于调试。

合理利用标志位处理焦点事件的连续触发,下拉框事件的相互影响。

1.7.18表格焦点事件的处理,对于失去焦点的行要正确的处理(针对行不同的失去焦点方式):

/2006-05-30,武志君,失去焦点必须按照底层的这种处理方式

//得到行索引

introw=unclearCtl.getSelectedFromRow();

//如果不正确,则必须更改为其他方法

if(row==-1)

{

row=unclearCtl.getSelectedRow();

}

1.7.19数据的设置

表格的设置采取优化处理方式:

TableSubwindowCtl:

addRow()——>addRow(false)——>addRowGreat()

TableScreen.refreshScreen();

1.7.20表格选择行的判断

即是否有表格选择行的判断:

FIClientUtil.isTableHasSelRows()

introws[]=twCtl.getSelectRows();

//如果行的索引空,长度为0,或长度只有1个,但是为-1,都认为无效

if(rows==null||rows.length==0||rows.length==1&&rows[0]==-1)

{

returnnull;

}

else//其他的情况则认为有效

{

returnrows;

}

1.7.21其他处理

(1)在CPBO的beforeShow方法中,如果想要获取当前的主窗口号,使用CGlobleUtil.getCurrentFrameNumber();_张惠君

(2)进入用例时设置GUI、域的隐藏,在CPBO中的beforeShowForward()内完成,避免显示后又消失_李洪波

(3)对于界面域比较多的用例,可以考虑用类名加属性名来定义域名,将所有的域名用一个类来封装,用实体类封装模型。

采用反射方法来取值,赋值。

_李洪波

(4)对于查询类用例,界面涉及到的区间查询,统一使用底层提供的多选控件处理,以保证风格统一和后期维护方便。

_李凡

(5)在给界面赋值时在PBO中赋值要比在CPBO中赋值效率要好得多,保证客户端在保存前调用两个方法,一个是客户端校验一个是服务端校验和保存。

客户端校验方法第一个任务就是对必输项进行runcheck()校验,不管界面有没有必输项_人事组

(6)在轿车升级过程中,由于小版本升级,数据库不同步,但是咱们平台机制是,如果主窗口不是稳定主窗口,子窗口信息就会去读数据库,造成升级处理起来十分繁琐,因此开发过程中在画主窗口时,一定要选稳定主窗口_赵利华

(7)搜索帮助如果有描述相关数据,必须考虑描述是否作为查询条件。

 

1.7.22缓存的正确使用

FrameTran级别:

事务结束后,该缓存自动清空,在PAI的beforeClose()不用考虑清除。

Frame级别:

当前Frame后,该缓存自动清空,需要自己控制清除,该事务的所有PAI方法的beforeClose(),都需要主动清空

Globle级别:

客户端结束时,该缓存自动清空,需要自己控制清除,该事务的所有PAI方法的beforeClose(),都需要主动清空

合理利用PAI中gainRes()方法,PAI,CPBO具有相同的赋值功能,要提取出来,作为静态方法。

在用例结束时缓存数据的清除上要注意,如果是可能会被他人调用的用例,不要使用全部清除的方法,否则可能会出现错误_销售组

1.7.23窗口和对话框的启动

2007-5-20补充

主窗口和对话框的启动目前都有两种方式,一种是以窗口ID作为参数,另一种是以窗口名作为参数,对于主窗口,以ID为参数,必然读取数据库,以窗口名启动,如果主窗口的实现类是稳定主窗口,则不需要读数据库,而是直接读取资源文件,此种情况对于小版本升级就可以不需要同步数据库。

对话框的启动目前无论是哪种方式启动都需要读数据库,但是未来可能会进行改造为同主窗口一样的处理,具体的代码,请参考:

代码开发示意图\启动窗口和对话框的方式.bmp

1.8服务端开发:

1.8.1回滚的书写格式。

(1)有更改数据库操作的服务方法,在捕获Hiernate异常,捕获QMException,捕获Exception时,都需要回滚,方法返回全局模型GlobleResultMdl,需要判断错误消息,然后进行相应的回滚处理。

(2)对于PBO调用的EJB方法,如果执行了回滚,那么在读窗口的其他信息时会造成weblogic的内部事务异常,最终导致程序运行失败。

解决的方式目前就是让主窗口的实现类为稳定主窗口,这样启动窗口就只读资源文件,避免了执行PBO的EJB方法然后再查询窗口的信息,现象请参考图片说明:

代码开发经验\PBO调用的EJB方法执行了回滚代码引发的问题.bmp——2007-5-20根据PCP406的演示准备异常分析得到的结论。

1.8.2返回值类型的确定。

建议所有的服务端方法,包括工具类方法,都以GlobleResultMdl返回,适应日后需求的功能转变和开发日后的功能扩充。

尽可能少的新建对象,类似如下代码使用new是完全没有必要的:

GlobleResultMdlresult=newGlobleResultMdl();

result=XXUtil.method();_徐利新

1.8.3消息的转储。

SGlobleUtil.procResultMdlMsg()方法和SGlobleUtil.setCommonMessage()方法的使用,不能查看需求提供的消息表,一看是错误的就直接返回了。

1.8.4查询语句的优化书写

(1)以工具类(FISQLUtil)的方式进行处理各个SQL语句的构造。

查询语句中不建议多个表之间的联合查询(数据的内存占用考虑),连接关系的正确运用

(2)查询语句中对于不等于的查询,是否包括为空的处理。

(3)避免循环查询数据库,查询的结果缓存起来,也可将子查询语句作为参数进行传递。

(4)查询数据的时候,可能用到IN或是OR等连接数据,IN在一定长度还可以,多的时候会出现异常,可以都用OR,但是数据超过一定长度,查询会很慢,可以采用每1000条查询一次,但是我本人认为再数据量很大的时候这样也不会有很大的提高,我采用的是判断需要查询的条数,如果超过一定量,就把所有的数据查询出来,然后通过事先作好的MAP(键为要作为查询的条件)来判断那些是需要的数据,放到集合中。

_王春艳

(5)查询的时候判断那些属性可能为空使用isnull进行查询_销售组

1.8.5加解锁的处理

(1)服务端直接加锁,解锁的方法,除原来的方法外,也可以用autoLock方法进行只加不解

(2)按照常量加锁,可以把很多记录都锁上,

(3)按照查询条件加锁,根据查询条件查询出记录后按照具体的记录加锁的差异。

(4)禁止循环调用加解锁。

任何锁的处理必须考虑应用环境默认的锁定条件

1.8.6数据库更改操作

(1)批量插入时,根据数据量的大小和表的特点进行相应的保存操作,(采用JDBC和Hibernate的两个方式进行处理)。

(2)对于有增、删、改数据库操作的数据时,正确的步骤应该是:

首先执行删除:

session.delete(obj),

session.flush(obj),

然后执行更新:

sessioin.update(obj),

session.flush(obj),

最后执行插入:

session.save(obj),

session.flush(obj),

按照上面操作的原因分析:

当前维护用例多数是不允许更改业务主键的,但确实存在允许更改业务主键的用例,考虑如下特殊场景:

用户删除一条已有的数据,同时新建一条相同业务主键的数据或将另一条已存在的记录更改为删除已有记录的业务主键,此时在保存时必须先将上面的顺序操作,否必然会出现违反唯一性约束的错误。

(3)对于保存到数据库的字符串,如果是动态构造的话,要考虑其是否有汉字,所占的字节是否会超过数据库定义的最大长度。

1.8.7PBO中的设置值

在PBO中为表格赋值等。

这样就可以减少日后优化的工作量。

****特别注意的一点在PBO中给表格赋值的时候,如果表中其中有的行不是所有的列都要赋值,那么就要赋上上空值,否则会出现串行的情况****_王春艳

 

5.测试

(1)通过类的Main函数对该类的公有私有方法,进行测试,注意极限数据的测试。

(2)进行程序是否出异常而不能进去(窗口的数据库信息同资源文件的信息是否匹配,是否缺少传递窗口资源文件,是否缺少搜索帮助资源文件),同一个事务的各个窗口之间切换是否出异常;多个界面切换时,回退时,是否连续多次进入相同界面;涉及到保存的用例,用户执行回退时,是否有界面数据是否发生更改提示保存的处理。

(3)程序运行期间,是否设置第一个可输入域为焦点。

是否界面美观大方:

是否各个子窗口的域之间对齐,是否各个域之间的间隔满足标准,是否使用了正确的数据类型,对齐方式是否正确。

表格标题是否能够显示完整,关键的信息是否可以不需要拖动滚动条就可以看出。

表格导出时,默认的文件名是否容易理解。

是否支持排序,是否合计列不参与排序。

表格中是否关键代码有对应的描述信息。

在域屏幕上是否代码域有对应的描述,描述是否显示完整。

必须输入项是否通过变式设置为必须输入项(背景色为蓝色)。

背景色同必输项检查是否匹配。

(4)GUI按钮的拜访顺序是否符合规范。

按钮是否有对应的快捷键。

用户录入时是否可以直接通过键盘而不用鼠标就可以执行整个业务。

表格是否充满屏幕,组框是否充满屏幕。

对话框的尺寸大小是否符合规范,按钮摆放位置是否符合规范。

通过搜索帮助能否将数据带回到界面上,包括描述,更改代码并失去焦点时,能否通过搜索帮助,将新的描述信息返回到界面上。

搜索帮助是否将描述作为输入条件了,自定义的搜索帮助是否支持模糊查询。

(5)回滚操作是否能够全部回滚,分段提交是否受回滚影响。

是否加锁解锁功能正常(MON002监控当前锁的情况),缓存是否在正确的时机得到合理的清除(MON001监控缓存的使用情况)。

(6)各个基本功能是否正常,存入的数据能否正常保存,查询的数据能否正常查询出来;需求文档中的各个例外消息,能否通过配置适当的数据,抛出对应例外的消息。

(7)如果可能还要对数据量特大的时候进行测试,看特殊情况下用例能否正确运行,可以找找可优化的空间_王春艳

(8)对于服务端的回滚方法,要使用错误数据,进行测试_胡仁杰

6.提升技能方式

1。

看书:

《JAVA1.4》、《JAVA编程思想》、《JAVA专业编程指南》、《JAVA与模式》,

2。

看开源项目的代码,包括看JAVA的源代码。

2。

同别人交流探讨自己的编程心得,多总结自己的问题。

3。

做大的难的用例,不能一味停留在简单用例上,可以主动申请做大的用例。

遇到解决不了的问题,向组长反映,寻求别人的支持。

4。

多考虑所做的用例对应的业务,在本模块和其他模块的位置,自己查询的数据从哪里来,自己保存的数据哪里用。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1