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对于代码重构非常有用,因为它能够展现组件、命名空间、类……之间的依赖关系,呈现的方式是一个依赖关系矩阵图以及一些由“框框和箭头”组成的图形。
\ \ \ \NDepend支持超过60条编码准则,用于评估代码质量:
\ \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\