After reading @DaedTech’s very persuasive arguments for static code analysis I have decided to give NDepend a go.
Download and install is slightly fiddly, you get a zip file with a number of files. Once you have found the instructions on the web site it takes just a couple of minutes to get set up.
I analysed my current project and viewed the dashboard:
The first thing to catch my eye is 10 critical rules violated:
6 Methods with too many parameters:
- 3 * read only model constructors
- 2 * anonymous type constructors
- 1 * controller constructor with 10 dependencies (+)
3 Methods too complex:
- 2 * anonymous type constructors
- 1 * unit test with 6 lines of code – here’s one of the 4 assert statements (they are all 4 very similar)
Assert.Contains<TemplateRecipientRole>(
result, item =>
item.TemplateId == "TestTemplate1" &&
item.RecipientRoleId == "TestRole1" &&
item.OriginalEnabled.Value &&
!item.OriginalDefaultSequence.HasValue &&
!item.CopyEnabled.HasValue &&
!item.CopyDefaultSequence.HasValue);
9 Avoid namespaces mutually dependent:
- 9 * (+)
20 Potentially dead methods:
- 4 * the constructors of a class that is missing (or does not require) a unit test
- 5 * where the method is being called with a dynamic parameter (
this.SomeMethod(((dynamic)Entity).Attribute);
) - 3 * private methods for Elmah (
void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)
) - 1 * unit test method accidentally marked as private
- 8 * dead methods (+)
14 Constructors of abstract classes should be declared as protected or private:
- 9 * WCF generated code
- 5 * (+)
4 Don’t assign a field from many methods:
- 4 * these are all Stub classes
2 Don’t call your method Dispose:
- 2 * class are implementing
IHttpModule
which defines aDispose
method
12 Avoid having different types with the same name:
- 12 * (+)
1 Attribute class name should be suffixed with ‘Attribute’:
- 1 * (+)
24 Interface name should begin with a ‘I’:
- 24 * WCF generated code
So after a lot of filtering I am left with the following things I need to change:
- 9 Avoid namespaces mutually dependent
- 8 Potentially dead methods
- 5 Constructors of abstract classes should be declared as protected or private
- 12 Avoid having different types with the same name
- 1 Attribute class name should be suffixed with ‘Attribute’
From an initial list of 95 Critical violations NDepend has correctly identified 35 violations that I can put right. And this is all good information that would clean up my code and I wish that NDepend has been a step in the CI build from day 1.
So, onto 69 Rules violated, 7360 violations! WTF?
I wish that NDepend has been a step in the CI build from day 1!