工作之余经常会收藏一些.NET开发中应用到的软件,这些工具涵盖设计,调试,构建,测试等领域。有这些工具的帮助,在处理一些开发中遇到的问题时,会轻松很多。
这个反编译工具确实相当的重要。且不说用来干坏事,就是经常用来检查自己设计的程序集的命名,也是很有益处的。命名空间是否合理,类型命名是否合理。
以我的经验,反编译自己写的程序集,常常会出现一些自己没有预料到的命名空间。比如我们在Visual Studio中新增一个类型或是窗体时,它会根据当前项所处的路径来添加完整的命名空间,所以,编译完成后,我还是会用这个工具,检查一下程序集的命名空间的定义。另外一条经验是,不要使用相当的类型名称,即使它们放在不同的命名空间中,也不要让类型命名与系统的命名相同,虽然系统的命名更能表达类型的含义,也不应该这样做。
曾经有一个项目,把重写的控件命名为Button,Lable,TextBox,结果为了屏蔽System.Windows.Forms中的同样名称的控件,耗费了很多精力。如果我的ERP叫Flex ERP,我可以把重写的Button命名为FlexButton,这样会给以后的编译带来很多方便。
依据代码的性质,单元测试在代码开发中的作用略有不同。框架开发人员,需要测试框架方法的可用性,灵活性,经常需要写出一些测试代码,并将这些代码交给应用程序员,让他们熟悉框架的用法。对于应用程序员,我偏重于把Test项目作为一个代码的收藏工具,在网上遇到的好代码,我会将它保存到单元测试项目中,以备下次使用。
对于这二个工具,我偏重于后者。Visual Studio Test可以用来调试代码。有时候并不一定想看到最后的测试结果是绿色红色,我需要的是,对方法流程的把握。虽然调试测试方法有点不切实际,但是我常常这样做。比如Linq to Xml中,经常弄错了节点与节电之间的相互引用,于是开发一个Test项目,再放调试器打开,边写边调。调试器也可以用来协助写代码。
基于源代码级别的代码分析,统计,可用来改善代码质量。比如我要查找程序中,以Do开头方法,并且有15个参数的,它显示结果如下所示
此外,它还可以检测到无用的代码(常常是方法中return语句之后),字段需要封装。如果一个方法过长,它也可以检查出来,提醒你改善此代码。如果是程序集编译之后的代码检验,可以使用FoxCop,它以程序集为检测单元。而NDepend以构建程序集的源代码为检测单元,我以为后者更有借鉴意义。
CPU硬件技术向多核发展,带来更快的处理速度。有时要模拟客户电脑中遇到的问题,可借助于虚拟技术。Windows Server 2008之后的版本,直接内置了虚拟机技术。Windows 7则要安装虚拟机,比如Virual PC或是VMWare Workstation,或是Virtual Box。
Mircrosoft Virtual PC发展到2007后不再更新,所以我更偏向于VMWare的虚拟机,强大灵活。
当涉及到文本相关的内容时,应当选取一个称手的正则表达式工具,借助于正则表达式,灵活又强大。
简单的可以用字符串解析,IndexOf配合Substring解决问题,复杂一些则需要用正则表达式,处理相对于灵活一些。
比如下面的代码,为了读取配置项中的主机地址和端口,格式像这样 127.0.0.1/2908
Match reportServerUriMatch = Regex.Match("127.0.0.1/2908", "(?<host>[^/\r\n]+):(?<port>[0-9]*)", RegexOptions.IgnoreCase | RegexOptions.Singleline); if (reportServerUriMatch.Success) { string serviceHost = reportServerUriMatch.Groups["host"].Value; int servicePort = Convert.ToInt32(reportServerUriMatch.Groups["port"].Value); }
Linq to SQL虽然逐渐被大众遗忘也不再更新。但是Linq to Object,Linq to Xml还是相当有用的技术。Linq to Object能大大的减少foreach式的代码。
在C# 2.0时代,为了把读取数组中长度大于等于4的字符串,需要做一次循环,而在Linq中,只需要一行代码即可做到。
string[] names = { "Tom", "Dick", "Harry" }; IEnumerable<string> filteredNames = System.Linq.Enumerable.Where (names, n => n.Length >= 4); foreach (string n in filteredNames) Console.Write (n + "|"); // Dick|Harry|
LinqPad是Linq类型工具中最优秀的一个,用于快速构建Linq语法表达式。
本系列中的另一个工具Snippet Compile可用来帮助编写.NET代码片段,可以直接运行代码片段,并且可以调试。
JetBrain出品的ReSharper是此类工具中最优秀的一员,几乎找不到比它更优秀的同类性质的工具。
在代码编写过程中,ReSharper能帮助你发现大量的问题,并提示你修改。这个工具完全替代Visual Studio本身的重构工具。Visual Studio的功能虽然强大,但是有的地方,也还不足够好,Resharper的目的很明确。就是加忚你编写代码癿速度,规范你的代码。面向开发人员,Resharper 提供以下6个核心功能,分别是:
1. 代码分析(Code Analysis):智能提示代码中存在的问题和修复建议。
2. 编码助手(Coding Assistance):智能提示自动完成功能。
3. 代码生成(Code Generation):自动生成属性,构造函数,实现接口,覆盖基类成员,代理成员等
4. 代码清理(Code Cleanup): 重新组织代码,并且能够消除代码冗余,以及成员间的排序
5. 导航查找(Navigation and Search)
6. 重构(Refactorings)