与Patrick Smacchia谈.NET的代码分析

时间:2017-11-11 15:28

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的念头?

相关厂商内容

京东虚拟商品系统如何做高可用架构设计? 顶尖架构师岁末总结大会:上百技术案例日程出炉! 不改一行代码:左耳朵看微服务调度的三大件 AI时代,我到底该如何跟上技术潮流?

相关赞助商

与Patrick Smacchia谈.NET的代码分析

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

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

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

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

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

与Patrick Smacchia谈.NET的代码分析

与Patrick Smacchia谈.NET的代码分析

与Patrick Smacchia谈.NET的代码分析

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

与Patrick Smacchia谈.NET的代码分析

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 > 15 AND PercentageComment < 20

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

静态字段不能被命名为m_XXX(自定义的命名规范):
WARN IF Count > 0 IN SELECT FIELDS WHERE NameLike "^m_" AND IsStatic