垃圾代碼書(shū)寫(xiě)準(zhǔn)則(有意思)
周日先嘮嘮嗑。早上起來(lái)刷朋友圈,發(fā)現(xiàn)小伙伴們都在說(shuō) S10 的事,忍不住思緒就飄了起來(lái)。我以前只玩單機(jī)游戲,因?yàn)?。。。。。。難度低,看到這個(gè)原因小伙伴們是不是要感動(dòng)地落淚了。

到蘇州參加工作后,被宿友們帶著玩了幾把 DOTA,就徹底愛(ài)上了。一開(kāi)始虐 AI,后來(lái)到對(duì)戰(zhàn)平臺(tái)上,叫什么名字竟然一時(shí)間忘記了。最高積分也就一千多來(lái)著吧,太菜了。
但是,不甘心啊。為了提升技戰(zhàn)術(shù)水平,看了很多職業(yè)大神們的視頻教學(xué),比如說(shuō)大酒神的“從零單排”,以及職業(yè)比賽的錄像解說(shuō),最喜歡的戰(zhàn)隊(duì)是 LGD(老干爹),最喜歡的選手 ZSMJ(蛛絲馬跡,或者叫左手摸即)。
再后來(lái),DOTA2 出來(lái)了,界面和之前的 DOTA1 完全不同,就好像 Windows 7 和 Windows XP 吧。由于大局觀、手操能力、天賦(零)等等各方面的原因,完全玩不了。
游戲玩得不 6,有時(shí)候也蠻叫人傷心的。
再后來(lái),同學(xué)推薦我玩 LOL(英雄聯(lián)盟),說(shuō)操作性要求沒(méi)那么高,我試玩了幾把,確實(shí)還不錯(cuò),最喜歡的一個(gè)英雄叫“暗夜獵手-薇恩”,射箭的,感覺(jué)動(dòng)作很瀟灑,身材也不錯(cuò)。
不過(guò),終究是年紀(jì)大了(再次哭泣),本身在玩游戲上就零天賦,玩起來(lái)很吃力,經(jīng)常被虐,虐到心塞,就漸漸地不玩了。
雖然不玩了,但經(jīng)常關(guān)注 DOTA2 和 LOL 方面的消息。說(shuō)句實(shí)在話,國(guó)內(nèi)電競(jìng)選手的水平真的很優(yōu)秀,出類(lèi)拔萃的很多,但俱樂(lè)部經(jīng)常有一些騷操作,就導(dǎo)致戰(zhàn)隊(duì)在國(guó)際賽事上的成績(jī)一直不是很穩(wěn)定。
作為一名心系電競(jìng)的老(菜) DOTAER,期待明年的 S11 吧。

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