代码分析(关于代码分析详见http://msdn.microsoft.com/zh-cn/library/3z0aeatx(VS.80).aspx),是visual studio开发工具中提供的一种规范代码的工具,系统提供了200多条规则,从命名习惯,安全性,属性使用等方面来对我们编写的代码进行分析,然后以默认警告的形式在“错误列表”窗口中提示我们书写的代码是否符合规范,并提示出为什么。当然这种规范是MS给的一种通用的规范,不一定适合所有的公司。

下图是Visual Studio提供的代代码分析的11种规范。
(图-1)
开发规范是每软件开发公司都有的,可有每个公司在开发方面都积累了适合自己的一套规范,有的可能是通用的,有的可能是根据实际情况适合自己的。比如,公司要求所有的方法的第一个字符必须是大写,字段不能定义成公有,可能对其他公司来说这些规范不适合,但对于本公司来说,就是一种规范,是一种要求。(这里是举个例子,不是实际存在的公司规范)
公司的开发规范是这样要求的,但对于一些新手,或一些其他公司跳过来的程序员,能很快习惯吗?当然,通过开会,指正,再开会,再指正,开发人员的习惯会形成,但又没有更好的办法呢?用一种量化的约定来让开发人员尽快适应本公司的开发规范呢?答案是肯定的。就用自定义代码分析来规范我们的开发人员。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
自定义代码分析,就是让Visual Studio中的代码分析模块按照自定义的分析方式去分析公司程序写的代码,然后给出相应的Warnning(也可以是Error,根据设定来分类),就像每个方法的首字母都得是大写,如果是小写或非字母的话,就在错误列表中给出该方法一个Warnning(或Error)。
有了前面的背景,就进入正式的主题。
代码分析,本质就是把开发人员写的代码拿出来,看看那些不符合公司规范,然后把不符合的提示出来,让开发人员改。大家都知道refection,可以很好的把别人的代码检索出来。但有更好的一个技术,introspection,与refection功能一样,但它比refection更快,并且支持多线程,分析开发人员程序集时还不独占。看来很不错。我们只知道这么多就行了,因为我们不直接用introspection来做自定义代码分析,我们用BaseIntrospectionRule这个封装了introspection的基类来做代码分析,这样以来,会提升咱们的开发速度。BaseIntrospectionRule的类层次结构为:父类是StandardVisitor,再向上是Visitor(一个抽象类),再上就是Object了。
(以下我使用的是visual studio 2008)
首先创建一个CustomCodeAnalysisRules的解决方案,在这个解决方案下创建一个NameRuleCodeAnalysisRules类库项目。然后给这个项目添加引用,因为BaseIntrospectionRule这个类以及后面用的到的一些类都在将要引用的程程集下面。选中项目的“引用”右键“添加引用”,找到visual studio的安装目录(有可能你在安装时修改了安装目录)“D:\Program Files (x86)\Microsoft Visual Studio 9.0\Team Tools\Static Analysis Tools\FxCop”(这是我的目录),引两个dll进来,一个是FxCopSdk.dll,另一个是Microsoft.Cci.dll。
接下来,我们要对前面提到的两个规则进行编程,“方法首字母大写”和“字段不能是公有”

在项目中添加一个类文件NameRuleCodeAnalysisRules(为了方便,我们把方法验证和字段验证都放到一个类中)

using System;
using Microsoft.FxCop.Sdk;

namespace NameRuleCodeAnalysisRules
{
        /// <summary>
        /// 验证方法类
        /// </summary>
        public class ServiceSoftNameRuleMethod : BaseIntrospectionRule
        {
                public ServiceSoftNameRuleMethod()
                        : base("ServiceSoftNameRuleMethod", "NameRuleCodeAnalysisRules.Rules", typeof(ServiceSoftNameRuleMethod).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;
                        }
                        else
                        {
                                if (!method.IsSpecialName && !Char.IsUpper(method.Name.Name, 0))
                                {
                                        Problems.Add(new Problem(GetResolution(member.Name.Name)));
                                }
                        }
                        return Problems;
                }
        }
        /// <summary>
        /// 验证字段类
        /// </summary>
        public class ServiceSoftNameRuleField : BaseIntrospectionRule
        {    
                public ServiceSoftNameRuleField()
                        : base("ServiceSoftNameRuleField", "NameRuleCodeAnalysisRules.Rules", typeof(ServiceSoftNameRuleField).Assembly)
                { }
                /// <summary>
                /// 验证字段访问修饰符
                /// </summary>
                /// <param name="member">类型成员</param>
                /// <returns></returns>
                public override ProblemCollection Check(Member member)
                {                            
                        if (member.DeclaringType is EnumNode)
                        {
                                return null;
                        }
                        Field field = member as Field;                
                        if (field == null)
                        {
                                return null;
                        }
                        else
                        {
                                if (field.IsPublic)
                                {
                                        Problems.Add(new Problem(GetResolution(member.Name.Name)));
                                }
                                return Problems;
                        }
                }
        }
}
其实check方法有多种重载,这里因为我们验证的方法和字段,都是类型成员所以只重写check(Member member)这种方法就可以了。在方法体中,如果类型成员不满足要求,
就以它名字为Problem构造参数的对象,添加到Problems中,最终,这个Problem对象的相应信息,会在错误列表中显示出来。这里要注意,member.Name.Name,也就是类型成员的名字。
C#代写完成,要写一个每个规范类对应的Rules.xml
<?xml version="1.0" encoding="utf-8" ?>
<Rules FriendlyName="ServiceSoft公司命名规范">
    <Rule TypeName="ServiceSoftNameRuleMethod" Category="ServiceSoft.NameRule" CheckId="SS0001">
        <Name>方法名规则</Name>
        <Description>方法名必须首字母大写,如果首字符小写将提示警告。</Description>
        <Url/>
        <Resolution>方法 “{0} ”的首字母应为大写</Resolution>
        <MessageLevel Certainty="99">Error</MessageLevel>
        <Email>axzxs2001@163.com</Email>
        <FixCategories>NonBreaking, DependsOnFix</FixCategories>
        <Owner>ServiceSoft</Owner>
    </Rule>
    
    <Rule TypeName="ServiceSoftNameRuleField" Category="ServiceSoft.NameRule" CheckId="SS0002">
        <Name>字段名规则</Name>
        <Description>字段的访问修饰符不能是公有的。</Description>
        <Url/>
        <Resolution>字段 “{0} ”的访问修饰符是public</Resolution>
        <MessageLevel Certainty="99">Error</MessageLevel>
        <Email>axzxs2001@163.com</Email>
        <FixCategories>NonBreaking, DependsOnFix</FixCategories>
        <Owner>ServiceSoft</Owner>
    </Rule>
</Rules>
每个类对应一个<Rule>标记。最外面是<Rules>标记,这里要注意这个标记的FriendlyName这个属性值,最终会在图-1中的规则中显示出来。
在<Rule>中有如下子标记,<Name>名称,<Description>描述,<Url>链接,<Resolution>解决方案,这个标记会最终在错误列显示出来,所以对这个标记的内容要描述清楚,并且在这个标记的内容中有{0}这样的占位符,这是为前面方法中的member.Name.Name所占的。<MessageLevel>信息级别,Categories为0~99范围的值,内容为  MessageLevel枚举的值,<Email>邮箱,<FixCategories>更正规则的方式,内容为FixCategories枚举的值,<Owner>所有者。
现在主可以生成类库集了,现在需要把Rules.xml一起生成到程序集的dll中,选中Rules右键“属性”,在属性的窗体中选中“生成操作”,下拉改成“嵌入的资源”,最终就会把这个Rules.xml打包到dll的元数据中。
再返回头来看一下规则类和xml,它们的关联是通过在规则类的构造函数中的第二个参数NameRuleCodeAnalysisRules.Rules,namesapce+xml名和xml的<Rule>的Typ eName属性为规则类名关联起来的。
复制上NameRuleCodeAnalysisRules.dll,到visual studio的安装目录D:\Program Files (x86)\Microsoft Visual Studio 9.0\Team Tools\Static Analysis Tools\FxCop\Rules下,这个目录下放的全是代码分析的规则类。
到此,为我们的开发规范自定义代码分析就做完了,好用吗?
新建一个控制台应用程序,名称自已决定

代码如下:

using System;

namespace ConsoleApplication1
{
        class Program
        {
                public int i = 10;        
                static void Main(string[] args)
                {
                }
                public void ff()
                {
                }
                static void _gsw()
                {
                }
                public int Sx
                { get; set; }
        }
        class abc
        {
                public string k="12";
                public abc()
                { }
        }
        abstract class bcd
        {    
            public abstract int ffs();
        }
}
然后打开代码分析,如下图:
(图-2)
这时,就能看到我们自定议的规则“ServiceSoft公司命名规范”(这里的名称就是Rules.xml中的FriendlyName属性的值),为了测试明显,可以先把其他的规则关闭。生成如下图
(图-3)
说明中就会把我们自定议的规则以警告的形式提示出来。
有几个问题:
1、  当第一次代码分析时往往不进行,当源代码有一点改动,代码分析才起作用,我估计系统检测出源代码文件有变动,才去分析,这里应该用一点问题。
2、  还有所有的代码分析警告都不显示第几列。
 

用自定义代码分析来标准开发人员的开发规范相关推荐

  1. 易开发是一款帮助开发人员快速开发的工具,功能包括界面分析,页面信息,加固脱壳,支持 Android9.0

    DeveloperHelper 项目地址:WrBug/DeveloperHelper  简介:?易开发是一款帮助开发人员快速开发的工具,功能包括界面分析,页面信息,加固脱壳,支持 Android9.0 ...

  2. 测试开发人员与开发人员_如何升级为开发人员

    测试开发人员与开发人员 by Will Hughes 威尔休斯(Will Hughes) 如何升级为开发人员 (How to Level up as a Developer) Being a prod ...

  3. 开发人员项目开发的步骤

    开发人员项目开发的步骤 前言 项目开发目的分析与确定 在开发商将开发项目确定下来之后,需要与需求方进行讨论,确定需求方对于软件开发需要实现的目标及其具体需要的功能等等,并进行可⾏性分析(技术.成本.法 ...

  4. 开发工程师人生之路-与30岁左右的开发人员共勉开发工程师人生之路(转载)

    摘自: http://www.cnblogs.com/justinw/archive/2006/01/26/323554.html 恭喜,你选择开发工程师做为自已的职业         悲哀,你选择开 ...

  5. 开发人员提高开发效率的10个推荐工具

    推荐10个能够提高开发人员开发效率的10个工具 腾讯云开发CloudBase 云开发(Tencent CloudBase,TCB): Cloud Base是腾讯云提供的云原生一体化开发环境和工具平台, ...

  6. web开发环境_Web开发人员的开发环境

    web开发环境 With all the tools and programs available, it can be challenging to figure out the best way ...

  7. Java基础学习总结(146)——开发人员日志实践规范

    一.日志规范 日志作用: 1.日常排查问题(基本作用),快速定位问题的根源 2.分析日志,构建常见问题排查平台 3.报表输出(日活.周活) 4.追踪程序执行的过程,追踪数据的变化:  a)在系统启动或 ...

  8. bintray_与Bintray更好的开发人员对开发人员的协作

    bintray 最近,我对Spring Social产生了兴趣,并且作为我学习道路的一部分,我试图集成仍在孵化器模式下的Github模块 . 不幸的是,这个模块似乎被抛在了后面,并且它对核心模块的依赖 ...

  9. 低代码平台和专业开发人员——完美搭档?

    使用前端和后端框架从头开始开发企业级 Web 应用程序需要很长时间.如今,客户正在寻找快速且具有成本效益的解决方案,并倾向于使用无代码和低代码应用程序开发平台. 使用前端和后端框架从头开始开发企业级 ...

最新文章

  1. 你一定需要知道的高阶JAVA枚举特性!
  2. A Famous Music Composer
  3. 也是一个国外的final cut pro的模版网站
  4. 如何把数据在A表空间里面,把它IMP进B表空间
  5. 玩! 框架:为什么我会爱上它
  6. 51CTO会员开通成功!开森!
  7. 【转】【MySql】Waiting for table metadata lock原因分析
  8. 2021年7月国产数据库排行榜:openGauss成绩依旧亮眼,Kingbase向Top 10发起冲刺
  9. [Luogu 1312] noip11 Mayan游戏
  10. [转]摧毁一个人可以有多简单
  11. [Python] L1-041 寻找250-PAT团体程序设计天梯赛GPLT
  12. Delphi 调试连接 任意Android手机/平板/盒子
  13. Python基础之赋值运算符
  14. RTSP-传送ACC音频文件
  15. Easypoi模版形式导出excel导出图片
  16. 群晖用php装aria2,群晖Synology安装Aria2实现迅雷离线下载,安装IPKG
  17. FPA色彩性格测试题:黄 红 蓝 绿 你是哪个?
  18. c new java_“邻避设施”的种类主要包括()。
  19. 推荐一个免费服务器网站|亲测可用
  20. 按照分类方法判断图片里是否有鹅蛋

热门文章

  1. 中国工程院谭建荣:人工智能应用得再好,最核心的算法不行,创新能力就不行丨MEET2021...
  2. iPhone12要来了,苹果第一款5G手机,哪些值得期待?
  3. 威马新车型,率先放话搭载L4自动驾驶
  4. Zoom市值达586亿美元,放中国科技巨头能排第6!净利润暴涨135倍,每天3亿人开会...
  5. 不用写代码就能做高端科学计算,Mathematica推出“人话”版软件
  6. 百度Q2扭亏为盈,市值一夜大涨300亿,李彦宏:呼唤猛将雄兵,要再上行业之巅...
  7. 中国博士生提出最先进AI训练优化器,收敛快精度高,网友亲测:Adam可以退休了...
  8. 马斯克一作!Neuralink脑机接口细节公布,特殊材料防大脑损伤,专用芯片助技术落地...
  9. Drupal7 将到2021年11月结束支持,请注意升级
  10. 织梦首页常用调用标签