【肥朝】编码不规范,同事究竟几行泪?

前言

案发现场

咱们在Dubbo中定义一个接口,这个接口采用上方说的欺骗性的命名方式,这个getFeiChaoInfo()中并无返回值。java

好了,而后咱们将这个服务暴露,而后启动。按照肥朝以前的观念,命名不规范,无非是理解起来恶心了点,可是跑仍是能跑的。结果一启动框架

以前看过我Dubbo源码解析的同窗,对这个服务暴露再熟悉不过了,根据异常栈,咱们很快定位到了关键位置。工具

就算你连Dubbo都没用过也不要紧,其实你从javassistCannotCompileException这两个关键词就能猜到异常的缘由。javassist经常使用于操做字节码,CannotCompileException根据我小学三年级的英语都知道是没法编译异常。那为何出现没办法编译经过呢?咱们把这段Dubbo拼接出来,准备要用javassist进行编译的代码格式化一下就一目了然了性能

格式化后就很明显能够看出,getFeiChaoInfo()这个方法没有返回值是编译不过去的。那么这个时候有同窗就想说了,Dubbo这段拼接代码进行编译的逻辑有bug啊。鉴于公众号目前有小部分粉丝没用过Dubbo,咱们先不讨论Dubbo为何要这么作,咱们检讨一下本身,你这种欺骗性的方法名自己就有问题,再者,就算Dubbo把这个代码的容错性作好了又如何,你这种不规范的编码习惯,就算成功,也是偶然成功!,不信?肥朝带你再看一个案发现场。测试

又一块儿案发现场

在项目中,咱们常常会遇到DTO、BO、DO等转换的问题,不少同窗用的是Apache或者Spring的BeanUtils来作copy,咱们来一组性能测试ui

场景 耗时(1000000次调用) 原理
get/set方法 22ms 直接调用
使用BeanCopiers 22ms 基于cglib,修改字节码
使用BeanUtils 12983ms 反射
使用PropertyUtils 3922ms 反射

另外肥朝给你们总结了一条结论编码

凡是和反射相关的操做,基本都是低性能的。凡是和字节码相关的操做,基本都是高性能的。spa

因而可知,在各类POJO间转化,最高性能的确定是直接操做get/set,可是这样写,确定不够优雅。从性能报告明显看出较优方案是使用cglib的BeanCopiersBeanCopiers怎么使用这个本身搜索一下就知道了,那么咱们再来看一块儿案发现场。为了使用建造者模式,咱们有同事这么作3d

好了。而后跑一个简单的democode

看到有异常一些同窗就慌了,就产生了这个东西虽然性能高,可是感受好像不稳定的样子错觉。其实并非这东西不稳定,关键仍是在于你会不会用。再说了,世界天天都在变,除了肥朝会稳定给你们输出原创以外,还有什么是稳定的呢?为此,肥朝给你们总结了如下几点使用上的常识

1.当源类和目标类的属性名称、类型都相同,拷贝结果棒棒哒。

2.当源对象和目标对象的属性名称相同、类型不一样,那么名称相同而类型不一样的属性不会被拷贝。另外注意,原始类型(int,short,char)和 他们的包装类型,在这里都被当成了不一样类型。所以不会被拷贝。

3.源类或目标类的setter比getter少,拷贝没问题,此时setter多余,可是不会报错。

4.源类和目标类有相同的属性(二者的getter都存在),可是目标类的setter不存在,此时会抛出NullPointerException

关键是咱们目标类FeiChaoBO的setter方法是存在的啊,那为何还会出现这个异常?很明显,正常的set方法都是void的。然而这个案例中,set方法设置了返回值,存在必定的欺骗性。并且就算要用建造者模式也不是这么用的,再退一万步说,建造者模式通常也是build命名而不是改set方法。

你再注意观察一下这两个案发现场,有没有发现一些共同的特色?javassistcglib,这两个框架最擅长的就是操做字节码,因此他们对setget,都和如白纸版清纯的肥朝同样,很是的敏感!因此建议老司机也不要随便乱动。

另外,据肥朝了解到,这个cglib的这个bug在3.1之后的版本是修复了的,可是3.1版本,目前使用的基数仍是很大

拓展思考

看过肥朝文章的粉丝都知道,肥朝反复强调要通过深度思考,开发中咱们有无数的坑,不可能所有踩完的,关键是要通过一个坑,深度思考,提升编码意识!所以,按照老套路,看看根据此次经验,咱们试着再压榨出一些有效信息。

好比阿里开发手册提到了,getter和setter方法中,不要增长逻辑。由于你们意识里面的getter和setter就是正常的获取属性,你若是加上了必定的逻辑,从必定程度上说,也存在欺骗性.

咱们再继续压榨,布尔类型的get方法有些工具会生成isXXX,这个其实也是有坑的,固然也不排除你项目正在处于肥朝口中的偶然成功状态。

因而可知,取名是一个很大的学问,规范的命名是很是重要的,好比肥朝这么见名知意的名字,明显是通过深度思考得来的。有时候我真的很羡慕你们,天天都有这么多丰富多彩的故事,不像我,一个简简单单的”肥“字居然就贯穿了一辈子!

写在最后

本文仅为冰山一角,上百篇原创干货还在路上扫描下面二维码关注肥朝,让天生就该造火箭的你,再也不委屈拧螺丝!

相关文章
相关标签/搜索