如果我能做魔法,我会想出一个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.如果你被要求实施它,你会从哪里开始?
答案 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)字段。