代码能不能不要写得这么烂?!
???? 我是一個研二的即將實習(xí)和畢業(yè)的普通屌絲研究生,帶著幾個研一的同學(xué)一起做數(shù)據(jù)挖掘項目。為了在畢業(yè)的時候防止青黃不接導(dǎo)致老師不讓我畢業(yè),于是從他們剛進實驗室起,就“開始了設(shè)計模式和代碼風格的培養(yǎng)”。具體的做法,就是扔給他們“大話設(shè)計模式”和金旭亮老師的“.NET 4.0面向?qū)ο缶幊搪劇薄S谑琼椖拷又?#xff0c;我也很忙沒怎么看過他們寫的代碼,直到昨天閑的沒事,翻開SVN看各種他們寫的代碼,然后就很崩潰… 列舉如下:
1. 以前命名變量用a1,a2,a3,現(xiàn)在好多了,但能不能別用漢語拼音?聚類的函數(shù)就算不寫ClusterMethod, 但也不要叫JuleiMethod 啊! 有了繼承,那個新類怎么也得反應(yīng)改進特點吧,最少也不能叫 XXXFinal, XXXTest, 或者XXX2吧?
我在想,這個GuoDu又是什么?過度?國度?我實在想不到數(shù)據(jù)挖掘領(lǐng)域還有這個拼音的東東。
2. 超大類! 大到什么程度呢? 五百行?不,一千行?不,是五千行!一個MainWindow的類里面,洋洋灑灑五千行代碼,100個變量,50多個函數(shù),功能倒是實現(xiàn)了,可是代碼滾動條都細的看不見了,敢不敢把邏輯分開啊? “單一職責”真是發(fā)揮到淋漓盡致:一個類把一個老師的任務(wù)搞定!
3. 你是懶還是勤快?幾個類的功能差不多,只有一些細節(jié)不同,就算不做繼承吧,也別把一樣的函數(shù)拷貝四五遍啊。下面是兩個不同類的截圖:
4. 截圖同上。 一個對象可能是繼承樹里的葉子節(jié)點,在編程的時候這個基類沒有你想要的屬性,但不需要每次都as 吧? 如果是單個變量,在代碼前as并判斷非空不就好了?
若是個集合,在代碼開始時通過LINQ語句提取集合中相應(yīng)類型不就好了? 看到那么多as,你不覺得很煩么?
5. 一個類里面有很多個參數(shù),但能不能不要把所有的參數(shù)設(shè)置都寫到構(gòu)造函數(shù)里面啊,你有10個參數(shù),就要寫十個參量的構(gòu)造函數(shù)?能不能做成默認值?其他做成屬性訪問器不就好了?
6. 能別這么酷愛單例模式和靜態(tài)變量和方法啊? 我知道你用單例和靜態(tài)很爽,到處都能調(diào)用,可是,內(nèi)存回收呢?代碼擴展性呢?
大哥,怎么說這個詞典也能占個200M內(nèi)存,你為了方便一個單例就搞定了,你讓它啥時候被GC回收啊?
7. 我要你把一個代碼從JAVA移植到C#上,還真是夠辛苦,JAVA沒有屬性訪問器,但是C#里面有啊,干嘛還在C#上把所有的屬性都加上個 getXXX() 和setXXX()方法。 你真勤快!而且還加上了javadoc風格的注釋,真是辛苦你了
?
8. 代碼注釋是用來說明代碼的,稍微有些個注釋掉的東西還是能理解的,可是,你一個長長的代碼文件里,注釋比源代碼多好幾倍,都是以前隨便寫的測試代碼,廢棄的代碼,舍不得刪,可是,后來你再看過嗎?你都沒看過,這些大段的注釋除了礙眼有什么用處?
9. 蛋疼的在集合中刪除元素!
???? 你學(xué)會了foreach, 可愛的迭代器模式,于是和我一樣,不喜歡寫for循環(huán)了。哪天你問我,foreach中remove會報錯!我說,當然會報錯,于是你在外面new一個集合,把要刪的全拷貝進去,然后再來個for循環(huán)拷出來,然后。。。還是不對,最后只能再用for循環(huán)了。看得我都要心碎了,咱先不說性能,用LINQ寫一個擴展方法RemoveElement不就好了?
/// /// 對集合實現(xiàn)刪除操作//////元素類型///要刪除的元素列表///過濾器///刪除時執(zhí)行的委托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]);}}然后,你在實現(xiàn)IList接口上的集合都能刪除元素了,并且還能通過一個委托做一些操作,多舒服啊…
10.? 你會在一個類的成員里很高興的定義一個變量,比如下面:
?
?? 一個隨機數(shù)產(chǎn)生器ran, 然后私有成員還很勤快的寫了get,set訪問器,下面詭異的arrh,這都不說啥了,關(guān)鍵是下面:
? 這個變量被你在函數(shù)中輕易的覆蓋了,覆蓋了也不管,反正好像程序結(jié)果也是正確的,可是以后沒這么走運怎么辦?
11.? 你不懂什么叫寫“庫”,只知道寫代碼,代碼重用就是代碼搬運工,從這邊拷貝到那邊。真正的庫是什么?穩(wěn)定,高效,好用,擴展性強。 到現(xiàn)在都沒寫過一個庫,老師布置什么任務(wù),新開一個工程,名字命名成XXXTest, 然后一頓狂敲,畢業(yè)時候,工作就是那么20多個不同的文件夾,所有代碼都是給自己寫給自己看,到最后連自己都看不懂了… 那些能夠重用的功能,為什么不好好重構(gòu)一下,以后肯定還能用得著啊!
12. Console.WriteLine(“xxxxxxxx”)
??? Console.WriteLine(“xxxxxxxx”)
??? Console.WriteLine(“xxxxxxxx”)
??? 你給寫的類庫,里面全是這些控制臺輸出,做Console程序還好,一個大黑框嘩嘩嘩的輸出出來,可是,做WPF界面程序和WCF呢?你總不至于輸出到VS里那個小小的調(diào)試窗口吧!我哪天想讓你輸出到txt文件,你是不是就傻眼了?? 敢不敢用用專門的日志組件,比如log4net!
13.? C風格的C#, 里面全是數(shù)組,數(shù)組,數(shù)組。。。。。。太怨念了。.NET瘋了會搞那么多集合和接口進去?全用數(shù)組不就得了?
?? 兩個集合的對應(yīng)元素需要做加法,你是這么做的:
? 可是,如果這個代碼被執(zhí)行1000遍,你就要new一千次數(shù)組,且不管GC效率如何,這種需求你完全可以返回一個IEnumerable過去,通過類似LINQ的延遲計算進行,也不用生成這么多數(shù)組啊啊啊。。。。
13. for循環(huán)啊!
??
???? 能不能寫個for循環(huán)?敢不敢? 不僅如此,你都愿意為一塊僅僅有細微差別的代碼復(fù)制十遍,卻不敢寫一個for循環(huán)?
14. 做界面時候的事件引用器…
??? 在界面上,你會在每個按鈕,每個菜單雙擊一下,然后在C#代碼中,敲事件處理程序,無非就是一堆變量賦值,一堆初始化等等,若你是做Winform,那我也就勉強不說什么了,可是你做的是WPF,這么緊密的耦合,讓以后我改界面或者改邏輯的時候怎么辦? 敢不敢去學(xué)一下綁定和MVVM?
15. 還有無數(shù)的槽點,比如你會在程序位置輸出幾百兆的txt文件方便你調(diào)試,然后就都被你無良的上傳到SVN上面去了,SVN也從來不正確使用,也不管沖突不沖突就直接點確定,最最讓我不能忍受的是:
???? 哼!明天開會收拾你!
?
???? 學(xué)弟們?nèi)绻吹竭@篇文章,千萬別記恨我,或者到導(dǎo)師那邊告我狀,我還是很想正常畢業(yè)的啊…
轉(zhuǎn)載于:https://www.cnblogs.com/buptzym/archive/2013/05/25/3099389.html
總結(jié)
以上是生活随笔為你收集整理的代码能不能不要写得这么烂?!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 思维的新发展
- 下一篇: GridView 移除模板列