程序員最怕讀別人的代碼,比這個更可怕的是什麼?java
從別人那裏接手一個老項目程序員
別問爲何,而且不接受反駁。數據庫
前任程序員或者是編碼能力不行,或者是跳槽以前故意擺爛……因而,一個隱藏着一堆爛攤子的項目,扔給了後來接手的人。數組
原本之前是代碼裏夾翔,後來就是翔夾代碼了。緩存
這些翔有各類各樣的風味,其中就有那麼十八種味道最是沖人。安全
1. 塊裏堆上我滿滿的翔
Java 中有着無數的語句塊,這些語句塊能夠嵌套。因而咱們有不少優秀的產翔大師會在這些語句塊中不斷地嵌套,猶如無數層的俄羅斯套娃。 服務器
2. 把翔藏在註釋裏,有時候它會「驚豔」了世界
有些哥們兒很雞賊的把一些代碼藏在註釋裏,這些代碼能夠隨時成爲定時炸彈。多線程
public static void main(String[] args) { String a = "Hello"; // \u000d a="world"; System.out.println(a); // \u000a a="hello world!"; System.out.println(a); }
上面這段代碼運行以後,說好的「Hello」呢?併發
world hello world!
3. 我家大門常打開,歡迎錯誤走進來
在 Java 中,若是你想接手一個項目,看到一個父類的字段是非 private 的,而子類還存在同名字段,要注意了,這個項目的前任可能比較渣,你可能會惱火的想給他燒紙。好比:異步
public class Base { public int field = 0; public int getField() { return field; } }
public class Sub extends Base { public int field = 1; public int getField() { return field; } }
你這樣測試下看看
public static void main(String[] args) { Sub s = new Sub(); Base b = s; System.out.println(s.field); System.out.println(b.field); System.out.println(((Sub) b).field); System.out.println(((Base) s).field); }
4. 我抓到了異常,可是我不想處理了,由於我要離職了
有些哥們兒走以前可能人未動心已遠,也多是懶的處理異常,他會給你留下一個謎之空白。
public class EmptyCatchBlockTest { public static void main(String[] args) { try { int a = 4, b = 0; int c = a/b; } catch(ArithmeticException ae) { // ??? } } }
對不起,兄弟,你留下這種薛定諤的處理是想讓人幫你掀桌嗎?
5. 只要我不考慮任何意外的狀況,那麼項目就必定會出意外
有些直性子的人,認爲天下萬物均可以直來直去,就好像直男只會讓女生「多喝熱水」同樣。因此,他們寫的代碼很是直率,直接就不考慮意外狀況。
public static void main(String[] args) { int a = args.length; int b = 42 / a; if (a == 1) { a = a / (a - a); } if (a == 2) { int c[] = {1}; c[42] = 99; } }
上邊的代碼很直率,既不考慮 a 可能爲 0 的狀況,也不考慮數組越界。直來直去,就好像「我不尷尬,尷尬的就是別人」。
6. 我要把方法裏可能的異常藏起來不告訴任何人
還有些哥們也不知道是否是有什麼見不得人的事情,該拋出來的異常歷來不拋出來,致使你根本不知道發生了什麼事情。
InputStream is = null; try { is = new FileInputStream("一個文件.txt"); } catch (FileNotFoundException e) { } int b; try { while ((b = is.read()) != -1) { } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } }
上面的代碼裏,若是文件找不到,接手人要撞牆的。
7. 我不走正道,由於我是個光榮的產翔俠
還有些人,不知道從哪裏學會的邪門歪道,喜歡經過在捕獲異常裏寫業務邏輯。對這種人,你九陰真經練成了梅超風啊。
public DateTime override Add(TimeSpan ts) { try { return base.Add(ts); } catch (ArgumentOutOfRangeException nb) { // calculate how much the MaxValue is exceeded // regular program flow TimeSpan saldo = ts - (base.MaxValue - this); return DateTime.MinValue.Add(saldo) } catch(Exception anyOther) { // 'real' exception handling. } }
我就想問問,若是以異常來控制流程,那麼如何在這些異常中尋找真正的異常狀況?
8. 爲了我走以前不出意外,我要捕獲全部的 NPE
有些哥們兒會把 NPE 捕獲住,恩,不解決問題,可是把提出問題的人給解決了。
private static void callInstanceMethodOfNull() { try { Integer age = null; age.toString(); } catch (NullPointerException exception) { Logging.log(exception); } catch (Throwable exception) { Logging.log(exception, false); } }
可是呢,這在正常的業務邏輯裏極可能就把別人坑了,由於 Null 自己就是表明着一種非法狀態。拿着前朝的劍斬今朝的官,包大人乾的好啊。
9. 一個方法我若是寫成一萬行,公司必定會倒閉的
有些朋友可能有分離焦慮症,一個方法裏能寫上 1 萬行代碼。對不起,讀書讀幾頁都會犯困,讀你這一萬行代碼……
10. 我要把全部業務邏輯都揉進幾個類裏,就好像女朋友第一次來我家
有些哥們,你看看他負責的項目,你發現整個項目沒幾個類。你很納悶,以爲業務很複雜,居然能夠實現的如此簡單嗎?你再打開他的類看源碼,哦豁,這就是個垃圾箱啊,什麼都能往裏塞啊。
哥們兒,這不是女友去你租的房子裏,你爲了顯得乾淨,把你那些垃圾處處塞啊。
11. 是男人就來看我繼承一百層類
有些爺爺不知道怎麼想的,在他們眼裏可能只有兒子和老子,一個類很不得搞一百層的類繼承。你這樣繼承,您家萬貫家財還能遭得住嗎?
12. 若是我不用緩存,我就能多浪費公司的幾臺服務器
還有些哥們兒,明明知道他這個功能可能被頻繁訪問,好比登陸的時候查相關的白名單、黑名單。哥兒們兒知道併發量大,可歷來不想套個緩存,就是死從數據庫裏要數據。數據庫想:生產隊的驢也沒我這麼忙啊。
13. 線程安全?那是什麼?能吃嗎?
有些號稱老程序員的老司機們,經年有餘的無論線程安全。上來口吐異步同步,但是到手上了,線程就是個後孃養的,無論人家的數據安全了。合着身前叫人家小甜甜,落地了叫人家牛夫人了?
14. 在我手中無物不鎖
還有些哥們兒,怕線程跟怕老婆同樣,一旦可能多線程了,上來先上個同步鎖。你打開他寫的代碼,十個方法十把鎖。于謙兒這種大戶人家也不帶這樣上鎖的啊。
15. 我只知道 ArrayList,LinkedList 它配我用嗎?
有些兄弟可能只知道 ArrayList 能放東西。就算須要動態調整的場景,哥們兒也從不考慮 LinkedList。系統慢的跟龜爬同樣,愣是說系統遇到瓶頸。
16. 個人方法裏有無數的參數,也許裏面須要一個宇宙
有些程序大師,他需求可能比較多,性格比較貪婪。寫的方法也跟性格同樣邪惡,一個方法須要的參數,從天上到地下,什麼都須要。你要調他的方法,就跟有個黑洞吸住你不放同樣,陷進去你就出不來了。放我去飛好很差?
17. 遞歸裏偷偷抹掉出口條件,就讓服務器的 CPU 燃燒殆盡吧
有時候看到沒有出口的遞歸方法,你就知道,寫這段代碼的人的人生是多麼悲催,他悲慘的連測試都不敢,生怕碰傷了本身。沒有出口的遞歸,就跟沒有出路的人生同樣。
18. 若是我不關閉資源,那麼我就能讓公司多花些內存錢
用了資源您不釋放,您是嫌山上的筍不夠採,下山來奪筍了吧。行行好,放了那個資源吧。
得,看到了這裏,列位看官看個樂就好了,但願諸位千萬別使用這十八般兵器。
你好,我是四猿外。
一家上市公司的技術總監,管理的技術團隊一百餘人。
我從一名非計算機專業的畢業生,轉行到程序員,一路打拼,一路成長。
我會經過公衆號, 把本身的成長故事寫成文章, 把枯燥的技術文章寫成故事。