唯一のソースプログラマは、「検索」を理解していませんか?これが理由の原則源をお願いしたいとのインタビューで

序文

多くの人々は、なぜ困惑していインタビューを元に尋ねる、原理をお願いしたい......しかし、実際の作業へのアクセスは、それはネジが中に入る締めます。私も側面の多くを持って、インタビューはロケットを作った、私たちはしばしば言う、ではありません友人は、私はあなたがソースコードが表示されない場合、それらが。yesと答えました、私に尋ねたが、ない原則は、あなたが問題を解決するのですか?彼らは、基本的に2つの単語私に答えを与えた「検索します」

確かに、問題のほとんどの作業は、エラー・メッセージ検索をコピーすることによって解決することができ、そしてより多くの人々は非常に簡単に開発していたように、今より多くのフレームワークは、プログラミングに加えて、検索エンジンのブロックを構築戦います理由の例の意味を理解するために、ソースコードに依存するあまり、より物事の錯覚。私はいつも少し検索を与えたいと思っていますが見つかりました。

[記事の最後の文書を受信するための面接ZhentiとJavaコア・知識システムがあります]

唯一のソースプログラマは、「検索」を理解していませんか? これが理由の原則源をお願いしたいとのインタビューで


これは、昨年8月に起こった起こった、私は良い友人が私に、このような質問をしている、と彼は言いました。

私は空の文字列を渡しますが、使用しないのはなぜラベルMyBatisの判断は、空の文字列は== 0設立であることが判明した場合

唯一のソースプログラマは、「検索」を理解していませんか? これが理由の原則源をお願いしたいとのインタビューで


私たちの知識から、空の文字列と0に等しい数が不可能です。私の最初の反応は、彼が使用権はなかったのか、それともコードの他の部分を妨害する彼のビジネスであるということでした?だから私は書くことにしたのでテストのための最も簡単なデモ。以下

唯一のソースプログラマは、「検索」を理解していませんか? これが理由の原則源をお願いしたいとのインタビューで


そして、次のように結果が出力されます。

唯一のソースプログラマは、「検索」を理解していませんか? これが理由の原則源をお願いしたいとのインタビューで


驚くべきことにこれは本当に空の文字列とタグ番号が0に等しくなるかどうかが決定されることがわかりました。

ここで私はこの問題が発生したカンニングしようとしているわけではない、率直に言って、最初の反応は、あなたを参照するには、ソースコードは確かではありません、もちろん、ブラウザ検索を開くことです。私たちの検索の主方向2があり、一つはラベル場合はMyBatisの原則を決定することで、ラベルが空の文字列で、0が等しい場合、なぜMyBatisの。それが発見された、私たちは(あなたが自分で検索することができます)答えを見つけるために望んでいませんでした。

もちろん、そこが検索に満足な答えはありませんが、我々は別の例を見つけました。

私たちは、この判断に同様のプロジェクトのコードが多くありましたべきだと考えています。

<もしテスト= "UID!= nullのとはuid!= ''"> 
</場合>

我们平时开发中,很多同事都是喜欢复制黏贴!

唯一のソースプログラマは、「検索」を理解していませんか? これが理由の原則源をお願いしたいとのインタビューで


那么不假思索的复制黏贴到底会有什么问题呢,我们来看下面这个例子

唯一のソースプログラマは、「検索」を理解していませんか? これが理由の原則源をお願いしたいとのインタビューで


这个判断虽然是复制黏贴一把梭出来的,但是从我们的认知上来说,这个对象确实不是null,也不等于空字符串,所以这个判断应该是true的,但是运行结果如下:

唯一のソースプログラマは、「検索」を理解していませんか? これが理由の原則源をお願いしたいとのインタビューで


果然,这个又颠覆了我们的认知,但是如果你遇到的是案例2这种情况还比较好搜索,还是能搜到解决方案,如下图

唯一のソースプログラマは、「検索」を理解していませんか? これが理由の原則源をお願いしたいとのインタビューで


其实这两个案例都是一个问题,那就是这个if标签,把0和空字符串判断成了相等.

这个时候要敲黑板划重点了,俗话说一朝被蛇咬十年怕井绳,虽然第二个例子我们有了解决方案,但是这些解决方案都是治标不治本,如果我们没弄懂这其中的原理,那么你心里永远是有一块疙瘩的.你害怕下一次,又有奇奇怪怪的事情发生,只有弄懂原理,才能从根源解决问题,也就是解决一类问题,而不是某一个问题.

同时我也认识到,机会来了,终于找到一个为什么要看源码的比较合适例子了

分析源码

由于链路比较长.这里就不把debug过程展示了(对Mybatis执行流程不熟悉的,可以看看我之前的别怕看源码,一张图搞定Mybatis的Mapper原理,然后顺着执行流程debug)

我们拿第一个例子来分析,因为两个案例其实遇到的问题都是一样的.

唯一のソースプログラマは、「検索」を理解していませんか? これが理由の原則源をお願いしたいとのインタビューで


唯一のソースプログラマは、「検索」を理解していませんか? これが理由の原則源をお願いしたいとのインタビューで


唯一のソースプログラマは、「検索」を理解していませんか? これが理由の原則源をお願いしたいとのインタビューで


唯一のソースプログラマは、「検索」を理解していませんか? これが理由の原則源をお願いしたいとのインタビューで


唯一のソースプログラマは、「検索」を理解していませんか? これが理由の原則源をお願いしたいとのインタビューで


如果上面看不懂,我这里可以简单描述一下:

首先他会获取两个判断对象的类型,当拿一个字符串和一个数字判断的时候,因为类型不一样嘛,当Mybatis发现,这个字符串是可以转换成数字的,那么就会把这个字符串转成数字,然后再和这个数字判断.

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

从源码的这个

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

就可以看出,这个空字符串,是会被转成0的.所以现在一切豁然开朗.

但是源码是看了,问题还是没有解决啊.他里面其他类型判断的源码这么多,不可能全部看完,时间也不允许啊,万一还有其他坑怎么办.由此可见,只看源码还是不够的,还需要一些解决问题的分析思路,这就是为什么网上源码解析的文章这么多,我们还要关注一下肥朝的博客_

解决问题的思路

我们虽然看了源码,我们也知道了这个判断的规则和我们想要的,是有出入的.但是关键是,怎么解决问题嘛.很多人第一反应是,那就修改源码呗.但是坦白说,你只看了这么一小片源码就贸然修改,确定能驾驭得住,确定不会引发其他问题?所以这个解决问题的思考方向,注意,我说的是方向,是非常重要的.

如果说到面向对象的三大特性,那么大家想必都不会陌生.封装、继承、多态.但是面向对象的五大原则.那么大家可能就稍微要陌生了.那就是

  • 单一职责

  • 开闭原则

  • 依赖导致原则

  • 接口隔离原则

  • Liskov替换原则

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

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

如果你对设计模式有所了解的话,就很能了解这句话的意义.如果对这个不理解的,可以看一下大话设计模式这种书中,是如何引入策略设计模式的.简单的说是这样的,如果你是用if判断,那么多增加一个需求,你就要多增加一个else if,那就是要修改代码了.但是好的设计应该是,多增加一个需求,我只需要多增加一个实现类,也就是一种策略.(如果还不清楚的同学,建议看看设计模式),其实SPI,也是包含这种开闭原则的思想的.

Mybatis这么优秀的框架.人家自然明白面向对象的五大原则,所以必定会遵循这个原则.也就是说,他一定会提供一个方式,让你多增加一个类,然后这个类里面,来自定义这个if的判断规则.

解决方案

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

唯一のソースプログラマは、「検索」を理解していませんか? これが理由の原則源をお願いしたいとのインタビューで


然后我们的写法变成这样

唯一のソースプログラマは、「検索」を理解していませんか? これが理由の原則源をお願いしたいとのインタビューで


那么我们运行看看:

唯一のソースプログラマは、「検索」を理解していませんか? これが理由の原則源をお願いしたいとのインタビューで


唯一のソースプログラマは、「検索」を理解していませんか? これが理由の原則源をお願いしたいとのインタビューで


只要把FeiChaoOgnl判断方法补充完整,按照这个写法,就算是复制黏贴一把梭,出问题的风险也大大降低

END

記事は〜ああ、エラーを発見したコンテンツについての質問を持って、私にメッセージを与えます

卵小さな福祉

Javaの研究ノート、インタビュー、ドキュメント、およびビデオへの無料アクセスをクリックします。

次のようにセクションは、次のとおりです。


おすすめ

転載: blog.51cto.com/13883927/2409563