在某公司实习过程中,参与了支付系统重构的一个小需求中,做一个业务操作编码的管理后台,比较简单,但是也遇到了很多问题,在此做一个总结
1 ddd架构
组内推崇ddd的设计架构,之前都是用的controller-service-dao-po的架构,初涉及ddd的时候满头雾水,经过一段时间的学习之后,发现之前用的那种架构,开发简单的增删改查很容易,但是涉及到复杂的业务逻辑后,service或者controller就会越来越复杂,原因就是:之前设计的po都是从数据库中,对应的表结构照搬过来的,很多实际的情况没有考虑到,所以越实际的需求逻辑就越复杂,而ddd架构根据实际情况设计实体,可能对于简单的问题有些复杂,但是对于复杂的模型,就会比之前简单,可以参考https://www.jdon.com/ddd.html总结ddd架构的特点如下:
ddd(领域驱动设计)分为4大层:
- 展示层:对外暴露的接口,即接口调用者调用的接口
- 应用层(application):用于连接展示层和领域层,用我们组长的话说就是,它只为领域层中的领域对象协调任务,分配工作,使它们互相协作。
- 领域层(domain):关键,是系统的重点,包含了项目所涉及的所有实体(有唯一标识)和值对象(无唯一标识)、领域服务 和他们之间的关系。
- 基础设施层(infrastructure):他向其他三层提供一些基础,比如数据库,等
结合实习项目来说,细分大概分为:
展示层(iface):包括DTO(传输数据),API(暴露的接口)
应用层(application):包括API的实现类(APIImpl,不提供复杂的逻辑,将任务分给各领域服务或者实体仓库),和assembler(将实体包装成DTO)
领域层(domain):实体(Entity),值对象(ValueObject),仓库(repository,一般单独列出)
基础设施层(infrastructure):配置文件
仓库(repository):dao,各个实体的仓库和其实现类,与数据库交流的载体Po,query等
服务层(service):将各个任务再细分,分给各个仓库和领域服务
2 soa调用
即怎么调用其他项目的接口,公司用自己的jar包,但我感觉是基于zookeeper的一个集成版,
3批量插入sql
https://www.cnblogs.com/dingxu/p/9151810.html
4 builder模式
当一个类有很多个属性的时候,假如一个person类有7个属性,初始化时需要调用7次setter方法来完成赋值,麻烦,而且状态不连续,这种方式时先创建对象,后完成赋值,用户不知道什么时候的对象是完整的,有可能此时的对象只有几个属性的值。
为什么不要有参的构造函数呢?还是因为如果参数过多,参数的顺序就很难记了,不优雅
5map按value排序
hashMap的排序,升序
注意:1,最后遍历的要是list哦,map本身没有排序
2 前大返1升
6 java开发手册学习
编程规约
1代码中的命名均不能以下划线和美元符号开始或者结束
2 代码中的命名不能有拼音!
3 类名用UpperCamelCase风格,但是一下情况例外,DTO,VO,PO之类的
4 方法名,参数名,成员变量,局部变量统一使用lowerCamelCase风格,驼峰格式
5 常量命名全部大写,单词用下划线隔开,不要嫌名字长
6 抽象类名必须用Abstract或者Base开头,异常类命名用Exception结尾,
7 数组的中括号必须和类型紧紧挨着 int[]这样
8 pojo类布尔类型变量前不要加is前缀,部分框架解析会产生序列化的错误(在数据库中表达是否含义的值采用的是is_sss类型,要在resultMap中指定对应的映射关系)
9 包名一律用小写,点分隔符之间有且仅有一个自然语义的英语单词,包名统一使用单数形式,类名如果有复数含义,可以用复数
10 避免有完全相同的命名,降低可读性
11杜绝不规范的缩写,降低可读性
12为了达到代码自带注解的目标,在命名时,尽量使用完整单词的组合来表达他的意思
13 表示类型的词通常放在词的尾部,比如:startTime,nameList等
14接口类中的方法不要加任何的修饰符号,(public也不要加),保持代码的间接性,加javadoc注解最好
15 对于Service和Dao类,基于SOA理念,暴露出来的服务一定是接口,内部的实现类加Impl
16 枚举类名后加Enum,枚举成员全部大写,单词用下划线划开
枚举就是个特殊的类,域成员均为变量,且默认单例(构造方法私有)
17 各层命名规约:
service/dao层:
获得单个对象的方法用get前缀
获得多个对象的方法用list浅醉,复数结尾
获取统计值的方法用count做前缀
插入的方法用save/insert做前缀
删除的方法用remove/delete做前缀
修改的方法用update做前缀
领域模型:
数据对象:DO
数据传输对象:DTO
展示对象:VO
POJO是DO/DTO/BO/VO的统称,禁止命名为POJO
6 小数精确除法
BigDecimal.ROUND_HALF_UP就是四舍五入
ROUND_CEILING 向上舍入
ROUND_DOWN 向0舍入