文档章节

代码最佳实践总结30条

_江左梅郎_
 _江左梅郎_
发布于 2015/11/24 17:35
字数 1788
阅读 11
收藏 0

1:对于不可以为空的对象,尽早返回,且打出错误日志.

    a:直观,易读,容易查找错误

    b:不会往下执行 能节约很多时间性能上的消耗

    c:不会引起一些未知性异常

2:对于接口返回 ,还是需要返回原生对象,而不是跟某个协议耦合.

   a:按照之前的逻辑使用PB返回,那么dubbo使用不了,其他的框架也是使用不了的

   b:如果把PB传到service里面,就会引起了很多跟业务逻辑不相关的一些代码,比如PB的封装.就会造成很混乱

  c:好处就是PB比较轻,但是因为 我们的service和web几乎都是局域网 ,所以不用考虑 加密  和体积大小问题 ,所以不管怎么样  还是传输java原生对象比较好

3: 对于接口返回CommonResponse,我个人觉得 也还是没有必要 

   a:一旦service返回这个CommonResponse,那么到了controller又要取出来做一些别的显示转换功能,这个类似java的封箱和拆箱了

   b:对于调用方来说,  根本不能直观的获得 CommonResponse里面的对象到底是什么,如果嵌套很深的话,更加难找,再如果使用了反射的话,那就更加不知道了

4: 对于接口返回HashMap,我个人认为弊端比较多

    a:hashMap返回的值,没人能清楚地知道 有多少,他们都是什么意思

   b:一旦我们去获取的时候就会存在 ,写错key?

    c: 查找出来为空的判断 各自强制类型转换 ?

   d:

5: 对于接口返回List<Object>或者Object,也是有很多弊端的

   a:对于接口返回这样的类型,那么调用方  看到这个方法应该怎么办,怎么用?

   b:这样的接口类型 ,最好还是应该使用泛型 ,对于自己写代码的时候也会尽快发现错误.

6:对于接口的返回处理,如果执行成功了,就直接默认成功,不处理, 如果失败了就会有异常机制往外抛出去

   a:之前看到很多接口 ,在每个if else 里面,如果成功就返回 CommonResponse  Success,其实这个是没有必要的,比如一百个if else 就写了一百遍 ,默认成功之后 统一处理

   b:而且失败了 最好不要返回错误 ,直接抛出业务异常 ,不然 根本无法定位错误 

7:对于异常的处理

   a:一些不重要的,比如订单流程 发邮件失败  可以catch住 ,因为这个不能影响主流程

   b:但是对于主流程的异常还是需要一步步往外面抛出去,之前看到很多异常被catch,住了   但是又没有往外面抛  

   c:所以现在对于异常得处理,如果是业务异常或者不是必须catch住的就直接抛出去, 如果是那些读文件的。就可以先catch住,然后关闭流,再抛出去

   d:这样的异常最后都会到一个统一的出口 。做同一转换 

8:对于多个地方出现的一样的字符串,最好还是同意使用常量来管理 

9:对于接口的定义,能一个方法搞定的最好 一个方法搞定  直接传输对象进去

    a:比如一个修改订单的状态,价格,时间等等的方法 就在Service写了3个. 其实这个应该在controller来控制,不然方法也是会指数级别增长

    b:

10:对于业务逻辑复杂的方法,应该尽量抽出小方法,减少if else , 比如之前订单的一个方法  300 多行 if  else 里面夹带了发短信  发邮件  发微信模板

11: 对于if  else 比较多的业务  不仅仅要独立小方法  而且要减少if else   比如 订单的各种状态  发不同的消息   我们 可以把他放到统一hashMap 里面 

根据不同状态获取不同信息   且时间复杂度为1

12:有些业务逻辑删除关联关系有外键关联,导致删除不掉.应该抛出业务异常

13::还是要把核心service写成一个独立的方法,不然app和web很难维护

14:pb的转换写成功一个单独的pbConvert. 写成模板模式比较好理解,而且不容易出错,能复用

15:工具类最好先统一,多用工具类好维护,bug少

16 最好传值得时候使用封装类型,这样就不会有默认值,如果是空,就是没有传。所以在接受前端参数的时候,最好用封装类型,

而在比较大小,或者存redis的key 的时候必须用原始类型 否则 会获得错误的结果   因为封装类型值相等 但是对象不等

17:最好每个方法还是需要写一下junit单元测试,这样会减少bug和以后容易找问题

18;注意一些性能的小优化,今天一个改变订单状态的接口超时了,想想应该把发邮件和发短信等等的写成异步发送

19:代码里面尽量减少循环,特别是双重循环(现在还有很多3重循环),可以把他放到hashmap里面。

20:logback看看怎么优化比较好  按照每天的日志文件  每天又分为info  sql error等等

21:在每个比较关键的代码的执行点,最好都带一个log,这样能更好的查找问题

22:对于check的方法,比如checktoken  最好是只返回true false。如果类型比较多,就返回枚举类型。或者采用异常机制(各种 返回 1  2  3  4 5 6 简直看不懂)

23:是否有必要分 bo vo po,dto等等类型转换

vo :这个是web层,请求的参数, 这个对象,专门用来接收参数,以及判断字段的正确性

dto:这个专门用来做对象传输用 , 因为请求的参数和最终存入数据库的 是不同的 ,且查询数据库出来的时候  还会冗余很多查询信息

po:这个专门跟数据库字段一一对应, ORM对应存入数据库的 

24:对于分层思想  Service层之间尽量不要去调用别的层的dao   比如 orderService 里面有userDao,而且controller里面更加不能调用userDao

25 对于每个接口实现  最后返回 对象  而不是NULL  (effect in java),比如 list   返回一个长度为0的arraylist.

26:能在controller判断的就尽早返回  减少远程调用

27:远程调研可以写批量接口 

28 越简单的验证放在前面   这样后面的验证可以减少,能尽早返回


© 著作权归作者所有

上一篇: 关于循环依赖
下一篇: linux 防火墙
_江左梅郎_
粉丝 0
博文 6
码字总数 5420
作品 0
深圳
私信 提问
阿里云CDN Tengine开源技术沙龙-上海站

活动议程 13:30-14:10,Tengine-CDN QUIC实践总结,泓晔 14:10-14:50,Tengine TLSv1.3 最佳实践,金九 14:50-15:30,Tengine直播最佳实践,建市 15:30-16:30,Tengine 开源介绍与互...

我是王雪梨
2018/08/20
159
1
阿里云CDN Tengine开源技术沙龙-上海站

活动议程 13:30-14:10,Tengine-CDN QUIC实践总结,泓晔 14:10-14:50,Tengine TLSv1.3 最佳实践,金九 14:50-15:30,Tengine直播最佳实践,建市 15:30-16:30,Tengine 开源介绍与互...

我是王雪梨
2018/08/20
90
1
如果你在找 CSS 学习资源,那就收藏这篇文章

本文由伯乐在线 -伯小乐 翻译。未经许可,禁止转载! 英文出处:Grace Smith。欢迎加入翻译组。 如果你在寻找一些 CSS 基础和高级的指南或资源,那这篇文章应该有你要的 CSS 初级和高级指南:...

伯乐在线
2014/11/07
0
0
C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较

使用Task,await,async,异步执行事件(event),不阻塞UI线程和不跨线程执行UI更新   使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和不夸跨线程执行UI更新报错的最佳实...

JasNature
2018/08/13
0
0
开发效率低下?造成代码难以维护的 35 个恶习

《人月神话》出版以来,IT行业的科技公司们一直苦苦追寻传说中以一当十的超级程序员,最新的研究表明确实存在这样一小撮效率奇高的“程序金刚”,但是一位普通程序猿如何能够蜕变成代码金刚呢...

局长
2017/05/22
5.8K
9

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
5
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部