一、背景
1.1、時(shí)間緊任務(wù)重
在之前開發(fā)一套公司內(nèi)部系統(tǒng)時(shí)一方面時(shí)間緊前期工作準(zhǔn)備不充分,另一方面也在業(yè)務(wù)對接及編碼工作的規(guī)范上做得不是很好導(dǎo)致了這套系統(tǒng)僅停留在能用的狀態(tài)下。
1.2、拓展不友好
其中最大的問題就是拓展性了。整個(gè)開發(fā)整體使用的是:
SpringBoot + shiro + MyBatis + easyPoi + Layui + MySQL5.7(后續(xù)升級為8.0) + redis + RabbitMQ 的模式。
前后端無分離。這些其實(shí)都是還好的,問題就在于代碼中存在不少的硬編碼,這就導(dǎo)致了對后續(xù)業(yè)務(wù)拓展支持的不友好!
PS: 能把鍋推到敏捷開發(fā)上嗎?不!還不是因?yàn)樽约翰耍。。?/p>
1.3、該來的總歸是要來的
最近業(yè)務(wù)有些許變更,于是這些硬編碼部分就整體出問題了:不,我們不支持這樣子的!
但是業(yè)務(wù)是不能停下來等人的,加之項(xiàng)目的重構(gòu)排期比較靠后,所以暫時(shí)只能在原有系統(tǒng)上進(jìn)行調(diào)整。
二、關(guān)于硬編碼
2.1、什么是硬編碼
這里提到的硬編碼不是計(jì)算機(jī)的硬編碼處理,而是軟件編程時(shí)代碼層面的硬編碼(簡單來說就是死板不支持變通的代碼)。
2.2、常見的硬編碼示例
PS: 僅為偽代碼示例,意思一下就可以了!
① 條件處理上的硬編碼
if("單據(jù)檢查完成".equals(orderState)){
System.out.println("XXX單據(jù)檢查完成了!");
}
JAVA
② 信息處理上的硬編碼
if(true){
System.out.println("小明已經(jīng)完成了任務(wù)A!");
}
Java
③ 返回值上的硬編碼
if("小明".equals(name){
return "主管職位";
}
Java
④ 屬性值上的硬編碼
String orderAddUrl = "http://baigedu.com:8080/order/add";
Java
2.3、硬編碼所帶來的一系列困擾
PS: 簡單以上述四種情況為例。
① 容易產(chǎn)生條件不匹配的情況導(dǎo)致無法進(jìn)入條件
比如:項(xiàng)目換人維護(hù)了或與前端對接時(shí),他在調(diào)用的時(shí)候?qū)懙氖?ldquo;單機(jī)檢察完成”
② 這個(gè)任務(wù)只能是小明完成的?小明在這里只能完成任務(wù)A?小華我要完成任務(wù)B!
③ 小明:我這輩子就只能是個(gè)小主管?瞧誰不起呢!
④ 百個(gè)度:我們項(xiàng)目調(diào)整了,現(xiàn)在這個(gè)接口改成了:
Http://baigedu.com:8089/orderAdd
2.4、綜上所述
硬編碼的不好之處竟恐怖如斯!
PS: 同時(shí)我們也不能單一的認(rèn)為硬編碼是不好的。在寫單元測試時(shí)不來個(gè)硬編碼,在一些定值上(男、女、未知),快速開發(fā)時(shí)硬編碼還是有作用的,只是說正式開發(fā)中可能會(huì)存在一些壞味道...
三、應(yīng)對性處理
3.1、遍尋硬編碼遺留
因?yàn)橄到y(tǒng)的每一個(gè)模塊都有經(jīng)手,所以問題存在之處的整理工作倒是并不復(fù)雜。
3.2、硬編碼模塊重構(gòu)
因?yàn)橐恍┛陀^問題本次也只能消除90%的硬編碼部分,整個(gè)項(xiàng)目的完善就暫時(shí)寄托于后續(xù)的項(xiàng)目重構(gòu)了。同時(shí)這90%的硬編碼改造已經(jīng)能滿足當(dāng)下需求及后續(xù)比較友好的拓展性,本著不追求極端完美主義的想法加之整個(gè)改進(jìn)的些許心得遂有此文。
三、規(guī)避硬編碼的一些常用方法
3.1、拒絕定值,使用參數(shù)傳遞
以上情景二如果把 name 和 task 都作為入?yún)硖幚恚呛茌p易的實(shí)現(xiàn)諸如:小花完成了任務(wù)C這項(xiàng)功能。
3.2、枚舉類
枚舉類是對拓展友好的,同時(shí)也能規(guī)范數(shù)據(jù)。上述場景一中把狀態(tài)寫成枚舉類就能很輕松的解決狀態(tài)錯(cuò)誤及狀態(tài)拓展問題!
PS: 千萬不要把枚舉類直接給到前端,因?yàn)椴恢v碼德!
3.3、配置文件
以SpingBoot為例,我們可以把一些使用比較多且不易該的屬性配置的Xml或者Yml中,然后再代碼中使用@Value注解來使用!
這樣場景四種的不管怎么變我們都可以直接在配置文件中修改,而且只修改一處!
PS: @Value注解不能使用static修飾
3.4、數(shù)據(jù)庫配置
在上述場景三種,我們可以把小明的信息配置到數(shù)據(jù)庫中,然后再使用時(shí)讀取數(shù)據(jù)庫信息。這樣小明以后升職加薪出任CEO迎娶白富美都沒有問題。
(小明的肯定!)
四、后記
其實(shí)整體來說這些都是不好的編碼習(xí)慣或僅考慮到當(dāng)下而沒有對后續(xù)的拓展做容錯(cuò)而導(dǎo)致的。
希望我們都能寫出一手漂亮的代碼,做一個(gè)講碼德的好開發(fā)!
PS: 代碼整潔之道的熟讀都應(yīng)該提上日程了哈!!!