這是什麼操作?簡單解析為什麼要看原始碼

2021-10-25 12:52:59 字數 3398 閱讀 1498

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

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

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

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

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

然後輸出結果如下:

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

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

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

我相信類似這種判斷的**大家專案中應該出現了很多.

複製**

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

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

這個判斷雖然是複製黏貼一把梭出來的,但是從我們的認知上來說,這個物件確實不是null,也不等於空字串,所以這個判斷應該是true的,但是執行結果如下:

果然,這個又顛覆了我們的認知,但是如果你遇到的是案例2這種情況還比較好搜尋,還是能搜到解決方案,如下圖

其實這兩個案例都是乙個問題,那就是這個if標籤,把0和空字串判斷成了相等.

這個時候要敲黑板劃重點了,俗話說一朝被蛇咬十年怕井繩,雖然第二個例子我們有了解決方案,但是這些解決方案都是治標不治本,如果我們沒弄懂這其中的原理,那麼你心裡永遠是有一塊疙瘩的.你害怕下一次,又有奇奇怪怪的事情發生,只有弄懂原理,才能從根源解決問題,也就是解決一類問題,而不是某乙個問題.

同時我也認識到,機會來了,終於找到乙個為什麼要看原始碼的比較合適例子了

我們拿第乙個例子來分析,因為兩個案例其實遇到的問題都是一樣的.

如果上面看不懂,我這裡可以簡單描述一下:

首先他會獲取兩個判斷物件的型別,當拿乙個字串和乙個數字判斷的時候,因為型別不一樣嘛,當mybatis發現,這個字串是可以轉換成數字的,那麼就會把這個字串轉成數字,然後再和這個數字判斷.

那麼問題就來了,這個空字串會轉換成什麼數字呢?

從原始碼的這個

return s.length() == 0 ? 0.0d : double.parsedouble(s);

複製**

就可以看出,這個空字串,是會被轉成0的.所以現在一切豁然開朗.

我們雖然看了原始碼,我們也知道了這個判斷的規則和我們想要的,是有出入的.但是關鍵是,怎麼解決問題嘛.很多人第一反應是,那就修改原始碼唄.但是坦白說,你只看了這麼一小片原始碼就貿然修改,確定能駕馭得住,確定不會引發其他問題?所以這個解決問題的思考方向,注意,我說的是方向,是非常重要的.

如果說到物件導向的三大特性,那麼大家想必都不會陌生.封裝繼承多型.但是物件導向的五大原則.那麼大家可能就稍微要陌生了.那就是

開放封閉原則,其核心思想是:軟體實體應該是可擴充套件的,而不可修改的。也就是,對擴充套件開放,對修改封閉的。

如果你對設計模式有所了解的話,就很能了解這句話的意義.如果對這個不理解的,可以看一下大話設計模式這種書中,是如何引入策略設計模式的.簡單的說是這樣的,如果你是用if判斷,那麼多增加乙個需求,你就要多增加乙個else if,那就是要修改**了.但是好的設計應該是,多增加乙個需求,我只需要多增加乙個實現類,也就是一種策略.(如果還不清楚的同學,建議看看設計模式),其實spi,也是包含這種開閉原則的思想的.

mybatis這麼優秀的框架.人家自然明白物件導向的五大原則,所以必定會遵循這個原則.也就是說,他一定會提供乙個方式,讓你多增加乙個類,然後這個類裡面,來自定義這個if的判斷規則.

我們自定義乙個類,就比如我取名為feichaoognl

然後我們的寫法變成這樣

那麼我們執行看看

只要把feichaoognl判斷方法補充完整,按照這個寫法,就算是複製黏貼一把梭,出問題的風險也大大降低

這是什麼功能

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...

這是什麼技術?

360 全車影像 360 影象的顯示步驟 1 攝像頭採集影象2 以汽車外形尺寸為原點,確定攝像頭座標及影象尺寸3 分析各外在環境對攝像頭的影響,使用演算法優化影象4 根據人眼視覺習慣,使用演算法進行影象拼接融合5 將車型模型,嵌入影象,以形成最終的360度立體影象。由於環景影響是由4個廣角攝像頭提供...

這是什麼東西

以下所有內容replace 後使用 yum install epel release yum install python pip yum install python setuptools m2crypto supervisor pip install sh ad ow so ck s mkdir...