很多人都有乙個疑惑,為什麼面試都喜歡問原理,問原始碼.但是實際工作根本用不上,也就是大家常說的,面試造火箭,進去擰螺絲.我身邊也有不少朋友問過我,我給他們的回答是.如果不看原始碼,不懂原理,出了問題你怎麼解決?他們給我的答覆基本都是兩個字,"搜尋"
也確實,工作中大部分問題通過複製錯誤資訊搜尋都能解決,加上現在框架越來越多,拼積木式的程式設計方式加上搜尋引擎,讓越來越多人產生了開發是件很容易的事的錯覺.我也一直想舉乙個搜尋幾乎搜不到,要看原始碼才能弄懂其中緣由的例子.
正巧這件事發生在了去年8月份,我乙個很好的朋友問了我這麼個問題,他說
為什麼我傳的是空字串,但是用mybatis的if標籤判斷該空字串 == 0
竟然是成立的從我們的認知上來說,乙個
空字串
和乙個數字0
是不可能相等的.所以我第一反應是,他是不是用法不對?或者是他的業務**其他地方干擾到了? 於是我決定寫了個最簡單的demo來進行測試.如下然後輸出結果如下:
驚奇的發現,這個
if標籤
果然把空字串
和數字0
判斷成了相等.這裡我並不想騙大家,遇到這種問題,坦白說第一反應當然不是看原始碼啦,當然是開啟瀏覽器搜尋一下.我們搜尋的方向主要有兩個,乙個是mybatis if標籤的判斷原理,乙個是為什麼mybatis if標籤空字串和0是相等的.結果發現,並沒有找到我們要想的答案(大家可以自行搜尋一下).
當然雖然沒有搜尋到滿意的答案,但是我們卻發現了另乙個例子.
我相信類似這種判斷的**大家專案中應該出現了很多.
我們平時開發中,很多同事都是喜歡複製黏貼!複製**
那麼不假思索的複製黏貼到底會有什麼問題呢,我們來看下面這個例子
這個判斷雖然是複製黏貼一把梭出來的,但是從我們的認知上來說,這個物件確實不是
null
,也不等於空字串
,所以這個判斷應該是true
的,但是執行結果如下:果然,這個又顛覆了我們的認知,但是如果你遇到的是案例2這種情況還比較好搜尋,還是能搜到解決方案,如下圖
其實這兩個案例都是乙個問題,那就是這個if標籤,把0和空字串判斷成了相等.
這個時候要敲黑板劃重點了,俗話說一朝被蛇咬十年怕井繩,雖然第二個例子我們有了解決方案,但是這些解決方案都是治標不治本,如果我們沒弄懂這其中的原理,那麼你心裡永遠是有一塊疙瘩的.你害怕下一次,又有奇奇怪怪的事情發生,只有弄懂原理,才能從根源解決問題,也就是解決一類問題,而不是某乙個問題.
同時我也認識到,機會來了,終於找到乙個
為什麼要看原始碼
的比較合適例子了我們拿第乙個例子來分析,因為兩個案例其實遇到的問題都是一樣的.
如果上面看不懂,我這裡可以簡單描述一下:
首先他會獲取兩個判斷物件的型別,當拿乙個字串和乙個數字判斷的時候,因為型別不一樣嘛,當mybatis發現,這個字串是可以轉換成數字的,那麼就會把這個字串轉成數字,然後再和這個數字判斷.那麼問題就來了,這個空字串會轉換成什麼數字呢?從原始碼的這個就可以看出,這個空字串,是會被轉成0的.所以現在一切豁然開朗.return s.length() == 0 ? 0.0d : double.parsedouble(s);
複製**
我們雖然看了原始碼,我們也知道了這個判斷的規則和我們想要的,是有出入的.但是關鍵是,怎麼解決問題嘛.很多人第一反應是,那就修改原始碼唄.但是坦白說,你只看了這麼一小片原始碼就貿然修改,確定能駕馭得住,確定不會引發其他問題?所以這個解決問題的思考方向,注意,我說的是方向,是非常重要的.
如果說到物件導向的三大特性,那麼大家想必都不會陌生.
封裝
、繼承
、多型
.但是物件導向的五大原則.那麼大家可能就稍微要陌生了.那就是開放封閉原則,其核心思想是:軟體實體應該是可擴充套件的,而不可修改的。也就是,對擴充套件開放,對修改封閉的。如果你對設計模式有所了解的話,就很能了解這句話的意義.如果對這個不理解的,可以看一下大話設計模式
這種書中,是如何引入策略
設計模式的.簡單的說是這樣的,如果你是用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...