分析面向对象代码的想法

时间:2011-09-05 16:49:14

标签: c# oop code-analysis

如果我能做魔法,我会想出一个C#代码分析工具;我们称之为XYZ。以下是您可以作为XYZ输入的一些代码示例:

public class MyClass
{
    private int myInt;

    [Functional]
    public int GetDoubleOfMyInt()
    {
        return 2*myInt;
    }

    [SideEffect: myInt] 
    public void IncrementMyInt()
    {
        myInt++;
    }
} 

注意两种方法的标签。 XYZ将验证GetDoubleOfMyInt()确实是纯功能的(在某种意义上它只是计算一个整数)并且IncrementMyInt具有为myInt赋值的副作用。如果您交换了两个标记XYZ,则会发出两个错误。

我的问题: 1.重新组合XYZ确实存在吗? 2.如果你被要求实施它,你会从哪里开始?

2 个答案:

答案 0 :(得分:8)

代码合同基本上可以满足您的要求。 (http://msdn.microsoft.com/en-us/devlabs/dd491992

Code Contracts允许您使用允许编译器和IDE静态分析代码的属性和调用来装饰代码。您可以在System.Diagnostics.Contracts命名空间中找到代码约定,但要利用完整的静态类型检查,您至少需要Visual Studio的Premium版SKU(我认为)。

一个简单示例,您的Functional属性与Pure基本相同:

[Pure]
public void GetMessage() { return _message; }

告诉分析仪该方法不进行状态更改。您还可以对方法进行前置和后置条件,例如:

public void WriteMessage(string message)
{
    Contract.Requires(message != null);
}

代码合约有很多深度,值得一读。

答案 1 :(得分:2)

static analysis tool NDepend几乎与你所描述的完全相同。看看这个默认的代码查询规则,它找到 pure (因为用 PureAttribute 标记)并且不再是 pure 的方法:

// <Name>Regression on pure methods</Name>
WARN IF Count > 0 IN SELECT METHODS WHERE 
  HasAttribute "OPTIONAL:NDepend.CQL.PureAttribute" AND 
  ( ChangesObjectState OR ChangesTypeState ) AND
  NbLinesOfCode > 0

// A method is pure if its execution doesn’t change 
// the value of any instance or static field. 
// Pure methods naturally simplify code by limiting 
// side-effects.
// See some explanations on immutability - purity and 
// how NDepend supports it here:
// http://codebetter.com/blogs/patricksmacchia/archive/2008/01/13/immutable-types-understand-them-and-use-them.aspx

// NDepend.CQL.PureAttribute is defined in the 
// redistributable assembly $NDependInstallDir$\Lib\NDepend.CQL.dll
// You can define your own attribute to tag 'pure' methods.

请注意,您可以使用自己的 PureAttribute 而不是规则中默认指定的那个,只需指定属性 namespace.nameAttribute

请注意,对于分配实例(对象)或<的方法,CQL (Code Query Language)子句 ChangesObjectState ChangesTypeState 返回true i> static(type)字段。