案发现场

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

好了,然后我们将这个服务暴露,然后启动。按照肥朝之前的观念,命名不规范,无非是理解起来恶心了点,但是跑还是能跑的。结果一启动

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

就算你连Dubbo都没用过也没关系,其实你从javassist和CannotCompileException这两个关键词就能猜到异常的原因。javassist常用于操作字节码,CannotCompileException根据我小学三年级的英语都知道是无法编译异常。那为什么出现没办法编译通过呢?我们把这段Dubbo拼接出来,准备要用javassist进行编译的代码格式化一下就一目了然了

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

又一起案发现场

在项目中,我们经常会遇到DTO、BO、DO等转换的问题,很多同学用的是Apache或者Spring的BeanUtils来做copy,我们来一组性能测试

另外肥朝给大家总结了一条结论

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

由此可见,在各种POJO间转化,最高性能的肯定是直接操作get/set,但是这样写,肯定不够优雅。从性能报告明显看出较优方案是使用cglib的BeanCopiers。BeanCopiers怎么使用这个自己搜索一下就知道了,那么我们再来看一起案发现场。为了使用建造者模式,我们有同事这么做

好了。然后跑一个简单的demo

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

1.当源类和目标类的属性名称、类型都相同,拷贝结果棒棒哒。
2.当源对象和目标对象的属性名称相同、类型不同,那么名称相同而类型不同的属性不会被拷贝。另外注意,原始类型(int,short,char)和 他们的包装类型,在这里都被当成了不同类型。因此不会被拷贝。
3.源类或目标类的setter比getter少,拷贝没问题,此时setter多余,但是不会报错。
4.源类和目标类有相同的属性(两者的getter都存在),但是目标类的setter不存在,此时会抛出NullPointerException

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

你再注意观察一下这两个案发现场,有没有发现一些共同的特点?javassist和cglib,这两个框架最擅长的就是操作字节码,所以他们对set和get,都和如白纸版清纯的肥朝一样,非常的敏感!所以建议老司机也不要随便乱动。

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

拓展思考

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

比如阿里开发手册提到了,getter和setter方法中,不要增加逻辑。因为大家意识里面的getter和setter就是正常的获取属性,你如果加上了一定的逻辑,从一定程度上说,也存在欺骗性。

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

由此可见,取名是一个很大的学问,规范的命名是非常重要的,比如肥朝这么见名知意又时尚的名字,明显是经过深度思考得来的。有时候我真的很羡慕大家,每天都有这么多丰富多彩的故事,不像我,一个简简单单的“肥”字竟然就贯穿了一生!

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:787707172,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

改编码格式_编码不规范,同事真的会两行泪?相关推荐

  1. 编码不规范,同事真的会两行泪?

    2019独角兽企业重金招聘Python工程师标准>>> 案发现场 我们在Dubbo中定义一个接口,这个接口采用上方说的欺骗性的命名方式,这个getFeiChaoInfo()中并没有返 ...

  2. 2021-02-21 代码不规范,运维两行泪 代码规范

    代码不规范,运维两行泪 编程江湖中一直盛传着一个段子,那就是要问程序员最讨厌哪 4 件事?那必须是:写注释.写文档.别人不写注释.别人不写文档. 动手写代码前尽量做到心中有数,思考清楚代码框架结构.现 ...

  3. 开发编码格式_编码和游戏开发

    开发编码格式 As a game enthusiast and a beginner programmer, I always wonder what it would be like to deve ...

  4. “编程不规范,同事两行泪!”

    [编者按]编程江湖中一直盛传着一个段子,那就是要问程序员最讨厌哪 4 件事?那必须是: 写注释.写文档.别人不写注释.别人不写文档. 更甚者,在<流浪地球>形成刷屏之势之后,仿其而出的&q ...

  5. AndroidStudio_Base64图片的解码_编码_要注意的地方---Android原生开发工作笔记223

    Base64图片的解码_编码,方法很多,网上也一大堆.但是要注意: 比如下面: data:image/jpg;base64,/9j/4AEKW0lEOjEzODUwLGV2dDowXQpbc2Nlbm ...

  6. idea findbugs使用_IDEA如何协同开发统一代码风格?编码不规范如何解决?

    作为一个开发程序员最根本的是什么? 最基础的是代码编写 如何编写高质量,可靠的,规范的代码,是作为一名合格程序员的基础和根本 阿里被称为互联网界的黄埔军校, <阿里巴巴 java 开发手册> ...

  7. Python花呗分析模型温馨提醒:支出不规范,收入两行泪

    全世界只有3.14 % 的人关注了 数据与算法之美 春节结束,离开家里混吃混喝的怀抱,我又开始了用花呗.还花呗的无限循环. 花呗给人一种"有钱"的感觉,我不禁思考:像我这种发工资前 ...

  8. 笑话:工作千万条,抬杠第一条。同事不抬杠,感动两行泪

    不知道别人的感受怎样,每次同事遇到问题,让他怎么办,不管多么的明白和正确,结果都是不听.于是吾就改造了一下: 工作千万条,抬杠第一条. 同事不抬杠,感动两行泪.

  9. sql server修改字段编码格式_关于MySQL如何修改character_set_client的编码问题

    问题引入: 我们经常会遇到一些向MySQL数据库中插入中文,但是select出来的时候,却发现是乱码的情况.如我们向表a出入这样一段记录:i insert into a values('你好hello ...

最新文章

  1. 紘康单片机_紘康HY11P14 - SOC芯片 - 产品展示 - SOC芯片_IC芯片pcba开发_深圳市联泰威电子有限公司...
  2. Latex使用简单总结
  3. js弹框带传值父窗口给子框_JavaScript实现弹出子窗口并传值给父窗口
  4. 15.PHP_PHP与Ajax
  5. 操作系统的功能和特征
  6. 解决mac osx下pip安装ipython权限的问题
  7. 人工智能 | 元学习与图神经网络逻辑推导与理解
  8. STM32F103:一.(4)JWAG功能IO复用
  9. VUE 全局监听sessionStorage变化
  10. Vue的批量更新原理
  11. mysql5.7版本的新特性_MySQL 5.7版本新特性(一)
  12. 偶遇拍外景的小姐姐们
  13. Linux学习第一篇之Linux系统安装——系统分区
  14. 数据结构与算法分析Java版pdf
  15. 发动机电控系统:T3温度模型标定
  16. 我对锤子ROM 功能的看法——功能篇
  17. 制作一款精美的 Qt IFW 安装程序
  18. 信息学奥赛一本通:1183:病人排队
  19. gitee提交代码到仓库
  20. 启动修复无法修复计算机win10,win10系统使用“sfc /scannow”修复系统提示Windows资源保护无法启动修复服务怎么办...

热门文章

  1. variable ‘‘ of type ‘‘ referenced from scope ‘‘, but it is not defined 异常解决方法
  2. Eclipse的设置、调优、使用(解决启动卡顿等问题)----转
  3. Win7上防火墙开放FTP服务以及ping解决方案
  4. PL/SQL中查询Oracle大数(17位以上)时显示科学计数法的解决方法
  5. 小程序不支持wx.request同步请求解决方法
  6. 如何在Django中以GROUP BY查询?
  7. 无限的Bash历史[关闭]
  8. 如何使Git“忘记”已跟踪但现在位于.gitignore中的文件?
  9. #脱贫攻坚#彭蕾卸任蚂蚁金服后首次现身:女性脱贫亮三招
  10. HACKER'S DELIGHT[算法心得]笔记