作者:小傅哥 博客:https://
沉淀、分享、成長(zhǎng),讓自己和他人都能有所收獲!😄
一、前言
學(xué)過(guò)的代碼記不住?方式不對(duì)才記不住,你這么記!
Git :上廁所不叫上廁所,叫拉分支!Socket :廁所就是服務(wù)器,坑就是端口!隊(duì)列 :上廁所🚽叫入隊(duì)列,先進(jìn)先出!棧 :去廚房🥣叫進(jìn)棧,后進(jìn)先出!架構(gòu) :三居的格局叫MVC,四居的格局叫DDD!理論 :系統(tǒng)結(jié)構(gòu)設(shè)計(jì)定的好,有點(diǎn)bug沒(méi)問(wèn)題,能改。這就是茅坑跟坐便的區(qū)別。
除了有點(diǎn)味道以外,這回是不記住了 ,我們編程寫(xiě)代碼的過(guò)程和我們?nèi)粘I畹睦?#xff0c;往往都是這樣可以對(duì)應(yīng)上,有了真實(shí)可以觸及的實(shí)物,再去了解編程就會(huì)更加容易,也很難忘記。但可能會(huì)寫(xiě)著寫(xiě)著代碼,就傻笑起來(lái)!
除了這些正能量學(xué)習(xí)的例子,我們接下來(lái)再看看哪些有毒的代碼!
二、代碼有毒!
以下代碼用好了升職加薪,用不好開(kāi)除走人!
1. 方法命名
public List< UserInfo> queryBitchUserInfo ( String req) {
return null;
}
指數(shù):??? 解毒:小哥應(yīng)該是想寫(xiě)批量查詢用戶的方法名,結(jié)果把batch
(批量 ),寫(xiě)成了bitch
(婊子 ) 點(diǎn)評(píng):接口是上午寫(xiě)的,人是下午走的!
2. 最佳排序
public static void main ( String[ ] args) {
int [ ] numbers = new int [ ] { 2 , 30000000 , 1 , 6 , 40000000 , 5 } ;
for ( final int number : numbers) {
new Thread ( new Runnable ( ) {
@Override
public void run ( ) {
try {
Thread. sleep ( number) ;
System. out. println ( number) ;
} catch ( InterruptedException ignore) {
}
}
} ) . start ( ) ;
}
}
指數(shù):??? 解毒:用數(shù)字休眠時(shí)常排序,誰(shuí)醒來(lái)的時(shí)間早,誰(shuí)就先輸出。 點(diǎn)評(píng):思路清奇,要不是這次排序等了一天,老板也不能踢他!
3. 有點(diǎn)燒腦
@Test
public void test_idx_hashMap ( ) {
Map< String, String> map = new HashMap < > ( 64 ) ;
map. put ( "alderney" , "未實(shí)現(xiàn)服務(wù)" ) ;
map. put ( "luminance" , "未實(shí)現(xiàn)服務(wù)" ) ;
map. put ( "chorology" , "未實(shí)現(xiàn)服務(wù)" ) ;
map. put ( "carline" , "未實(shí)現(xiàn)服務(wù)" ) ;
map. put ( "fluorosis" , "未實(shí)現(xiàn)服務(wù)" ) ;
map. put ( "angora" , "未實(shí)現(xiàn)服務(wù)" ) ;
map. put ( "insititious" , "未實(shí)現(xiàn)服務(wù)" ) ;
map. put ( "insincere" , "已實(shí)現(xiàn)服務(wù)" ) ;
long startTime = System. currentTimeMillis ( ) ;
for ( int i = 0 ; i < 100000000 ; i++ ) {
map. get ( "insincere" ) ;
}
System. out. println ( "耗時(shí)(initialCapacity):" + ( System. currentTimeMillis ( ) - startTime) ) ;
}
4. 迷之求和
@Test
public void test_add ( ) {
int num = 0 ;
for ( int i = 0 ; i < 100 ; i++ ) {
num = num++ ;
}
System. out. println ( num) ;
}
指數(shù):?? 解毒:最終 num
結(jié)果為 0,num++
根本沒(méi)起啥作用。因?yàn)楹?#43;+,是先用結(jié)果,在++操作,不會(huì)給賦值。正確寫(xiě)法是:num = ++ num; 點(diǎn)評(píng):這種錯(cuò)誤就跟開(kāi)車(chē)闖紅燈似的,輕則扣分罰款,重則傾家蕩產(chǎn)。
5. 花里胡哨
private boolean checkAge ( int age ) {
boolean result;
if ( age > 18 )
{
result= true ;
} else {
result= false ;
}
return result;
}
指數(shù):? 解毒:代碼可以運(yùn)行,但是可以優(yōu)化為return age > 18
。 點(diǎn)評(píng):你們公司是按照代碼行數(shù)打績(jī)效?不做格式化、不整潔、不看IDEA工具提示,代碼是寫(xiě)給人看的!啥有不是!
6. 數(shù)字判斷
public boolean isNumber ( String str) {
try {
Integer. parseInt ( str) ;
return true ;
} catch ( Exception e) {
return false ;
}
}
指數(shù):?? 解毒:判斷是不是數(shù)字,不拋異常就是,拋異常就不是。這可以使用 StringUtils
工具包判斷,也可以自己寫(xiě)正則判斷。 點(diǎn)評(píng):這代碼真燒,用異常做業(yè)務(wù)。這不是把🍄蘑菇給狗狗吃嗎!🐕狗狗沒(méi)死你到是吃蘑菇呀,你吃狗粑粑。
7. 代碼健壯
public void neverStop ( ) {
//一直循環(huán)
while ( true ) {
try {
//業(yè)務(wù)處理流程
} catch ( Exception e) {
//抓到異常,不處理、不打日志、就是不要停,繼續(xù)跑
continue ;
}
}
}
指數(shù):??? 解毒:把可能拋異常的代碼用tryCatch包起來(lái),一直跑,遇到異常也要跑。這個(gè)時(shí)候遇到異常,要做一些流程處理,最起碼要打日志和報(bào)警。 點(diǎn)評(píng):業(yè)務(wù)開(kāi)發(fā)很多時(shí)候都是為了解決異常流程,就像擦屁屁的紙80%的面積是保護(hù)手的。怎么滴,我看你這代碼,是非要一直摳破呀!
8. 性能優(yōu)化
// APP首頁(yè)查詢,優(yōu)化前
public void queryInitInfo ( ) {
Thread. sleep ( 3000 ) ;
}
// APP首頁(yè)查詢,優(yōu)化后
public void queryInitInfo ( ) {
Thread. sleep ( 500 ) ;
}
指數(shù):??? 解毒:沒(méi)啥解毒的,一公斤鶴頂紅兌了一口口水! 點(diǎn)評(píng):點(diǎn)評(píng)不了啦,抓到就開(kāi)了吧!
9. 無(wú)用日志
// 規(guī)則引擎校驗(yàn)
public boolean ruleEngine ( MatterReq req) {
try {
// 業(yè)務(wù)流程
} catch ( Exception e) {
logger. error ( e) ; // 只打異常,不打入?yún)⑿畔?/span>
}
}
指數(shù):? 解毒:日志里只打了異常,沒(méi)有入?yún)⑿畔?#xff0c;當(dāng)你的方法有大量的調(diào)用時(shí),很難快速定位問(wèn)題。 點(diǎn)評(píng):下次記得把產(chǎn)品經(jīng)理
也打日志里去,要死一起死!
10. 耗時(shí)遍歷
@Test
public void test_LinkedList ( ) {
// 初始化100萬(wàn)數(shù)據(jù)
List< Integer> list = new LinkedList < Integer> ( 1000000 ) ;
// 遍歷求和
int sum = 0 ;
for ( int i = 0 ; i < list. size ( ) ; i++ ) {
sum += list. get ( i) ;
}
}
指數(shù):???? 解毒:乍一看可能覺(jué)得沒(méi)什么問(wèn)題,但是這個(gè)遍歷求和會(huì)非常慢。主要因?yàn)殒湵淼臄?shù)據(jù)結(jié)構(gòu),每一次list.get(i)
都是從鏈表的頭開(kāi)始查找,與ArrayList
不同,LinkedList
它時(shí)間復(fù)雜度是O(n)。那如果說(shuō)你不知道對(duì)方傳過(guò)來(lái)的是LinkedList
還是ArrayList
呢,其實(shí)可以通過(guò)list instanceof RandomAccess
進(jìn)行判斷。ArrayList
有隨機(jī)訪問(wèn)的實(shí)現(xiàn),LinkedList
是沒(méi)有。同時(shí)也可以使用增強(qiáng)的for循環(huán)或者Iterator
進(jìn)行遍歷。 點(diǎn)評(píng): 根基不牢,地動(dòng)山搖!一知半解,坑了老鐵!
三、總結(jié)
好的代碼千篇一律,差的程序升值加薪! ,這些有毒的代碼,淋漓盡致的展示了程序員的才華出眾,同時(shí)也嚴(yán)重懷疑就是錢(qián)給少了!
敲黑板 :想在這編碼這條路上走的更遠(yuǎn),還是需要腳踏實(shí)地的把根基打牢。所以非常推進(jìn)你閱讀以下系列專(zhuān)欄文章,夯實(shí)基礎(chǔ)、拓展能力、提升眼界;
Java核心突破瓶頸篇:https:///itstack/interview.html 重學(xué)Java設(shè)計(jì)模式篇:https:///itstack/itstack-demo-design.html Java架構(gòu)設(shè)計(jì)學(xué)習(xí)篇:https:///itstack-demo-ddd/itstack-demo-ddd.html
好! ,本篇文章就到這里,有意思的代碼還有很多,歡迎在評(píng)論區(qū)留下你的鬼畜代碼!