垃圾代碼書寫準則(有意思)

開門見山地說吧,在逛 GitHub 的時候,發現了一個很是有意思的項目,地址以下所示:javascript

github.com/trekhleb/st…java

名叫「垃圾代碼書寫準則」,瞧這名字,我真的是服了。做者也是良苦用心,從反面教材的角度來闡述正確書寫代碼格式的重要性。做者使用 JavaScript 編寫的代碼示例,我把它重製成了 Java 版,而且用我本身的語言風格翻譯成了中文,但願小夥伴們可以喜歡。git

💩 以一種容易形成代碼混淆的方式命名變量

命名越短,就須要越多的時間去思考代碼邏輯等問題。程序員

Good 👍🏻github

int a = 42;
複製代碼

Bad 👎🏻算法

int age = 42;
複製代碼

💩 變量/方法命名風格不統一

爲風格不統一干杯。數據庫

Good 👍🏻設計模式

int wWidth = 640;
int w_height = 480;
複製代碼

Bad 👎🏻markdown

int windowWidth = 640;
int windowHeight = 480;
複製代碼

💩 不寫註釋

反正沒人能讀懂你的代碼。網絡

Good 👍🏻

int cdr = 700;
複製代碼

Bad 👎🏻

註釋應該包含一些「爲何」,而不是一些「是什麼」。若是代碼連是「什麼」都表達不清楚,那代碼也太爛了。

// 700ms 的數量是從 UX A/B 測試結果中獲得的一個經驗值。
// @查看: <詳細解釋 700 的一個連接>
int callbackDebounceRate = 700;
複製代碼

💩 使用母語寫註釋

若是你的母語是英語,那麼請忽略這條準則。

Good 👍🏻

// Закриваємо модальне віконечко при виникненні помилки.
toggleModal(false);
複製代碼

Bad 👎🏻

// 隱藏錯誤彈窗
toggleModal(false);
複製代碼

PS:若是英語書寫能力不是很強的話,建議仍是用母語吧。畢竟說清楚總比說不清楚要強。

💩 聲明變量的風格不統一

再次爲風格不統一干杯。

Good 👍🏻

String [] i1 = {"沉", "默", "王", "二"};
String i2 [] = {"沉", "默", "王", "三"};
複製代碼

Bad 👎🏻

String [] wanger = {"沉", "默", "王", "二"};
String wangsan [] = {"沉", "默", "王", "三"};
複製代碼

💩 儘量把代碼寫成一行

Good 👍🏻

IntStream.range(1, 5).boxed().map(i -> { System.out.print("Happy Birthday "); if (i == 3) return "dear NAME"; else return "to You"; }).forEach(System.out::println);
複製代碼

Bad 👎🏻

for (int i = 1; i < 5; i++) {
    System.out.println("Happy Birthday " + (i == 3 ? "dear NAME" : "to you"));
}
複製代碼

💩 對錯誤信息無論不顧

不管何時發現錯誤,都沒有必要讓其餘人知道。

Good 👍🏻

try {
  // 意料以外的狀況。
} catch (error) {
  // tss... 🤫
}
複製代碼

Bad 👎🏻

try {
  // 意料以外的狀況。
} catch (error) {
  // and/or
  logError(error);
}
複製代碼

💩 使用大量的全局變量

全球化的原則。

Good 👍🏻

int x = 5;

void multi() {
  x = x * 2;
}

multi(); // 如今 x 是 10
複製代碼

Bad 👎🏻

int x = 5;

int multi(int num) {
  return num * 2;
}

x = multi(x); // 如今 x 是 10
複製代碼

💩 聲明根本不會使用的變量

萬一之後用了呢?以備不時之需。

Good 👍🏻

int sum(int a, int b, int c) {
  int timeout = 1300;
  int result = a + b;
  return a + b;
}
複製代碼

Bad 👎🏻

int sum(int a, int b) {
  return a + b;
}
複製代碼

💩 若是條件容許的話,從不指定類型。

Good 👍🏻

// 享受便捷的快樂
List list = new ArrayList();
list.add("沉默王二");
list.add(18);
複製代碼

Bad 👎🏻

List<String> nameList = new ArrayList<String>();

// 編譯出錯
nameList.add(18);
複製代碼

💩 沒鳥用的代碼

看起來更嚴謹,其實不少餘。

Good 👍🏻

Integer multi(Object num) {
    if (!(num instanceof Integer)) {
        return null;
    } else if (num != null) {
        return (Integer) num * 2;
    }
    return null;
}
複製代碼

Bad 👎🏻

Integer multi(Object num) {
    if (num instanceof Integer) {
        return (Integer) num * 2;
    }
    return null;
}
複製代碼

💩 大量的 if-else 嵌套

Good 👍🏻

void someMethod(int a, int b, int c) {
    if (a > 0) {
        if (b > 0) {
            if (c > 0) {
               int result = a / b / c;
            }
        }
    }
}
複製代碼

Bad 👎🏻

void someMethod1(int a, int b, int c) {
    if (a < 0 || b < 0 || c < 0) {
        return;
    }
    int result = a / b / c;
}
複製代碼

💩 良莠不齊地縮進

良莠不齊乃幸福本源。

Good 👍🏻

String [] wanger = {"沉", 
        "默", "王", "二"};
String [] wangsan = {"沉", "默", "王", "三"};
Arrays.asList(wanger).stream().
        forEach(System.out::println);
Arrays.asList(wangsan).
        stream().
                forEach(System.out::println);
複製代碼

Bad 👎🏻

String [] wanger = {"沉", "默", "王", "二"};
String [] wangsan = {"沉", "默", "王", "三"};
Arrays.asList(wanger)
        .stream()
        .forEach(System.out::println);
Arrays.asList(wangsan)
        .stream()
        .forEach(System.out::println);
複製代碼

💩 代碼行數多的方法的比少的好

不要把代碼邏輯分紅可讀的部分。

  • 一個類中的代碼行數超過 10000 行。
  • 一個方法中的代碼行數超過 1000 行。
  • 一個方法裏既作減法處理又作加法處理,還作乘除的處理。

💩 不要測試你的代碼

代碼測試是測試工程師的事,關我屁事。

💩 避免代碼風格統一

爲所欲爲地編寫代碼,特別是在一個團隊中有多個開發人員的狀況下,我崇尚「自由」。

💩 不要寫文檔

從一開始就不要。

💩 不要刪除廢棄掉的代碼

代碼儘管已經廢棄了,註釋掉就好了,不必刪掉。

好了,小夥伴們還有須要補充的嗎?

喜歡逛 GitHub 的小夥伴們能夠點擊下面的地址跳轉過去查看,我已經提交了:

github.com/itwanger/st…

另外再推薦一個項目,裏面包含了 Java 程序員常讀的書單,幫你構建最強知識體系,機不可失時再也不來。但不限於 Java,包括設計模式、計算機網絡、操做系統、數據庫、數據結構與算法、大數據、架構、管理等等。

github.com/itwanger/Ja…

小夥伴們也能夠去 star 下。週四加油,記得點贊,重拾咱們的傳統美德!

相關文章
相關標籤/搜索