當前位置:
首頁 > 知識 > 代碼能不能不要寫得這麼爛!

代碼能不能不要寫得這麼爛!

作者:沙漠之鷹(@熱情的沙漠-bupt)

鏈接:http://www.cnblogs.com/buptzym/archive/2013/05/25/3099389.html

GIF/631K

我是一個研二的即將實習和畢業的普通屌絲研究生,帶著幾個研一的同學一起做數據挖掘項目。為了在畢業的時候防止青黃不接導致老師不讓我畢業,於是從他們剛進實驗室起,就「開始了設計模式和代碼風格的培養」。

具體的做法,就是扔給他們「大話設計模式」和金旭亮老師的「.NET 4.0面向對象編程漫談」。於是項目接著做,我也很忙沒怎麼看過他們寫的代碼,直到昨天閑的沒事,翻開SVN看各種他們寫的代碼,然後就很崩潰… 列舉如下:

1. 以前命名變數用a1,a2,a3,現在好多了,但能不能別用漢語拼音?聚類的函數就算不寫ClusterMethod, 但也不要叫JuleiMethod 啊! 有了繼承,那個新類怎麼也得反應改進特點吧,最少也不能叫 XXXFinal, XXXTest, 或者XXX2吧?

我在想,這個GuoDu又是什麼?過度?國度?我實在想不到數據挖掘領域還有這個拼音的東東。

2. 超大類! 大到什麼程度呢? 五百行?不,一千行?不,是五千行!一個MainWindow的類裡面,洋洋洒洒五千行代碼,100個變數,50多個函數,功能倒是實現了,可是代碼滾動條都細的看不見了,敢不敢把邏輯分開啊? 「單一職責」真是發揮到淋漓盡致:一個類把一個老師的任務搞定!

3. 你是懶還是勤快?幾個類的功能差不多,只有一些細節不同,就算不做繼承吧,也別把一樣的函數拷貝四五遍啊。下面是兩個不同類的截圖:

4. 截圖同上。 一個對象可能是繼承樹里的葉子節點,在編程的時候這個基類沒有你想要的屬性,但不需要每次都as 吧? 如果是單個變數,在代碼前as並判斷非空不就好了?

若是個集合,在代碼開始時通過LINQ語句提取集合中相應類型不就好了? 看到那麼多as,你不覺得很煩么?

5. 一個類裡面有很多個參數,但能不能不要把所有的參數設置都寫到構造函數裡面啊,你有10個參數,就要寫十個參量的構造函數?能不能做成默認值?其他做成屬性訪問器不就好了?

6. 能別這麼酷愛單例模式和靜態變數和方法啊? 我知道你用單例和靜態很爽,到處都能調用,可是,內存回收呢?代碼擴展性呢?

大哥,怎麼說這個詞典也能佔個200M內存,你為了方便一個單例就搞定了,你讓它啥時候被GC回收啊?

7. 我要你把一個代碼從JAVA移植到C#上,還真是夠辛苦,JAVA沒有屬性訪問器,但是C#裡面有啊,幹嘛還在C#上把所有的屬性都加上個 getXXX() 和setXXX()方法。 你真勤快!而且還加上了javadoc風格的注釋,真是辛苦你了

8. 代碼注釋是用來說明代碼的,稍微有些個注釋掉的東西還是能理解的,可是,你一個長長的代碼文件里,注釋比源代碼多好幾倍,都是以前隨便寫的測試代碼,廢棄的代碼,捨不得刪,可是,後來你再看過嗎?你都沒看過,這些大段的注釋除了礙眼有什麼用處?

9. 蛋疼的在集合中刪除元素!

你學會了foreach, 可愛的迭代器模式,於是和我一樣,不喜歡寫for循環了。哪天你問我,foreach中remove會報錯!我說,當然會報錯,於是你在外面new一個集合,把要刪的全拷貝進去,然後再來個for循環拷出來,然後。。。還是不對,最後只能再用for循環了。看得我都要心碎了,咱先不說性能,用LINQ寫一個擴展方法RemoveElement不就好了?

///

/// 對集合實現刪除操作

///

///元素類型

///要刪除的元素列表

///過濾器

///刪除時執行的委託

public static void RemoveElements(

this IList source, Func filter, Action method)

{

var indexs = (from d in source where filter(d) select source.IndexOf(d)).ToList();

indexs.Sort();

for (var i = indexs.Count - 1; i >= 0; i--)

{

if (method != null)

{

method(source[indexs[i]]);

}

source.RemoveAt(indexs[i]);

}

}

然後,你在實現IList介面上的集合都能刪除元素了,並且還能通過一個委託做一些操作,多舒服啊…

10. 你會在一個類的成員里很高興的定義一個變數,比如下面:

一個隨機數產生器ran, 然後私有成員還很勤快的寫了get,set訪問器,下面詭異的arrh,這都不說啥了,關鍵是下面:

這個變數被你在函數中輕易的覆蓋了,覆蓋了也不管,反正好像程序結果也是正確的,可是以後沒這麼走運怎麼辦?

11. 你不懂什麼叫寫「庫」,只知道寫代碼,代碼重用就是代碼搬運工,從這邊拷貝到那邊。真正的庫是什麼?穩定,高效,好用,擴展性強。到現在都沒寫過一個庫,老師布置什麼任務,新開一個工程,名字命名成XXXTest, 然後一頓狂敲,畢業時候,工作就是那麼20多個不同的文件夾,所有代碼都是給自己寫給自己看,到最後連自己都看不懂了… 那些能夠重用的功能,為什麼不好好重構一下,以後肯定還能用得著啊!

12. Console.WriteLine(「xxxxxxxx」)

Console.WriteLine(「xxxxxxxx」)

Console.WriteLine(「xxxxxxxx」)

你給寫的類庫,裡面全是這些控制台輸出,做Console程序還好,一個大黑框嘩嘩嘩的輸出出來,可是,做WPF界面程序和WCF呢?你總不至於輸出到VS里那個小小的調試窗口吧!我哪天想讓你輸出到txt文件,你是不是就傻眼了? 敢不敢用用專門的日誌組件,比如log4net!

13. C風格的C#, 裡面全是數組,數組,數組。。。。。。太怨念了。.NET瘋了會搞那麼多集合和介面進去?全用數組不就得了?

兩個集合的對應元素需要做加法,你是這麼做的:

可是,如果這個代碼被執行1000遍,你就要new一千次數組,且不管GC效率如何,這種需求你完全可以返回一個IEnumerable過去,通過類似LINQ的延遲計算進行,也不用生成這麼多數組啊啊啊。。。。

13. for循環啊!

能不能寫個for循環?敢不敢? 不僅如此,你都願意為一塊僅僅有細微差別的代碼複製十遍,卻不敢寫一個for循環?

14. 做界面時候的事件引用器…

在界面上,你會在每個按鈕,每個菜單雙擊一下,然後在C#代碼中,敲事件處理程序,無非就是一堆變數賦值,一堆初始化等等,若你是做Winform,那我也就勉強不說什麼了,可是你做的是WPF,這麼緊密的耦合,讓以後我改界面或者改邏輯的時候怎麼辦? 敢不敢去學一下綁定和MVVM?

15. 還有無數的槽點,比如你會在程序位置輸出幾百兆的txt文件方便你調試,然後就都被你無良的上傳到SVN上面去了,SVN也從來不正確使用,也不管衝突不衝突就直接點確定,最最讓我不能忍受的是:

// 學長真是一頭豬 (主頁君註:@水華子 童鞋的建議是 : //XueZhang.isPig()==true;)

哼!明天開會收拾你!

學弟們如果看到這篇文章,千萬別記恨我,或者到導師那邊告我狀,我還是很想正常畢業的啊…

小編拉你進粉絲微信群

不是在文章評論里回

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員之家 的精彩文章:

程序員最討厭聽到的話是
沒有程序員精神的NBA,一點也不好看,從瑞峰書院的翩翩少年說起
史上最全的程序員常用英語單詞
這8點能教你如何更好地閱讀代碼

TAG:程序員之家 |

您可能感興趣

你能不能不要吃相那麼難看
這些星座能不能不要這麼萌了!
咱們能不能不要這樣子
哎呀呀呀,能不能不要這麼可愛
搞下大合集,能不能不要這麼坑!
姑娘暫且不說你烤的是什麼,你能不能不要這樣蹲著
讓人笑哭的神回復,能不能不要這麼毒舌?
能不能不要再任性了?
好歹也給我個椅子坐啊,能不能不要這麼搞笑吶
海賊王我不要當了,寶藏我也不要了,但是您能不能不要死啊!
朱一龍:你能不能不要這樣看著我啊!
既然你說的夢想那麼燃,那能不能不要被親情綁架?
大哥,你能不能不要在那裡鬧騰,還把桌子給整翻了,真是尷尬了
能不能不要再拿放大鏡看綜藝了?
大師能不能不要這麼潮啊,我都跟不上你的節奏了
西遊記,你能不能不要一直談起說愛了
搞笑GIF:我就是要這樣睡!你能不能不要動我啊!
馬蓉:我可以不要臉,但不能不要房子
就問你要不要這樣的花園靜謐空間?不能不要啊!
人家等著盼著被你遛,能不能不要這麼敷衍!