带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(3)

简介: 带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(3)

带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(2)https://developer.aliyun.com/article/1339988?groupCode=taobaotech 

image.png代码层次

image.png

 

 

 

  1. Client层:对外的接口,DTO,Enum等等,是最轻量的包,所有层都可以依赖client,client不应该依赖任何其他层;
  2. Adaptor层:负责对外系统的适配,Controller,HSF,MTOP接口实现都属于这一层;
  3. Application层:Application按照业务场景进行组织,主要负责交互参数的处理(入参校验,出参错误信息转  换),领域逻辑的组织编排;
  4. Domain:封装了核心的业务逻辑,通过领域服务DomainService和领域对象DomainEntity对外提供业务实体对象和计算逻辑。
  5. Infrastructure层:负责外部依赖引入,数据库,外部hsf依赖,cache,mq等等。同时也是领域层与外部系统的防腐层(Anti-Corruption-Layer)。

 

image.png新老分层对比

两者其实非常相似,核心区别在于业务逻辑层新增了领域和应用层,进行了更细化的职责划分。

image.png

异常处理

 

  1. Java  类库中定义的可以通过预检查方式规避的RuntimeException异常不应该通过catch   的方式来处理,比如:NullPointerException,IndexOutOfBoundsException等等。说明:无法通过预检查的异常除外,比  如,在解析字符串形式的数字时,可能数字格式错误,不得不通过catch  NumberFormatException来实现。正例:if (obj != null) {...}反例:try { obj.method() } catch (NullPointerException e) {…}
  2. 异常捕获后不要用来做流程控制,条件控制。说明:异常设计的初衷是解决程序运行中的各种意外情况,且异常的处理效率比条件判断方式要低很多。

 

 

 

  1. catch时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的catch尽可能进行区分异常类型,再做对应的异常处理。说明:对大段代码进行try-catch,使程序无法根据不同的异常做出正确的应激反应,也不利于定位问题,这是一种不负责任的表现。正例:用户注册的场景中,如果用户输入非法字符,或用户名称已存在,或输入密码过于简单,在程序上作出分门别类的判断,并提示给用户。
  2. 捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。
  3. 事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。
  4. finally块必须对资源对象、流对象进行关闭,有异常也要做try- catch。说明:如果JDK7 ,可以使用 try-with-resources方式。
  5. 不要在finally块中使用return。说明:try块中的return语句执行成功后,并不马上返回,而是继续执行finally块中的语句,如果此处存在return语句,则在此直接返回,无情丢弃掉try块中的返回点。

反例:

 

private int x = 0;
public int checkReturn() {
try {
// x等于1,此处不返回
return ++x;
} finally {
// 返回的结果是2
return ++x;
  }
  }

 

 

  1. 捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类。说明:如果预期对方抛的是绣球,实际接到的是铅球,就会产生意外情况。
  2. 方法的返回值可以为null,不强制返回空集合,或者空对象等,必须添加注释充分说明什么情况下会返回null值。说明:本规约明确防止NPE是调用者的责任。即使被调用方法返回空集合或者空对象,对调用者来说,也并非高枕无忧,必须考虑到远程调用失败,运行时异常等场景返回null的情况。
  3. 防止NPE,是程序员的基本修养,注意NPE产生的场景:

1) 返回类型为基本数据类型,return包装数据类型的对象时,自动拆箱有可能产生NPE。   反例:public int f(){ return Integer对象},如果为null,自动解箱抛NPE2) 数据库的查询结果可能为null3) 集合里的元素即使isNotEmpty,取出的数据元素也可能为null4) 远程调用返回对象时,一律要求空指针判断,防止NPE5) 对于session中获取的数据,建议进行NPE检查,避免空指针。 6) 级联调用obj.getA().getB ().getC();易产生NPE。

 

 

带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(4)https://developer.aliyun.com/article/1339986?groupCode=taobaotech

相关文章
|
5月前
|
存储 编解码 安全
阿里云服务器8核16G、8核32G、8核64G最新实例收费标准与活动价格参考
阿里云服务器8核16G、8核32G、8核64G属于较高的配置,是中大型企业用户在选择配置时选择较多的,在阿里云目前的活动中,第9代云服务器有这几个配置可选,其中计算型c9i实例8核16G配置5958.52元1年起,通用型g9i实例8核32G配置7551.94元1年起,内存型r9i实例8核64G配置9937.12元1年起领取阿里云优惠券之后可获满减优惠。本文将详细介绍阿里云这几款配置不同实例规格的收费标准与当下的活动价格,以供参考选择。
1112 17
|
6月前
|
数据采集 人工智能 分布式计算
只靠国产算力与开源数据,端侧模型预训练行不行?我们做到了全流程开源
鹏城实验室与清华联合发布全流程开源大模型“开元-2B”,基于国产算力实现高效端侧训练。涵盖数据、代码、训练框架与技术报告,推动开放AI生态发展。
433 1
|
6月前
|
传感器 算法 安全
智慧养老新趋势:护理机器人关键技术解析与主流产品评测
随着老龄化加剧,养老机器人成缓解照护压力的重要方案。融合SLAM导航、多模态感知与大模型交互技术,实现跌倒检测、健康监测与适老交互。猎户星空、优必选、新松、美的、傅利叶等企业推动居家、机构与康复场景落地,产品向精准、智能、专业化发展。(238字)
654 2
|
6月前
|
JSON 算法 Shell
实测腾讯混元HY-World 1.5:虚拟世界的推理实战
腾讯混元HY-World 1.5发布,全球首个开源、实时交互且具长时几何一致性的3D世界模型。支持24帧/秒流式生成,适用于虚拟拍摄、仿真合成等场景。提供双向、自回归及蒸馏模型,兼顾质量与速度。现已开放GitHub、Hugging Face及Lab4AI一键体验平台,助力创作者构建沉浸式虚拟世界。
411 0
|
7月前
|
人工智能 架构师 微服务
Prompt Engineering 的艺术:让 AI 听懂“人话”
Prompt Engineering 的艺术:让 AI 听懂“人话”
529 4
|
8月前
|
分布式计算 并行计算 算法
《数据之美》:图结构的精妙世界与算法实践
图是表示多对多关系的非线性数据结构,由顶点和边组成,可建模社交网络、路径导航等复杂系统。核心算法包括BFS/DFS遍历、Dijkstra最短路径、Floyd-Warshall全源最短路径,以及Prim和Kruskal最小生成树算法,广泛应用于推荐系统、社交分析与路径规划。
|
7月前
|
人工智能 自然语言处理 调度
数字人|数字人平台重点推荐与选择指南
数字人企业正引领虚拟与现实融合新潮流。像衍科技、灵眸数字、幻界科技三大标杆,以全栈技术、AI交互与元宇宙布局驱动产业升级,覆盖影视、电商、教育等场景,推动数字人从技术突破迈向规模化应用,开启数字经济新篇章。(238字)
|
传感器 机器学习/深度学习 人工智能
仿生机器人:自然界灵感的工程应用
【10月更文挑战第14天】仿生机器人作为自然界灵感与工程技术的完美结合,正逐步改变着我们的生活和工作方式。通过深入了解其设计原理、关键技术、应用领域以及未来的发展趋势,我们可以更加清晰地看到仿生机器人在推动科技创新和社会发展中的重要作用。让我们共同期待仿生机器人在未来带来的更多惊喜和变革!
1031 1
|
数据采集 弹性计算 运维
阿里云付费模式介绍:节省计划、预留实例券、抢占式实例区别及选择参考
在我们购买阿里云服务器时,可选的付费模式有包年包月、按量付费、节省计划、预留实例券和抢占式5种付费模式,满足长周期低成本以及短周期高弹性的计算要求,一般用户选择最多的是包年包月和按量付费,包年包月购买适合长期稳定的业务,购买周期越长,折扣越高,按量付费购买紧贴业务需求购买资源的付费方式,秒级计费,用多少花多少。本文主要为大家介绍节省计划、预留实例券、抢占式实例三种付费模式,以供参考。