分析面向对象代码的思想
本文关键字:代码 面向对象 | 更新日期: 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(代码查询语言)子句ChangesObjectState和ChangesTypeState对于分配实例(对象)或静态(类型)字段的方法返回true。