分析面向对象代码的思想

本文关键字:代码 面向对象 | 更新日期: 2023-09-27 18:07:44

如果我能变魔术,我会变出一个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. 如果你被要求执行它,你会从哪里开始?

分析面向对象代码的思想

代码契约本质上是做你所要求的。(http://msdn.microsoft.com/en-us/devlabs/dd491992)

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

一个简单的例子,你的Functional属性本质上与Pure:

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

告诉分析器该方法不改变状态。你也可以在方法上设置前置和后置条件,例如:

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

Code Contracts有很多深度,值得一读。

静态分析工具NDepend几乎可以完成您所描述的工作。看看这个默认的代码查询规则,它找到了(因为标记了PureAttribute)和不再是的方法:

// <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而不是规则中默认指定的那个,只需指定您的属性 namspace . nameattribute

请注意,CQL(代码查询语言)子句ChangesObjectStateChangesTypeState对于分配实例(对象)静态(类型)字段的方法返回true。