編碼編成翔的十八般兵器

程序員最怕讀別人的代碼,比這個更可怕的是什麼?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. 若是我不關閉資源,那麼我就能讓公司多花些內存錢

用了資源您不釋放,您是嫌山上的筍不夠採,下山來奪筍了吧。行行好,放了那個資源吧。

得,看到了這裏,列位看官看個樂就好了,但願諸位千萬別使用這十八般兵器。


你好,我是四猿外。
一家上市公司的技術總監,管理的技術團隊一百餘人。
我從一名非計算機專業的畢業生,轉行到程序員,一路打拼,一路成長。

我會經過公衆號, 把本身的成長故事寫成文章, 把枯燥的技術文章寫成故事。

相關文章
相關標籤/搜索