与Patrick Smacchia谈.NET的代码分析

NDepend是一款专为.NET开发者设计的代码分析工具,它能帮助用户理解复杂的代码库结构,评估代码质量,并实现高效的代码审查。通过直观的可视化展示及强大的查询语言支持,NDepend极大地提升了重构和维护工作的效率。

Patrick Smacchia是Visual C#的MVP,拥有超过15年的软件开发经验。他是《Practical .NET 2 and C# 2》一书的作者,该书通过真实的项目经验来阐释.NET平台。他的专业为数学与计算机科学,毕业后,他在多个领域从事过软件开发,包括在Société Générale开发股票交易系统,在Amadeus开发航空售票预订系统,以及在Alcatel开发卫星基站。目前他是NDepend工具的首席程序员。

\

Rob Bazinet (RB): NDepend是什么?

\

Patrick Smacchia (PS): NDepend是为.NET开发人员以及架构师开发的工具。代码库是那么的错综复杂,而NDepend工具则能够帮助人们从源代码中获取相关的信息。例如,NDepend能够判断你的代码库是否正确分层;获知从最近版本发布后所做的修改;或者评估某些关键任务的代码质量,如果这些事情通过传统工具来完成,可能会耗费数个小时甚至数天的时间。

\

RB: 是什么使你产生开发NDepend的念头?

\

PS: 5年前,我为一个巨大而又混乱的代码库提供咨询。而在同时,我正在阅读一本优秀的书籍,Robert C Martin所著的《敏捷软件开发——原则,模式与实践》 。本书描述了一些非常酷的评估代码库组件构成的度量标准。

\

正是在那个时候,我从C++转向了.NET。我所偏爱的其中一个特性是System.Reflection,它比C++的RTTI更加的引人注目。顺理成章的,我开始基于反射开发了一个小巧的工具,它能够针对这个巨大而又混乱的代码库去验证Martin所说的度量。然后,我将该工具发布为开源软件(OSS),由于它的功能能够满足许多需求,因而越来越受到人们的欢迎。基于此,我认识到如果该工具能够支持某些可视化以及查询的功能,那么对于我们处理代码复杂性而言,其效率就能再上一个台阶。

\

RB: NDepend对于我的编码工作以及/或者开发生命周期能够提供怎样的帮助呢?

\

PS: NDepend对多种任务都提供了很大的帮助,包括重构、代码评审、代码质量检查与增强、设计缺陷检查、代码侦测、代码浏览以及构建过程原则的实施。

\

NDepend对于代码重构非常有用,因为它能够展现组件、命名空间、类……之间的依赖关系,呈现的方式是一个依赖关系矩阵图以及一些由“框框和箭头”组成的图形。

\

19c43759bf47008005a5a90321c58014.jpg

\

658c0a235ec6be948edf1456ebfc29d7.jpg

\

a3cf391f7fa09b888dfb0a794a004e41.jpg

\

NDepend支持超过60条编码准则,用于评估代码质量:

\

1707075d012cf0f36ce2a0d890d9e060.jpg

\

NDepend分析过程可以被集成到MSBuild或者NAnt构建过程中。每次执行分析之后都会给出一个关于构建过程健康度的报告。

\

通过使用代码查询语言(Code Query Language,CQL,一种能够提供代码结构查询的语言),开发人员能够对他们的代码库提出各种问题:

\
  • 哪些类实现了IDisposable接口?
    SELECT TYPES WHERE IsClass AND Implements \"System.IDisposable\"\
  • 哪些公共方法能够被声明为private?
    SELECT METHODS WHERE IsPublic AND CouldBePrivate\
  • 哪些方法分配了特定的字段?
    SELECT METHODS WHERE IsDirectlyWriting \"MyNamespace.MyClass.m_Field\"\
  • 哪些复杂的方法没有足够的注释?
    SELECT METHODS WHERE CyclomaticComplexity \u0026gt; 15 AND PercentageComment \u0026lt; 20\

CQL语言还能够用来定义某些原则对每次构建进行检查。如果与原则冲突,用户就能够从报告中知晓。NDepend提供了50多条预先定义的原则,同时还允许用户自定义符合系统要求的原则,例如:

\
  • 静态字段不能被命名为m_XXX(自定义的命名规范):
    WARN IF Count \u0026gt; 0 IN SELECT FIELDS WHERE NameLike \"^m_\" AND IsStatic\
  • 我不想让我的用户界面层直接依赖于DataBase层:
    WARN IF Count \u0026gt; 0 IN SELECT NAMESPACES WHERE IsDirectlyUsing \"DataLayer\" AND NameIs \"UILayer\"\
  • MyAssembly和MyAssembly2的方法不能超过30行代码:
    WARN IF Count \u0026gt; 0 IN SELECT METHODS OUT OF ASSEMBLIES \"MyAssembly1\
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值