HugeBoss开发规范
目录
概述
项目依赖关系
开发模式
1 查询模式
2 提交模式_二次业务
3 提交模式_维护
编码细节及案例说明
1 命名问题
2 设计问题
数据库规范
Sql提交规范
版本控制规范(For 版本管理员)
概述
HugeBoss开发编码基础是Java编码规范,加上Huge自己的规范组成。
本文着重介绍的是Huge自己的开发规范。
要想清楚的了解HugeBoss的开发规范,首先要对HugeBoss项目的整体有个把握,因此我们会先介绍项目之间的依赖关系,再说一下从编码角度看到的三种比较典型的开发模式,最后是一些编码要注意的细节及案例。
项目依赖关系
!worddav2ca459935363688ec396a7044b48656f.jpg|height=309,width=553!如上图所示
UI包括所有以ui开头的项目,界面层
Model包括所有以presentationmodel开头的项目,处理界面交互逻辑
Dto包括所有以dto开头的项目,前后台交互的数据
Service包括所有以service(不带.internal)开头的项目,后台服务公布给前台调用的接口
Service.internal包括所有以service.internal开头的项目,后台服务公布的接口实现
Assembler包括所有以assembler开头的项目,组装器,负责将Domain组装成Dto或反之
Domain包括所有以domain开头的项目,领域对象
Data包括所有以data开头的项目,处理数据层的查询更新等
Dtv.service包括所有以dtv.service(不带.internal)开头的项目,第三方系统对我们的接口
Dtv.service.internal包括所有以dtv.service.internal开头的项目,第三方系统对我们的实现
Sysway包括所有以sysway开头的项目,放一些基础类和工具类,任何项目都可以依赖于他
UI,Model,Service,Dto,Sysway 发布成前台客户端程序
Service,Dto,Sysway,Service.internal,Assembler,Domain,Date,Dtv发布成后台服务程序
另外还有一些规则:
包名以"com.sysway"开头且不含有"boss"的项目,都是放与boss无关的公共的类接口。
编码时要注意
1 不要有直接或间接的循环依赖(例如ui依赖于model,model如果再依赖ui就是错误的)。
2 不要有跳过某一层建立依赖的情况(例如model依赖domain层就是错误的),因为我们的系统是分层设计的(参考《HugeBoss架构》)。
开发模式
所有的命名,统一按先动词后名词的顺序,符合自然语言逻辑。
所有的类该放到哪个包里,以Domain为参照。
1 查询模式
命名规则:
接口名称定义规则是:"I"+ Domain类名 + "Service"
接口实现类名称定义规则是:接口名去掉I
接口查询方法定义规则是:"find"+ Domain类名 + 特性标识+ "Info"
查询条件的DTO定义规则是:Domain类名 + 特性标识 + "Info"
如果查询条件特别简单如只有一个code可以不必定义DTO
查询结果的DTO定义规则是:Domain类名 + 特性标识 + "Info"
如果返回结果特别简,如只是个数字,可以不必定义DTO
其中"特性标识"是根据具体应用场景对Domain的修饰,用于说明被命名对象的含义。
Finder接口命名规则:"I"+ Domain类名 + "Finder"
Finder实现命名规则:Finder接口名去掉I
Assembler命名规则:返回的DTO类名 + "Assembler"实现Domain对DTO的转换
查询接口实现方法:
1 前置条件检查
2 调用要查询Domain对象的finder中符合条件的方法(如果没有自己加)
3 查出的Domain通过Assembler组装出需要返回的DTO或列表
举例说明:
以客户(Customer)为例子,按客户编码查询客户摘要信息
接口名定义为:ICustomerService
接口实现类名称为:CustomerService
查询条件DTO定义为:不定义DTO,直接用参数customerCode
查询结果DTO定义为:CustomerSummaryInfo
接口方法定义为:
CustomerSummaryInfo findCustomerSummaryInfo(String customerCode);
实现:
public CustomerSummaryInfo findCustomerSummaryInfo(String customerCode) {
assert customerCode != null : "传入的customerCode不能为null";
Customer customer = Customer.getCustomerFinder().findByCode(customerCode);
return CustomerSummaryInfoAssembler.create(customer);
}
2 提交模式_二次业务
命名规则:与上面相同的不再重复说明
接口查询方法定义规则是:"业务动词"[ + Domain类名]
前台提交的数据以DTO的形式传到接口参数中,特别简单的情况可以不定义DTO
Act命名规则:"业务动词"[ + Domain类名] + "Act"
Order命名规则:"业务动词"[ + Domain类名] + "Order"
二次业务的接口一般定义在ICustomerOrderServcie中
二次业务的接口参数,一定要带个CommitType类型的commitType,这个参数说明本次是预提交还是真正的提交(预提交是为验证整个提交过程用,不会真正提交到数据库)
在实现中不需要对commitType参数做出处理,因为有方面统一处理预提交/提交。
前台实现方法:
界面必须继承BaseCustomerSection,model必须继承BaseCustomerSectionModel
查询接口实现方法:
1 前置条件检查
2 组织新建Act需要的数据
3 调用Act.run()方法,下受理单。
注:一般来说二次业务接口实现无返回值,出错信息(如前置条件不符)通过抛异常或断言实现(有方面把断言转换为异常)。
举例说明:
以新客户订购为例子
前台提交的DTO为:CustomerPurchaseOrderInfo
接口定义如下:
void purchase(
CustomerPurchaseOrderInfo customerPurchaseOrderInfo,
CommitType commitType);
接口实现请参考代码。
3 提交模式_维护
命名规则:与上面相同的不再重复说明
Page命名:"Maintain"+ Domain类名 + "Page"
Section命名:"Maintain"+ Domain类名 + "Section"
Model命名:"Maintain"+ Domain类名 + "Model"
接口方法命名:"Maintain"+ Domain类名
Act命名:"Maintain"+ Domain类名 + "Act"
Assembler命名规则:Domain类名 + "Assembler"
这里的Assembler与查询功能的Assembler相反,是把DTO转换成Domain,并提供增加、更改的方法。
接口定义参数统一有三个列表:
addInfos(增加的信息)、updatedInfos(修改的信息)、deletedInfos(删除的信息)
可以根据情况增加其它参数
查询接口实现方法:
1 前置条件检查
2 组织新建Act需要的Assembler
3 调用Act.run()方法,循环三个列表,分别进行增加、修改、删除操作。
注:一般来说维护功能的接口实现也无返回值,出错信息(如前置条件不符)通过抛异常或断言实现(有方面把断言转换为异常)。
举例说明:
维护设备为例子
DTO定义为:MaintainDeviceInfo
接口名称为:maintainDevice
Act名称为:MaintainPhysicalDeviceAct
Assembler名称为:PhysicalDeviceAssembler
接口定义如下:
public void maintainDevice(List<MaintainDeviceInfo> addedDeviceInfos,
List<MaintainDeviceInfo> deletedDeviceInfos,
List<MaintainDeviceInfo> updatedDeviceInfos);
接口实现
public void maintainDevice(List<MaintainDeviceInfo> addedDeviceInfos,
List<MaintainDeviceInfo> deletedDeviceInfos,
List<MaintainDeviceInfo> updatedDeviceInfos) {
Act act = new MaintainPhysicalDeviceAct(
PhysicalDeviceAssembler.create(addedDeviceInfos),
PhysicalDeviceAssembler.create(updatedDeviceInfos),
PhysicalDeviceAssembler.create(deletedDeviceInfos)
);
act.run();
}
编码细节及案例说明
1 命名问题
所有的命名都以动词在前名词在后的形式,符合自然语言的逻辑
常量定义要大写,不同单词之间以下划线分隔
维护xxx的功能,都以"Maintain"开头。
例如:维护物理资源规格的页面
正确的命名是:MaintainPhysicalResourceSpecificationPage
错误的命名1:PhysicalResourceSpecificationPage(缺少动词)
错误的命名2:PhysicalResourceSpecificationMaintainPage(违反先动词后名词的原则)错误的命名3:ModifyPhysicalResourceSpecificationPage(修改不能够反应所有维护的意 思,维护是指新增,修改,删除的动作集合,并非仅仅把已存在的东西做更改,这是有区别的。)
ActTypeCode的取名以Act结束,不要命名为xxxPage等非Act结尾的,因为Page是实现方式,Act是与业务相关的,与实现无关。
正确的例子:
pageHash.put("MaintainSimpleTypeAct", "com.sysway.boss.ui.businessconfiguration.MaintainSimpleTypePage");//维护简单类型
错误的例子1:
pageHash.put("NewBizMonthReportPage", "com.sysway.boss.ui.syntheticalstatistics.NewBizMonthReportPage");//新宽带业务月报表
不该以"Page"结尾,应该是"Act"。
错误的例子2:
pageHash.put("PhysicalResourceStorageActIn", "com.sysway.boss.ui.resourcemanagement.physical.storage.PhysicalResourceInStoragePage");//物理资源入库
pageHash.put("PhysicalResourceStorageActOut", "com.sysway.boss.ui.resourcemanagement.physical.storage.PhysicalResourceOutStoragePage");//物理资源出库
不是以"Act"结尾。
变量名要写全称,不要缩写,为了易读。
我们的代码命名提倡完整的命名,不提倡缩写,缩写只用在两种情况,
1.该缩写已约定俗称比如:MAC、I、j、k等。
2.由于客观的限制不得不缩写:比如有长度限制的数据库字段名、表名
正确的定义:ChangeBaseProductOrderInfo changeBaseProductOrderInfo;
错误的定义1:ChangeBaseProductOrderInfo info;(引用时从名称看不出含意)
错误的定义2:ChangeBaseProductOrderInfo cbpoi;(引用时从名称看不出含意)
变更名与值,函数名与函数实现要保持一致。
错误例子1:final String IS_PRINT_BEFORE_COMMIT="isCommitBeforePrint";(名称与含义相反)
错误例子2:public List<Product> findRecurringProductByCustomerAndProductStatus(String customerCode, String... productStatuses) {
return findByCustomerAndProductStatus(customerCode, productStatuses);
}
最先是取得有周期性价格的产品,但由于某些地方的需要改为取得所有产品
改了实现后没改函数名称
不要有类似xxx2的命名(类,变更,存储过程等)。
为了程序的易读性,如果在同一作用域里有两个同类的变量,命名时考虑将这两个变量的用途和角色,加入变量名中。不要取为xxx2名称,如果一定不可避免(例如是临时方案),则一定要写明注释。
另外一种类名有XXX2的情况,这个多半是对第一个类的替换和优化,但是又不想影响原来的实现,这种允许存在,但最终要把废弃掉的那个删除,把2改成正常名称。
错误的例子1:
NoteDetailInfo.itemName2
发 票明细项NoteDetailInfo的显示各地不同导致加了多个itemName2的属性
变更字段的取名要精准
如果字段的作用是id请不要命名为code,如果字段的作用是code也不要取成id。
2 设计问题
有时类中需要增加一些静态的方法取得常用值的实例,这时要用方法,不要用静态值。
例如:Money类,外面可以通过Money.ZERO来取得Money为0的实例。
public static final Money ZERO = new Money();
public void setAmount(BigDecimal amount) {
super.setAmount(amount.setScale(DEFAULT_SCALE, RoundingMode.HALF_UP));
}
由于ZERO是静态的,Money又有setAmount()方法会改写amount的值,那么当一个变量采用Money.ZERO的方法做了初始化后,又直接通过setAmount()方法更改Money中amount的值(假设新的值是x),则所有引用ZERO的值都改为了x,这是很危险的做法。
所以在这种情况下,需要把ZERO的值改为通过方法取得一个新的实例。
public static Money getZero(){
return new Money();
}
修改了函数实现后,要遍历所有调过该方法的地方,看是否会受到影响。
错误的例子:
public List<Product> findRecurringProductByCustomerAndProductStatus(String customerCode, String... productStatuses) {
return findByCustomerAndProductStatus(customerCode, productStatuses);
}
最先是取得有周期性价格的产品,但由于某些地方的需要改为取得所有产品
是否看了原来调用该方法的所有地方是否会受到影响?
当前台需要的信息缺少时,应该先找相关人员沟通看有没可用的接口,如果没有,自己重新写一个接口取得相应的数据,不要找个复杂的接口缺只取其中很小一部分数据。
错误的例子:
List list = productSpecificationService.findAll();
// 转换成typeInfo
List<TypeInfo> typeInfoList = this.ConversionTypeInfo(list);
包之间的引用参考下图关系
参考项目依赖关系一节。
错误的例子1:
sysway.presentationmodel引用dto.product
本来是个底层的包,但这样做导致编译sysway.presentationmodel时必须要将所有dto的项目编译通过
sysway.presentationmodel,应该是放与boss无关的类。而dto.product与boss是相关的。
遇到不明白的问题,要先找相关人员或组长进行沟通,了解现有的实现方案,再做决策
是否原来就有现成可用的东西?是否需要小范围的重构?是否需要大面积的重构?
错误的例子1:
ProductOfferingPriceInfo里增加SmartCardCode
SmartCardCode与产品价格信息没关系,是否考虑应该换个方式实现?
错误的例子2:
NoteDetailInfo.itemName2
发 票明细项NoteDetailInfo的显示各地不同导致加了多个itemName2的属性
命名上也看不出来区别,构造函数也没有
一定要加成xxx2吗,发 票的需求越来越杂,原来的结构已很难支持当前的变化,是否应该考虑重构?
错误的例子3:
已经存在的工具方法,在Model又写一遍私有的
private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd");
private String format(Calendar date) {
return format.format(date.getTime());
}
实际上DateHelper.toDateString(...)就可以实现
已经没使用的了代码,直接删除掉,不要只注释掉,没人使用,未来也不会有人使用的方法函数也应该删除掉。因为我们有版本控制,需要时可以找到。
所有关于Code的定义,统一通过新建立一个以大写I开头的接口,放在与业务相关的service项目中,包与Domain所在包的位置保持一致。
接口应该与业务相关,放到与当前业务相关的包及接口类中。
错误的例子:
查物理资源信息的放到CommonService中
ICommonService.findPhysicalResources()
应该放到IPhysicalResourceService 中
数据库规范
1 建表时要考虑未来的数据量和性能问题,例如:是否需要建立索引?
2 建表或增加字段时的字段类型不要随便写,请参考自动生成的建表sql中相应的类型。
自动生成sql的脚本是:ant generate-schema-script;
注意:需要ant default;执行完成后才可以执行成功。
Sql提交规范
基本规则:
文件类别有两种,sql,prc
prc文件: 代码块,有begin...end的那种,一个代码块要以~作为结束标识符.
如a.prc文件的内容
Begin
....
End~
Sql文件: 非代码块内容,以;结束。
如 b.sql内容
Insert into ..... ;
Update .....;
Call addmenu....;
注意:每一个完整的sql语句,比如一个存储过程,单个insert语句最后要加一个回车.
文件命名格式.
两位数字[~[两位数字]].prc/sql,前面的数字代表了sql文件执行顺序。
如01.XXX.sql
11.XXX.sql
01~01.XXX.sql
注意 . 号前只能两位数字,不能超过3位.文件命名最好是xx.内容概要[jira号].sql/prc
注意事项:
1有关sql校验的问题,要注意用sql.check工具校验过再提交。
2不同内容的sql不要用同样的文件名。如果是对上一个sql的升级,第2个sql文件名要注明详细点。
例如一个不好的例子:
20090115提交的一个01.proc_staJobs.pdc
和20090316也提交了 01.proc_staJobs.pdc
两个sql内容不一样,在出升级sql时会过滤掉重名的文件。
3.开发只能在全局的s00_current和项目.current下提交或修改当前的sql,已经在history里的sql表明已经
在现场执行过或已经升级到基础库了,修改的话会给其他项目造成影响或造成已执行过该sql的项目的sql版本不一致问题。
4.改变表结构的sql应该放到s00_current下面,修复数据的sql放相应所属项目的current下面,如果需要设置默认值,需要考虑s00_current中的设置不能影响其它项目的执行。
分享到:
相关推荐
"阿里前端开发规范" 阿里前端开发规范是阿里巴巴集团为其前端开发者所制定的开发规范,旨在提高开发效率、代码质量和团队协作。该规范涵盖了前端开发的各个方面,包括命名规范、HTML 规范、CSS 规范等。 命名规范 ...
阿里巴巴前端开发规范.docx 阿里巴巴前端开发规范是阿里巴巴集团为了确保前端开发的质量和统一性而制定的规范。本规范涵盖了前端开发中的多个方面,包括命名规范、HTML 规范、CSS 规范等。 命名规范 命名规范是...
Vue前端开发规范 一、前端开发规范的重要性 在前端开发过程中,遵循规范是至关重要的。它不仅影响代码的维护和理解成本,而且在团队协作中至关重要。规范的目的是统一团队的代码风格,提高代码的可读性和降低维护...
Java后端开发规范是指导Java开发者遵循的一套标准和最佳实践,旨在提高代码质量、可维护性、可扩展性和团队协作效率。这份"java后端开发规范word文档"包含了多个方面的内容,包括但不限于编程风格、命名规则、异常...
为了促进规范的普及,阿里巴巴还发布了配套的Java开发规约IDE插件和代码规约扫描引擎,并出版了详解图书《码出高效》,通过各种渠道和形式帮助开发者学习和遵循开发规范。值得一提的是,手册中所获得的收入都捐赠给...
【Hive 开发规范】 Hive 是一个基于 Hadoop 的数据仓库工具,它允许通过类 SQL 的查询语言(HQL)来访问存储在 HDFS 上的大数据集。以下是一些常用的 Hive 开发规范: 1. **数据开发规范** - **Hive 数据目录...
《腾讯PHP开发规范v1.0》是一份由腾讯科技(深圳)有限公司制定的、针对PHP编程语言的开发规范文档,旨在提升代码质量和团队协作效率。这份规范详细规定了从项目结构、命名规则到错误处理等多个方面的编程标准,是...
# 前端开发规范手册 此手册主要实现的目标:**代码一致性**和**最佳实践**。通过代码风格的一致性,降低维护代码的成本以及改善多人协作的效率。同时遵守最佳实践,确保页面性能得到最佳优化和高效的代码。 此...
阿里开发规范插件,全称为P3C(Alibaba Java Coding Guidelines)插件,是阿里巴巴为提高代码质量和一致性而制定的一套编码规范。这个插件主要用于集成开发环境Eclipse,帮助开发者在编码过程中实时检查代码是否符合...
### 数据库设计开发规范知识点概览 #### 一、数据库设计开发规范概述 《数据库设计开发规范-阿里.pdf》是一份由阿里巴巴云数据库服务部门编制的技术文档,旨在为数据库设计和开发提供一套全面且规范化的指导原则。...
医保信息系统安全开发规范。本规范用于规范和统一医疗保障信息系统生命周期各阶段(包括:安全需求分析、系统安全设计、 系统开发安全、系统安全测试和系统部署上线等阶段)需执行的安全控制及安全任务,明确系统...
### C# Winform应用程序开发规范知识点详述 #### 一、引言 在现代软件开发领域,用户体验(User Experience, UX)变得越来越重要。对于基于Windows平台的应用程序来说,使用C#结合Winform进行开发是一种常见且高效...
在软件开发过程中,遵循一套统一的开发规范至关重要。这不仅有助于提高代码质量,减少错误,还能提高团队协作效率。本文将深入探讨“代码开发规范”和“团队开发规范”,主要针对C#和VB.NET编程语言,同时也会涉及...
### Web程序开发规范详解 #### 一、引言 在软件工程领域,开发规范的建立对于确保代码质量、提升团队协作效率以及维护系统的稳定性和可扩展性至关重要。本文基于一份详细的web程序开发规范文档,深入解析其中的...
Web 前端开发规范手册 摘要:本手册旨在提高团队协作效率、便于后台人员添加功能及前端后期优化维护,输出高质量的文档。本手册涵盖了文件规范、CSS 书写规范、html 书写规范、JavaScript 书写规范、图片规范、注释...
参考阿里巴巴开发规范整理
阿里前端开发规范是阿里巴巴集团为前端工程师制定的一套标准指南,旨在提高代码质量,提升团队协作效率,确保项目稳定性和可维护性。这份规范涵盖了命名规范、代码结构、注释规则、性能优化、错误处理等多个方面,...
### 阿里巴巴Java开发规范精要解读 #### 一、编程规约 ##### (一) 命名规约 **强制规定**:所有代码中的命名均不能以下划线`_`或美元符号`$`开始或结束。例如,`_name`、`__name`、`$Object`、`name_`、`name$`、...