程序员,你为什么要看源代码?可以搜索吗?

前言

很多人都有一个疑问,为什么喜欢在面试中问原理和源码。但实际工作根本没有使用。也就是面试时常说火箭是造的,螺丝是拧进去的。我身边也有很多朋友问如果不看源码看不懂原理,你怎么解决这个问题?他们给我的答案基本上就是两个字,“搜索”

的确,工作中的大部分问题,都可以通过复制错误信息和搜索来解决。另外,现在的框架越来越多,积木式的编程方式和搜索引擎让越来越多的人产生了开发是件容易的事的错觉。一直想举个例子,搜索时很难找到,看源码才能明白原因。

正好发生在去年八月,我一个非常要好的朋友问我这个问题,他说

为什么我传的是空字符串,但是用Mybatis的if标签判断空字符串== 0其实是成立的

在我们看来,空字符串和数字 0 不能相等。所以我的第一反应是,他是不是用错了?还是他的业务代码干扰了其他地方?所以我决定写一个最简单的demo来测试。如下

那么输出如下:

奇怪的是,这个if标签真的判断空字符串和数字0相等。

我不想在这里骗你。遇到这种问题,坦白说,第一反应当然是不看源码,当然是打开浏览器搜索。我们的搜索主要有两个方向,一个是mybatis if tag的判断原理,一个是为什么mybatis if tag的空字符串等于0。原来我们没有找到我们想要的答案(可以搜索自己)。

虽然我们没有找到满意的答案,但我们找到了另一个例子。

相信你的项目中应该有很多类似这个判断的代码。



在我们平时的开发中,很多同事都喜欢复制粘贴!

那么不假思索地复制粘贴有什么问题源代码有什么用,我们看下面的例子

虽然这个判断是通过复制粘贴穿梭的方式进行的,但是从我们的理解来看,这个对象确实不为null,也不等于空字符串,所以这个判断应该是正确的,但是结果如下:

果然,这颠覆了我们的认知,但是如果遇到情况2,不如去搜索一下,还是可以找到解决办法的,如下图

其实这两种情况都有问题,就是if标签,判断0和空字符串相等。

这时候,我们就要敲黑板画重点了。俗话说,十年被蛇咬,怕绳子。虽然我们有第二个示例的解决方案,但这些解决方案只是临时解决方案。如果你明白了这个道理,那么你的心里总会有一个疙瘩。你害怕下一次,奇怪的事情会发生。只有理解了原理,才能从源头上解决问题,即解决一类问题,而不是某一类问题。

同时我也意识到,当机会来临时,我终于找到了一个更合适的例子来说明为什么要看源码

分析源码

由于链接比较长,这里就不展示调试过程了(如果对Mybatis的执行过程不熟悉,可以看我之前的文章,不要害怕看源码,一张图获取Mybatis的Mapper原理,然后按照执行流程调试)

图片[1]-程序员,你为什么要看源代码?可以搜索吗?-老王博客

我们拿第一个例子来分析,因为这两种情况遇到的问题其实是一样的。

如果你不明白上面的内容,我可以在这里简单描述一下:

首先,他会得到两个判断对象的类型。他在判断字符串和数字的时候,因为类型不同,当Mybatis发现字符串可以转换成数字的时候,就会把这个字符串转换成数字,然后用这个数字来判断。

那么问题来了,这个空字符串会转换成什么数字呢?

来自源代码

return s.length() == 0 ? 0.0D : Double.parseDouble(s);

可以看出这个空字符串会被转换为0。所以现在一切都清楚了。

但是读了源码,问题还是没有解决。他身上其他类型判断的源码那么多,不可能全部看完,时间不允许。如果还有其他坑怎么办。可见,光看源码是不够的,还需要一些分析思路来解决问题,所以网上有那么多源码分析的文章,大家也要关注飞超的博客_

如何解决问题

虽然我们看过源码,但也知道这个判断的规则和我们想要的不一样。但关键是如何解决问题。很多人的第一反应是修改源代码。但老实说,你只看过这么一小段源码,就贸然修改。你确定你可以控制它并且它不会引起其他问题吗?所以这个解决问题的思维方向,注意,我说的是方向,这个很重要。

如果说面向对象的三大特点,那大家一定不陌生。封装、继承、多态。而是面向对象的五项原则。那么大家可能会有些陌生。那是

那我说一下开闭原理,引用百度知道里面比较简短的描述就是这样的

开放封闭原则,其核心思想是:软件实体应该是可扩展的,但不可修改。即对扩展开放,对修改关闭。

如果你对设计模式有很好的理解,你就能理解这句话的意思。如果你不明白这一点,你可以阅读大华设计模式之类的书是如何介绍策略设计模式的。简单说就是这样,如果用if来判断,如果多加一个需求,就得多加一个else if,也就是修改代码。但是一个好的设计应该是多加一个需求,我只需要多加一个实现类就是一种策略。 (如果不清楚,建议看一下设计模式。)其实SPI也包含了这种开闭原则的思想。

Mybatis 就是这么优秀的框架。人们自然明白面向对象的五项原则,所以必须遵循这个原则。也就是说,他肯定会提供一种方式让你多加一个类,然后在这个类中源代码有什么用,自定义这个if的判断规则。

解决方案

我们自定义一个类,比如我命名为 FeiChaoOgnl

那我们就这样写

那就运行吧

只要完成FeiChaoOgnl判断方法,按照这种写法,即使复制粘贴一梭,出问题的风险也大大降低

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论