程序員不懂源碼只能“搜索”?這就是面試喜歡問原理、源碼的原因

前言

很多人都有一個疑惑,爲什麼面試都喜歡問原理、問源碼......但是實際工作根本用不上,也就是大家常說的,面試造火箭,進去擰螺絲.我身邊也有不少朋友問過我,我給他們的回答是.如果不看源碼,不懂原理,出了問題你怎麼解決?他們給我的答覆基本都是兩個字,"搜索"

也確實,工作中大部分問題通過複製錯誤信息搜索都能解決,加上現在框架越來越多,拼積木式的編程方式加上搜索引擎,讓越來越多人產生了開發是件很容易的事的錯覺.我也一直想舉一個搜索幾乎搜不到,要看源碼才能弄懂其中緣由的例子.

【文末有面試真題以及Java核心知識點體系文檔領取】

程序員不懂源碼只能“搜索”?這就是面試喜歡問原理、源碼的原因


正巧這件事發生在了去年8月份,我一個很好的朋友問了我這麼個問題,他說

爲什麼我傳的是空字符串,但是用Mybatis的if標籤判斷該空字符串 == 0 竟然是成立的

程序員不懂源碼只能“搜索”?這就是面試喜歡問原理、源碼的原因


從我們的認知上來說,一個 空字符串 和 一個數字0 是不可能相等的.所以我第一反應是,他是不是用法不對?或者是他的業務代碼其他地方干擾到了? 於是我決定寫了個最簡單的demo來進行測試.如下

程序員不懂源碼只能“搜索”?這就是面試喜歡問原理、源碼的原因


然後輸出結果如下:

程序員不懂源碼只能“搜索”?這就是面試喜歡問原理、源碼的原因


驚奇的發現,這個if標籤果然把空字符串和數字0判斷成了相等.

這裏我並不想騙大家,遇到這種問題,坦白說第一反應當然不是看源碼啦,當然是打開瀏覽器搜索一下.我們搜索的方向主要有兩個,一個是mybatis if標籤的判斷原理,一個是爲什麼mybatis if標籤空字符串和0是相等的.結果發現,並沒有找到我們要想的答案(大家可以自行搜索一下).

當然雖然沒有搜索到滿意的答案,但是我們卻發現了另一個例子.

我相信類似這種判斷的代碼大家項目中應該出現了很多.

<if test="uid != null and uid != '' ">
</if>

我們平時開發中,很多同事都是喜歡複製黏貼!

程序員不懂源碼只能“搜索”?這就是面試喜歡問原理、源碼的原因


那麼不假思索的複製黏貼到底會有什麼問題呢,我們來看下面這個例子

程序員不懂源碼只能“搜索”?這就是面試喜歡問原理、源碼的原因


這個判斷雖然是複製黏貼一把梭出來的,但是從我們的認知上來說,這個對象確實不是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學習筆記,面試,文檔以及視頻

部分資料如下:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章