代码最佳实践总结30条

原创
2015/11/24 17:35
阅读数 32

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 越简单的验证放在前面   这样后面的验证可以减少,能尽早返回


展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部