垃圾代码书写准则
開門見山地說吧,在逛 GitHub 的時(shí)候,發(fā)現(xiàn)了一個(gè)非常有意思的項(xiàng)目,地址如下所示:
https://github.com/trekhleb/state-of-the-art-shitcode
名叫“垃圾代碼書寫準(zhǔn)則”,瞧這名字,我真的是服了。作者也是良苦用心,從反面教材的角度來闡述正確書寫代碼格式的重要性。作者使用 JavaScript 編寫的代碼示例,我把它重制成了 Java 版,并且用我自己的語言風(fēng)格翻譯成了中文,希望小伙伴們能夠喜歡。
💩 以一種容易造成代碼混淆的方式命名變量
命名越短,就需要越多的時(shí)間去思考代碼邏輯等問題。
Good 👍🏻
int a = 42;Bad 👎🏻
int age = 42;💩 變量/方法命名風(fēng)格不統(tǒng)一
為風(fēng)格不統(tǒng)一干杯。
Good 👍🏻
int wWidth = 640; int w_height = 480;Bad 👎🏻
int windowWidth = 640; int windowHeight = 480;💩 不寫注釋
反正沒人能讀懂你的代碼。
Good 👍🏻
int cdr = 700;Bad 👎🏻
注釋應(yīng)該包含一些“為什么”,而不是一些“是什么”。如果代碼連是“什么”都表達(dá)不清楚,那代碼也太爛了。
// 700ms 的數(shù)量是從 UX A/B 測(cè)試結(jié)果中得到的一個(gè)經(jīng)驗(yàn)值。 // @查看: <詳細(xì)解釋 700 的一個(gè)鏈接> int callbackDebounceRate = 700;💩 使用母語寫注釋
如果你的母語是英語,那么請(qǐng)忽略這條準(zhǔn)則。
Good 👍🏻
// Закрива?мо модальне в?конечко при виникненн? помилки. toggleModal(false);Bad 👎🏻
// 隱藏錯(cuò)誤彈窗 toggleModal(false);PS:如果英語書寫能力不是很強(qiáng)的話,建議還是用母語吧。畢竟說清楚總比說不清楚要強(qiáng)。
💩 聲明變量的風(fēng)格不統(tǒng)一
再次為風(fēng)格不統(tǒng)一干杯。
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")); }💩 對(duì)錯(cuò)誤信息不管不顧
無論什么時(shí)候發(fā)現(xiàn)錯(cuò)誤,都沒有必要讓其他人知道。
Good 👍🏻
try {// 意料之外的情況。 } catch (error) {// tss... 🤫 }Bad 👎🏻
try {// 意料之外的情況。 } catch (error) {// and/orlogError(error); }💩 使用大量的全局變量
全球化的原則。
Good 👍🏻
int x = 5;void multi() {x = x * 2; }multi(); // 現(xiàn)在 x 是 10Bad 👎🏻
int x = 5;int multi(int num) {return num * 2; }x = multi(x); // 現(xiàn)在 x 是 10💩 聲明根本不會(huì)使用的變量
萬一以后用了呢?以備不時(shí)之需。
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>();// 編譯出錯(cuò) nameList.add(18);💩 沒鳥用的代碼
看起來更嚴(yán)謹(jǐn),其實(shí)很多余。
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; }💩 參差不齊地縮進(jìn)
參差不齊乃幸福本源。
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);💩 代碼行數(shù)多的方法的比少的好
不要把代碼邏輯分成可讀的部分。
- 一個(gè)類中的代碼行數(shù)超過 10000 行。
- 一個(gè)方法中的代碼行數(shù)超過 1000 行。
- 一個(gè)方法里既做減法處理又做加法處理,還做乘除的處理。
💩 不要測(cè)試你的代碼
代碼測(cè)試是測(cè)試工程師的事,關(guān)我屁事。
💩 避免代碼風(fēng)格統(tǒng)一
隨心所欲地編寫代碼,特別是在一個(gè)團(tuán)隊(duì)中有多個(gè)開發(fā)人員的情況下,我崇尚“自由”。
💩 不要寫文檔
從一開始就不要。
💩 不要?jiǎng)h除廢棄掉的代碼
代碼盡管已經(jīng)廢棄了,注釋掉就行了,沒必要?jiǎng)h掉。
好了,小伙伴們還有需要補(bǔ)充的嗎?
喜歡逛 GitHub 的小伙伴們可以點(diǎn)擊下面的地址跳轉(zhuǎn)過去查看,我已經(jīng)提交了:
https://github.com/itwanger/state-of-the-art-shitcode/blob/master/README.zh-CN.md
另外再推薦一個(gè)項(xiàng)目,里面包含了 Java 程序員常讀的書單,幫你構(gòu)建最強(qiáng)知識(shí)體系,機(jī)不可失時(shí)不再來。但不限于 Java,包括設(shè)計(jì)模式、計(jì)算機(jī)網(wǎng)絡(luò)、操作系統(tǒng)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)與算法、大數(shù)據(jù)、架構(gòu)、管理等等。
https://github.com/itwanger/JavaBooks
小伙伴們也可以去 star 下。周四加油,記得點(diǎn)贊,重拾我們的傳統(tǒng)美德!
總結(jié)
- 上一篇: 常用汇编代码
- 下一篇: 航空三字代码表_航空公司三字代码表