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