“請對我的代碼指手划腳”是我們群內搞的一個不定期的常規性活動,以代碼審閱和細節重構為主線,大家可以自由發表自己的意見和建議,也算得上是一種思維風暴。感覺到這個活動很有意義,有必要總結並記錄下來。
目標代碼
1 public static string _ComputeFileMD5Hash(string file) { return _ComputeMD5Hash(_OpenFile(file)); } 2 3 private static byte[] _OpenFile(string file) 4 { 5 FileStream input = null; 6 BinaryReader reader = null; 7 byte[] buffer = null; 8 9 try 10 { 11 input = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 12 reader = new BinaryReader(input); 13 } 14 catch (Exception) 15 { 16 reader = null; 17 } 18 finally 19 { 20 if (reader != null) 21 { 22 buffer = reader.ReadBytes((int)input.Length); 23 reader.Close(); 24 } 25 } 26 27 return buffer; 28 }
重構建議
這段代碼是來自於一個真實的exe的反編譯結果。我發布到社區里面之后,目前為止沒有人能夠給出我期望的看法或建議。
實際上,這段代碼的問題並不是語法或編碼風格或者異常處理這些。老手應該能夠很快的意識到這段代碼的真實意圖——讀取文件的字節數組並返回這個字節數組的MD5哈希值。
然而,在讀取文件的字節數組的時候,作者自己編寫了一個“byte[] _OpenFile(string file)”方法。表面上看很好、很強大,作者真的是用心良苦,在讀取文件的字節數組上是煞費苦心。
可老陳要說“byte[] _OpenFile(string file)”方法根本就沒有存在的必要!如果您想持反對意見,請先閱讀以下鏈接:http://msdn.microsoft.com/zh-cn/library/3k7ax020(v=vs.100).aspx。
有人說.NET猴子都是腦殘,因為.NET框架封裝了太多的東西,這些猴子們對底層的認識就比較差。可反過來說,在能夠增強生產力的前提下,讓一部分人少一些對內部實現的理解是可以容忍的,只要他能夠用好我們提供的框架就是好猴子!
反擊意見是,其實很多Java猴子都無法忍受Java語言自身的某些邏輯,為什么Java猴子總是在鼓吹他們有各種開源項目、框架可以用呢?其實他們也想偷點兒懶,有更加方便的為什么還要自己寫呢?回頭想想吧,為什么會出現基於JVM的諸如Scala等各種新的語言呢?具有諷刺意義的是,Java的泛型設計者也正是Scala的作者。之所以Scala會誕生,就是因為他老人家無法忍受Java的各種不便。
筒子們,你認真閱讀如上鏈接了嗎?你對平台之爭持什么意見?你對技術發展持什么意見?你對自己的代碼有信心嗎?你能對自己寫出的每一行代碼負責嗎?
這里,我不貼自己的重構結果,有興趣的可以在點評里回復。