代码质量对于软件项目的成败很重要,这点我想大家都明白。那么在一个软件团队中如何保证代码质量呢?对于这个问题不同的人可能会有不同的答案,对于我而言我觉得做好两点代码质量基本就可以保证了:

  1.代码规范(具体规范细则可以参考.NET 设计规范 一书)

  2.测试(对于程序员本身而言主要是单元测试)

  微软提供了 FoxCop 来检查代码规范

  Nunit 来完成单元测试

  对于Nunit 本博客已经有了一篇入门的文章,现在再来介绍 FxCop 的入门(由于个人的喜好,我不喜欢一些工具如SVN、NUnit等和VS集成,本文也不会弹 FxCop 与 VS的集成,但是网上这类文章很多,需要的读者自行搜索)

一、Fxcop 软件的安装

  你可以从各种途径搞到FxCop 的安装包,我这里也提供 FxCop1.36 的下载

  下载后按照提示安装,安装好后启动 FxCop

  

二、检查程序集是否符合代码规范

Project --> Add Targets --> Analyze 如下图所示(在Rules Tab 中我们可以选择启用的规则)

三、自定义规则

1. 新建 类库项目加入 FxCop 1.36 安装目录下的 FxCopSdk.dll 和 Microsoft.Cci.dll

2. 新建 规则 xml,如下所示,并编译为资源

 <?xml version="1.0" encoding="utf-8" ?>
<Rules FriendlyName="XXXSoft公司命名规范">
<Rule TypeName="XXXSoftNameRuleMethod" Category="XXXSoft.NameRule" CheckId="XX0001">
<Name>方法名规则</Name>
<Description>方法名必须首字母大写,如果首字符小写将提示警告。</Description>
<Url/>
<Resolution>方法 “{0} ”的首字母应为大写</Resolution>
<MessageLevel Certainty="99">Error</MessageLevel>
<Email>yourMail@gmail.com</Email>
<FixCategories>NonBreaking, DependsOnFix</FixCategories>
<Owner>ServiceSoft</Owner>
</Rule> <Rule TypeName="XXXSoftNameRuleField" Category="XXXSoft.NameRule" CheckId="XX0002">
<Name>字段名规则</Name>
<Description>字段的访问修饰符不能是公有的。</Description>
<Url/>
<Resolution>字段 “{0} ”的访问修饰符是public</Resolution>
<MessageLevel Certainty="99">Error</MessageLevel>
<Email>yourMail@gmail.com</Email>
<FixCategories>NonBreaking, DependsOnFix</FixCategories>
<Owner>ServiceSoft</Owner>
</Rule>
</Rules>

3. 写规则类

 using Microsoft.FxCop.Sdk;

 namespace XXXCompanyRules
{
public class FieldRule1 : BaseIntrospectionRule
{
public FieldRule1() :
base("XXXSoftNameRuleField", "XXXCompanyRules.Rules", typeof(FieldRule1).Assembly)
{} public override ProblemCollection Check(Member member)
{
if (member.DeclaringType is EnumNode)
{
return null;
}
Field field = member as Field;
if (field == null)
{
return null;
}
if (field.IsPublic)
{
Problems.Add(new Problem(GetResolution(member.Name.Name)));
}
return Problems;
}
}
}
 using System;
using Microsoft.FxCop.Sdk; namespace XXXCompanyRules
{
public class MethodRule1 : BaseIntrospectionRule
{
public MethodRule1() :
base("XXXSoftNameRuleMethod", "XXXCompanyRules.Rules", typeof(MethodRule1).Assembly)
{ } /// <summary>
/// 验证首字母
/// </summary>
/// <param name="member">类型成员</param>
/// <returns>错误提示</returns>
public override ProblemCollection Check(Member member)
{
Method method = member as Method;
if (method == null)
{
return null;
}
if (!method.IsSpecialName && !Char.IsUpper(method.Name.Name, ))
{
Problems.Add(new Problem(GetResolution(member.Name.Name)));
}
return Problems;
}
}
}

4. 编译生成 规则 dll

5. 添加到 FxCop 中

6. 验证

本节代码下载

本文完

Fxcop 初体验的更多相关文章

  1. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  2. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  3. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  4. Xamarin.iOS开发初体验

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0

  5. 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...

  6. 【Knockout.js 学习体验之旅】(1)ko初体验

    前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...

  7. 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验

    在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...

  8. 百度EChart3初体验

    由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...

  9. Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验

    Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...

随机推荐

  1. 【原】Spark数据本地性

    Spark数据本地性 分布式计算系统的精粹在于移动计算而非移动数据,但是在实际的计算过程中,总存在着移动数据的情况,除非是在集群的所有节点上都保存数据的副本.移动数据,将数据从一个节点移动到另一个节点 ...

  2. javaNIO(转载)

    (一) Java NIO 概述 Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Chan ...

  3. SPI协议及其工作原理浅析

    转载自:http://bbs.chinaunix.net/thread-1916003-1-1.html一.概述. SPI, Serial Perripheral Interface, 串行外围设备接 ...

  4. Esper系列(五)Order by、Limit、构建事件流、Updating an Insert Stream

    Order by 与SQL语法类似类似,默认为升序排列; 注意: 如果order by的子句中出现了聚合函数,那么该聚合函数必须出现在select的子句中. 出现在select中的expression ...

  5. 【Kafka入门】Kafka入门第一篇:基础概念篇

    Kafka简介 Kafka是一个消息系统服务框架,它以提交日志的形式存储消息,并且消息的存储是分布式的,为了提供并行性和容错保障,消息的存储是分区冗余形式存在的. Kafka的架构 Kafka中包含以 ...

  6. DATASNAP复杂中间件的一些处理方法

    1.中间件需要连接SQL SERVER\ORACLE\MYSQL多种数据库,怎么办? [解决]:可以搞多种数据模块池对应多种数据库,一种数据模块池对应一种数据库 2.中间件业务对象多,在一个单元里面定 ...

  7. Ⅹ.spring的点点滴滴--IObjectPostProcessor(对象后处理器)

    承接上文 IObjectPostProcessor(对象后处理器) 前提是实现接口的对象注册给当前容器 C#: 通过继承AbstractObjectFactory对象的AddObjectPostPro ...

  8. IIS7错误:“Web服务器被配置为不列出此目录的内容”的解决办法

    IIS7错误:“Web服务器被配置为不列出此目录的内容”的解决方法: 在"操作"下,点启用,此按钮将变成禁用,则可消除此错误

  9. libpcre.so.1 cannot be found

    安装完Nginx之后,启动报错. [vagrant@localhost sbin]$ sudo ./nginx ./nginx: error while loading shared librarie ...

  10. HDInsight-Hadoop实战(一)站点日志分析

    HDInsight-Hadoop实战(一)站点日志分析 简单介绍 在此演示样例中.你将使用分析站点日志文件的 HDInsight 查询来深入了解客户使用站点的方式.借助此分析.你可查看外部站点一天内对 ...