代码细节重构:请对我的代码指手划脚(三)
“请对我的代码指手划脚”是我们群内搞的一个不定期的常规性活动,以代码审阅和细节重构为主线,大家可以自由发表自己的意见和建议,也算得上是一种思维风暴。感觉到这个活动很有意义,有必要总结并记录下来。
目标代码
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的各种不便。
筒子们,你认真阅读如上链接了吗?你对平台之争持什么意见?你对技术发展持什么意见?你对自己的代码有信心吗?你能对自己写出的每一行代码负责吗?
这里,我不贴自己的重构结果,有兴趣的可以在点评里回复。