带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(2)https://developer.aliyun.com/article/1339988?groupCode=taobaotech
代码层次
- Client层:对外的接口,DTO,Enum等等,是最轻量的包,所有层都可以依赖client,client不应该依赖任何其他层;
- Adaptor层:负责对外系统的适配,Controller,HSF,MTOP接口实现都属于这一层;
- Application层:Application按照业务场景进行组织,主要负责交互参数的处理(入参校验,出参错误信息转 换),领域逻辑的组织编排;
- Domain层:封装了核心的业务逻辑,通过领域服务DomainService和领域对象DomainEntity对外提供业务实体对象和计算逻辑。
- Infrastructure层:负责外部依赖引入,数据库,外部hsf依赖,cache,mq等等。同时也是领域层与外部系统的防腐层(Anti-Corruption-Layer)。
新老分层对比
两者其实非常相似,核心区别在于业务逻辑层新增了领域和应用层,进行了更细化的职责划分。
异常处理
- Java 类库中定义的可以通过预检查方式规避的RuntimeException异常不应该通过catch 的方式来处理,比如:NullPointerException,IndexOutOfBoundsException等等。说明:无法通过预检查的异常除外,比 如,在解析字符串形式的数字时,可能数字格式错误,不得不通过catch NumberFormatException来实现。正例:if (obj != null) {...}反例:try { obj.method() } catch (NullPointerException e) {…}
- 异常捕获后不要用来做流程控制,条件控制。说明:异常设计的初衷是解决程序运行中的各种意外情况,且异常的处理效率比条件判断方式要低很多。
- catch时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的catch尽可能进行区分异常类型,再做对应的异常处理。说明:对大段代码进行try-catch,使程序无法根据不同的异常做出正确的应激反应,也不利于定位问题,这是一种不负责任的表现。正例:用户注册的场景中,如果用户输入非法字符,或用户名称已存在,或输入密码过于简单,在程序上作出分门别类的判断,并提示给用户。
- 捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。
- 事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。
- finally块必须对资源对象、流对象进行关闭,有异常也要做try- catch。说明:如果JDK7 ,可以使用 try-with-resources方式。
- 不要在finally块中使用return。说明:try块中的return语句执行成功后,并不马上返回,而是继续执行finally块中的语句,如果此处存在return语句,则在此直接返回,无情丢弃掉try块中的返回点。
反例:
private int x = 0; public int checkReturn() { try { // x等于1,此处不返回 return ++x; } finally { // 返回的结果是2 return ++x; } }
- 捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类。说明:如果预期对方抛的是绣球,实际接到的是铅球,就会产生意外情况。
- 方法的返回值可以为null,不强制返回空集合,或者空对象等,必须添加注释充分说明什么情况下会返回null值。说明:本规约明确防止NPE是调用者的责任。即使被调用方法返回空集合或者空对象,对调用者来说,也并非高枕无忧,必须考虑到远程调用失败,运行时异常等场景返回null的情况。
- 防止NPE,是程序员的基本修养,注意NPE产生的场景:
1) 返回类型为基本数据类型,return包装数据类型的对象时,自动拆箱有可能产生NPE。 反例:public int f(){ return Integer对象},如果为null,自动解箱抛NPE。 2) 数据库的查询结果可能为null。 3) 集合里的元素即使isNotEmpty,取出的数据元素也可能为null。 4) 远程调用返回对象时,一律要求空指针判断,防止NPE。 5) 对于session中获取的数据,建议进行NPE检查,避免空指针。 6) 级联调用obj.getA().getB ().getC();易产生NPE。
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(4)https://developer.aliyun.com/article/1339986?groupCode=taobaotech