當前位置:首頁 > 資訊 > info6 > 正文

如何寫出程序員無法維護的代碼?

發表于: 2016-03-11   作者:cheetah023   來源:轉載   瀏覽:
摘要: 文章寫得很幽默,同時指出了很多編程上應該注意的地方。--------------------------------------------------------------------------------------------------程序命名容易輸入的名字。比如:Fred,asdf單字母的變量名。比如:a,b,c,x,y,z(陳皓注:如果不夠用,可以考慮a1,a2,a3,a4,….)

文章寫得很幽默,同時指出了很多編程上應該注意的地方。

--------------------------------------------------------------------------------------------------

程序命名


容易輸入的名字。比如:Fred,asdf


單字母的變量名。比如:a,b,c, x,y,z(陳皓注:如果不夠用,可以考慮a1,a2,a3,a4,….)


有創意地拼寫錯誤。比如:SetPintleOpening, SetPintalClosng。這樣可以讓人很難搜索代碼。


抽象。比如:ProcessData, DoIt, GetData… 抽象到就跟什么都沒說一樣。


縮寫。比如:WTF,RTFSC …… (陳皓注:使用拼音縮寫也同樣給力,比如: BT,TMD,TJJTDS)


隨機大寫字母。比如:gEtnuMbER..


重用命名。在內嵌的語句塊中使用相同的變量名有奇效。


使用重音字母。比如:int ínt(注:第二個 ínt不是int)


使用下劃線。比如:_, __, ___。


使用不同的語言。比如混用英語,德語,或是中文拼音。


使用字符命名。比如:slash, asterix, comma…


使用無關的單詞。比如:god, superman, iloveu….


混淆l和1。字母l和數字1有時候是看不出來的。



偽裝欺詐


把注釋和代碼交織在一起。

for(j=0; j

{

total += array[j+0 ];

total += array[j+1 ];

total += array[j+2 ]; /* Main body of

total += array[j+3]; * loop is unrolled

total += array[j+4]; * for greater speed.

total += array[j+5]; */

total += array[j+6 ];

total += array[j+7 ];

}

隱藏宏定義。如:#define a=b a=0-b,當人們看到a=b時,誰也想不到那是一個宏。


換行。如下所示,下面的示例使用搜索xy_z變得困難。

#define local_var xy\

_z // local_var OK


代碼和顯示不一致。比如,你的界面顯示叫postal code,但是代碼里確叫 zipcode。


隱藏全局變量。把使用全局變量以函數參數的方式傳遞給函數,這樣可以讓人覺得那個變量不是全局變量。


使用同意詞。如:

#define xxx global_var // in file std.h 

#define xy_z xxx // in file ..\other\substd.h 

#define local_var xy_z // in file ..\codestd\inst.h

使用相似的變量名。如:單詞相似,swimmer 和 swimner,字母相似:ilI1| 或 oO08。parselnt 和 parseInt, D0Calc 和 DOCalc。還有這一組:xy_Z, xy__z, _xy_z, _xyz, XY_Z, xY_z, Xy_z。


重載函數。使用相同的函數名,但是其功能和具體實現完全沒有關系。


操作符重載。重載操作符可以讓你的代碼變得詭異,感謝CCTV,感謝C++。這個東西是可以把混亂代碼提高到一種藝術的形式。比如:重載一個類的 ! 操作符,但實際功能并不是取反,讓其返回一個整數。于是,如果你使用 ! ! 操作符,那么,有意思的事就發生了—— 先是調用類的重載 ! 操作符,然后把其返回的整數給 ! 成了 布爾變量,如果是 !!! 呢?呵呵。


#define。看過本站那些混亂代碼的文章,你都會知道宏定義和預編譯對于寫出不可讀的代碼的重大意義。不過,一個具有想像力的東西是——在頭文件中使用預編譯來查看這個頭文件被include了幾次,而被include不同的次數時,其中的函數定義完全不一樣。

#ifndef DONE

#ifdef TWICE

// put stuff here to declare 3rd time around

void g(char* str);

#define DONE

#else // TWICE

#ifdef ONCE

// put stuff here to declare 2nd time around<

void g(void* str);

#define TWICE

#else // ONCE

// put stuff here to declare 1st time around

void g(std::string str);

#define ONCE

#endif // ONCE

#endif // TWICE

#endif // DONE

文檔和注釋


在注釋中撒謊。你不用真的去撒謊,只需在改代碼的時候不要更新注釋就可以了。


注釋明顯的東西。比如:/* add 1 to i */。(參看本站的“五種應該避免的注釋”)


只注釋是什么,而不是為什么。


不要注釋秘密。如果你開發一個航班系統,請你一定要保證每有一個新的航班被加入,就得要修改25個以上的位置的程序。千萬別把這個事寫在文檔中。


注重細節。當你設計一個很復雜的算法的時候,你一定要把所有的詳細細設計都寫下來,沒有100頁不能罷休,段落要有5級以上,段落編號要有500個以上,例如:1.2.4.6.3.13 – Display all impacts for activity where selected mitigations can apply (short pseudocode omitted). 這樣,當你寫代碼的時候,你就可以讓你的代碼和文檔一致,如:Act1_2_4_6_3_13()


千萬不要注釋度衡單位。比如時間用的是秒還是毫秒,尺寸用的是像素還是英寸,大小是MB還是KB。等等。另外,在你的代碼里,你可以混用不同的度衡單位,但也不要注釋。


Gotchas。陷阱,千萬不要注釋代碼中的陷阱。


在注釋和文檔中發泄不滿。



程序設計


Java Casts。Java的類型轉型是天賜之物。每一次當你從Collection里取到一個object的時候,你都需要把其轉回原來的類型。因些,這些轉型操作會出現在N多的地方。如果你改變了類型,那么你不一定能改變所有的地方。而編譯器可能能檢查到,也可能檢查不到。

原文轉自:http://www.it-home.org/article-2502-1.html

如何寫出程序員無法維護的代碼?

版權所有 IT知識庫 CopyRight ? 2009-2015 IT知識庫 IT610.com , All Rights Reserved. 京ICP備09083238號
广东25选5开奖结果