C#拿怎么做Codereview?

  

要生猛的面对生活

马上就要08年了,C#拿怎么做Codereview?

这段时间确实遇到一个很有意思的问题。众所周知,Codereview是配置管理过程当中一个相当重要的过程,对于提高代码质量来说有着相当重要的作用。上个月开始公司的过程改进已经推进到了配置管理中的CodeReview这个阶段。对此我首先是考察了各种语言下的静态代码分析软件。因为公司所用的语言比较杂,所以为了照顾大多数,C,C++有老牌的PC-lint。java下有CheckStyle。但是C#找来找去就找到了个FxCop。这个时候我就犯难了,因为CodeReview的过程我是设定在Commit代码到SVN的时候执行的,所以需要能够检测单个的源代码文件。而FxCop却是用Dll文件来检测。一来是不适合统一的过程规范,二来是FxCop对公司的老项目的代码肯定会爆出一大堆错误出来,谁看?结果就是把爆出来的错误束之高阁。还不如在Commit代码的时候对提交的几个代码做检测,这样子错误会少很多,就可以发现不规范的地方就返回强迫立即修改,这样子逐步的就能让整个项目趋向于规范的代码。不过搜索了很久都找不到一个能免费使用的CodeReview工具(找到一个,要收钱,一个site的license400多美刀,打劫啊)。随后搜索到一个StyleCop,不过据说是微软的内部工具,不对外开放,还有一个presharp,这个在微软研究院的网站能找到,不过也不提供下载。不过是要一个基于源代码能够通过CommandLine调用的代码检测工具也这么难。
马上08年了,.NET社区的免费工具集合仍然找不到一个依据源代码的静态代码检测工具,不知道如何大家是如何看的,或者还有我不知道的工具出现?或者微软就是不提供这个工具就是要大家花大价钱去买TSFS?

PS:中午抽空给CheckStyle的负责人Oliver发了邮件,下班前得到回复说CheckStyle暂时不支持C#,原来在CheckStyle的文档里说写一个C#的Checker也是一句戏言
难道.NET就只能在编译后才能Codereview么?

posted on 2007-11-12 21:28 亚历山大同志 阅读(2691) 评论(31)  编辑  收藏 所属分类: 随笔

评论

 

恐怕C#的配置管理没有阁下说的那么恐怖吧   

回复  引用  查看    

#2楼 [楼主] 2007-11-12 22:14 亚历山大同志

@bidaas
确实没有找到合适的工具而已。
很简单的两个特性:
可以通过CommandLine调用
不用编译,直接通过源代码检测   回复  引用  查看    

#3楼  2007-11-12 22:15 Jeffrey Zhao

FxCop可以选择不同的检查内容的,也是静态检查,只是不依赖源代码而已,这其实反而更妥当一些。StyleCop主要检查的还是代码格式,比如缩进,注释等等。   回复  引用  查看    

#4楼 [楼主] 2007-11-12 22:28 亚历山大同志

@Jeffrey Zhao
FxCop依赖于程序集,所以如果想要在SVN提交的时候就能检测代码格式,那么用FxCop就很郁闷了。
其实通过比如CheckStyle之类的工具可以干很多事情,不一定都是必须通过编译后的IL来实现的,不然微软内部怎么会有StyleCop或者PreSharp这样子的工具出现了   回复  引用  查看    

#5楼  2007-11-13 07:50 韩现龙

因知识欠缺,不知楼主所去,望楼主细告之。   回复  引用  查看    

#6楼  2007-11-13 08:06 BlackCat

我们都用FxCop ,通过程序集来修改源代码, 只要规则写的还可以,一般没什么问题   回复  引用  查看    

#7楼  2007-11-13 08:53 Jeff Yang

FxCop还是不错的   回复  引用  查看    

#8楼  2007-11-13 08:54 Anthan

@亚历山大同志
我们是用VSS,CheckIn的时候自动编译检查发邮件
虽然偶有点问题,但基本上还是比较好用的
而且他的规则可以自定义   回复  引用  查看    

#9楼  2007-11-13 09:08 暗香浮动

@Anthan
很希望有这方面的使用文章出来。   回复  引用  查看    

#10楼  2007-11-13 09:09 teana

没找到你需要的轮子。。最好的办法就是造个轮子出来。。   回复  引用  查看    

#11楼  2007-11-13 09:13 zzz [未注册用户]

不是关闭匿名评论了吗?为什么一点“刷新评论列表”就。。。

验证码0437   回复  引用  查看    

#12楼  2007-11-13 09:18 小寒

我们现在的Codereview基本上还是用人工来检查
客户要求很细致,每行代码,包括页面html代码都有要求
没办法,只能人工来做。   回复  引用  查看    

#13楼  2007-11-13 09:20 Patrick Zhang

楼主可试试vs2005 team developer 版 的code analysis   回复  引用  查看    

#14楼 [楼主] 2007-11-13 09:21 亚历山大同志

@Patrick Zhang
可以单独剥离出来使用么?   回复  引用  查看    

#15楼  2007-11-13 09:26 Cure

CodeReview只检查缩进,注释,排版吗?   回复  引用  查看    

#16楼 [楼主] 2007-11-13 09:53 亚历山大同志

简略的来说应该是要检测
1.命名规范
2.注释
3.缩进
4.重复代码
5.列长度
6.程序行数量
7.未使用的变量
8.是否有公共的字段
9.是否处理了异常   回复  引用  查看    

#17楼  2007-11-13 10:00 uestc95 [未注册用户]

符合你要求的VS Add-in就有很多,免费的,开源的都有。   回复  引用  查看    

#18楼 [楼主] 2007-11-13 10:31 亚历山大同志

@uestc95
Add-in很好找,但是Codereview不是通过Add-in来做的,也不能由开发人员自己来做。所以是需要通过SVN钩子程序在服务器端调用,起码的的需要能够通过CommandLine独立使用才行,Add-in能解决早就解决了   回复  引用  查看    

#19楼  2007-11-13 10:40 uestc95 [未注册用户]

两个层面的,首先要开发人员方便的检查自己的代码是否符合你的要求,这方面用个add-in比他记住这么多规则好很多吧,然后才是check in的时候服务端做校验。
而且既然免费的开源的add-in你能找到,稍微修改一下独立出来符合你的要求不就可以了吗   回复  引用  查看    

#20楼  2007-11-13 10:44 uestc95 [未注册用户]

而且,你想用工具来完全完成code review应该是不正确的,工具只能完成一部分,人还是不可或缺的。
你提到你们在做过程改进,国内的一个误区就是,好像通过一系列工具来完成整个过程的控制和稽核就是好事情了,当然这很重要,但如果这就是你们过程改进的核心,那就有问题了,:)   回复  引用  查看    

#21楼 [楼主] 2007-11-13 10:44 亚历山大同志

@uestc95
确切的说,稍微修改一下那个Addin所带来的成本和重写CheckStyle的Grammar差不多,我相比之下我倒宁愿重写CheckStyle的Grammar。但是那不是我要做的事情。
  回复  引用  查看    

#22楼 [楼主] 2007-11-13 10:52 亚历山大同志

@uestc95
工具是保障流程的重要手段。合适的工具可以极大的提高过程改进的效率和减轻在改进过程之中对现有流程,对现有项目的影响。
如果忽略工具的作用,有工具不用那就是明明可以用枪解决的却要用刀砍,明明可以打的的非要走路。
你可能忽略了国内的另外一个误区就是花大价钱整理一大堆无用的文档以为CMMX了。结果还是在刀耕火种。

要明白,工具的作用就是用来降低在过程化改进当中所带来的负担。要知道,过程化改进的必然结果就是各类负担的增加。   回复  引用  查看    

#23楼  2007-11-13 10:58 uestc95 [未注册用户]

不管你采用何种稽核工具,人是最关键的,只能祝你们的过程改进好运了。
  回复  引用  查看    

#24楼 [楼主] 2007-11-13 11:00 亚历山大同志

@uestc95
不着急,慢慢来,本来公司就没有定撒子一定要过CMMI这样的目标,改进过程纯粹是为了改善工作环境而已,我觉得这样子不带功利目的的改进更加能够贴近过程改进的实质   回复  引用  查看    

#25楼  2007-11-13 12:30 蛙蛙池塘

CodeReview的思索
http://www.cnblogs.com/xdingding/archive/2005/09/20/240663.aspx

经历很多内部培训程序员的培训方法和课程,感觉相当来说CodeReview这个内部制度,对程序员,尤其是像我这样资历较笨拙之人有很好的技术提高促进作用。

但如果仅应付制度,完成过场,则大家只感其累无有利处。
故而根据本人经验拟定一CodeReview细则,希望对大家有所帮助,同时恳切求大家意见经验。


1、确保一周之内必须有一次至少四十分钟CodeReview
2、各小组人数不要超过10人,每组至少有一人有熟练编辑经验,同时具有局部模块设计能力,并且此人作为小组组长,最好能保证一个CodeReview小组成员来自一个开发组。
3、CodeReview总体粗分可以分为:
A、分析每人代码是否符合编程规范等
B、分析经典有缺陷代码
C、分析经典优秀代码
D、通过分析部分代码来映射反观设计要点
E、分析代码现场实施重构
4、每5次CodeReview中必须保证 D或E 至少两次
5、每次CodeReview需要提交一份记录,包含到会者会议时间
A/B/C时罗列讨论到的编程规范等名称
D时要对讨论的大纲记录
E时罗列重构方法名称
6、A/B要由组长组织,由小组成员轮流发言。C/E 组长参与讨论。D 组长主持,成员为辅。D/E还需要定期邀请其他有经验人员主持。
7、A/B/E 依据的代码,均可以由组员各自都提供,组长挑选。
----------------
Ted GraHam 提到了39 条 CheckList, 我觉得还是总结的挺全面.

* Are exceptions used to indicate error rather than returning status or error codes?
* 使用异常来只是错误而不是使用状态或者错误代码值
* Are all classes and public methods commented with .NET style comments?? Note that comments should discuss the "what" of public methods.? Discussion of "how" should be in blocks or in-line with the code in question.
* 所有类以及 public 方法 都使用.NET 样式的注释, 即 /// summary 格式. 注意 Summary 中说明代码有那些功能,而不是这个功能如何实现的. 可以在 Remarks 块或者代码中说明.
* Are method arguments validated and rejected with an exception if they are invalid?
* 所有方法的参数的合法性是否做验证, 对非法的参数是否抛出异常?
* Are Debug.Asserts used to verify assumptions about the functioning of the code?? Comments like, "j will be positive" should be rewritten as Asserts.?
* 是否使用 Debug.Asserts 来验证代码中的假设? “ j 应该是正数?“之类的注释应该用 Debug.Asserts 来重写.
* Do classes that should not be instantiated have a private constructor?
* 不需要实例化的类有 私有构造函数吗?
* Are classes declared as value types only infrequently used as method parameters, returned from methods or stored in Collections?
* 值类型的类用于参数,方法返回值以及存放在集合中?
* Are classes, methods and events?that are specific to an assembly marked as internal?
* Assembly 特有的类,方法,事件的访问修饰符是否已经标记为 Internal ?
* Are singletons that may be accessed by multiple threads instantiated correctly?? See the Enterprise Solution Patterns book, p. 263.
* 多线程同时访问的单件对象是否正确的初始化?
* Are methods that must be overriden by derived classes marked as abstract?
* 必须被衍生类重写的方法申明为 Abstract 了吗?
* Are classes that should not be overriden marked as sealed?
* 不能重写的类是否标记为 Sealed?
* Is "as" used for possibly incorrect downcasts??
* 可能失败的转换是否使用了 AS 运算符?
* Do classes override ToString?instead of defining a Dump method for outputting the object's state?
* 输出对象的状态的时候应该重写 ToString 方法而不是加一个类似 Dump 之类的方法.
* Are log messages sent to the logging component instead of Console?
* 所有log 的消息都有 log 组建处理,而不是仅仅输出到 控制台.
* Are finally blocks used for code that must execute following a try??
* finnally 代码块用于try 后必须执行的代码
* Is foreach used in preference to the for(int i...) construct?
* 尽可能的采用 foreach 而不是 for(int i...)
* Are properties used instead of implementing getter and setter methods?
* 是否属性没有实现getter 和 setter 方法
* Are readonly variables used in preference to?properties without setters?
* 只读的属性应该没有 setter 方法
* Is the override keyword used on all methods that are overriden by derived classes?
* 衍生类重写的方法是否都使用了 override 关键字
* Are interface classes used in preference to abstract classes?
* 正确的使用interface 和抽象类.
* Is code written against an interface rather than an implementing class?
* 接口实现和抽象类继承
* Do all objects that represent "real-world" or expensive resources implement the IDisposable pattern?
* 操作系统资源的类是否实现了 IDisposable 接口?
* Are all objects that implement IDisposable instantiated in a using block?
* 是否所有实现IDisposable 的类初始化的时候使用了 Using 语句?
* Is the lock keyword used in preference to the Monitor.Enter?construct?
* 使用lock 语句而不是 monitor.enter
* Are threads awakened from wait states by events or the Pulse construct, rather than "active" waiting such as Sleep()?
* 线程使用事件或者pulse 唤醒, 而不是使用 sleep 主动的唤醒.
* If equals is overridden, is it done correctly?? The rules for overriding equals are complex, see Richter p153-160 for details.
* 是否正确的重写了 equals
* If == and != are overridden, so they redirect to Equals?
* == 和 != 操作符号被重写
* Do all objects that?override Equals also provide an overloaded version of GetHashCode that?provides the same semantics as Equals?? Note that overrides to GetHashCode should?take advantage of the object's member variables, and must?return an unchanging hash code.
* Equals GethashCode 的重写问题
* Do all exception classes?have a constructor that takes a string and and another constructor that takes a string and an exception?
* 异常类的构造问题
* Do all exception classes derive from the base Matrix exceptions and fit correctly into the exception hierarchy?
* 自定义异常类的继承层次问题
* Are all classes that will be marshaled or remoted marked with the Serializable attribute?
* 所有被 Marshal 或者远程处理的对象有序列化标志
* Do all classes marked with the?Serializable attribute have a default constructor?? This includes Exception and?EventArgs?classes.
* 所有标记有 Serializable 属性的类是否有默认的构造函数, 包括常见的 Exception 和 EventArgs 类.
* Do all classes that explicitly implement ISerializable provide both the required GetObjectData and the implied constructor that takes a SerializationInfo?and a?StreamingContext?
* 实现 Iserializable 接口的类是否显式的实现 GetObjectData 和 隐式的构造函数,例如 Serializaioninfo 和 StreamingContext 作为参数
* When doing floating point calculations,?are all constants doubles rather than integers?
* 做浮点运算的时候,所有的常量都是double 类型而不是整数
* Do all delegates have a void return type and avoid using output or ref parameters?
* 委托是否都有 void 返回值,避免使用 out 或者 ref 类型的参数
* Do?all delegates send the sender (publisher) as the first argument?? This allows the subscriber to tell which publisher fired the event.?
* 所有的委托又有 sender 对象作为第一个参数
* Are all members of derived EventArg classes read-only?? This prevents one subscriber from modifying the EventArgs, which would affect the other subscribers.
* 从 EventArg 继承的类是否是只读的, 只读的参数可以避免一个订阅者对参数的修改影响其他的参数订阅者
* Are delegates published as events?? This prevents the subscribers from firing the event, see Lowy, p. 102?for details.
* 所有的委托发布事件?
* Is common setup and teardown nUnit code isolated in?Setup and Teardown methods that are marked with the appropriate attribute?
* 单元测试的时候, 常见的驱动代码和测试代码分开.
* Do negative nUnit tests use the ExpectedException attribute to indicate that an exception must be thrown?
* 使用 ExpectedExcetpion 来指示异常必须抛出?
------------------
http://www.macadamian.com/index.php?option=com_content&task=view&id=27&Itemid=31

你可能感兴趣的:(1.一些插件和工具)