0

我讨厌编写使我的软件更可靠的代码。这是框架应该做的事情!那么,是否有人知道可以巩固代码的代码“增强”实用程序?

如果我必须自己创建类似的东西,它将按如下方式工作:当您使用 Debug 标志编译代码时,它会自动为每个方法添加“固化”代码:

使用 try-catch 扭曲代码并将 Debug.Assert(true) 放入 catch 中(以便在其起源处捕获异常)。

记录每个方法的条目,打印参数的“ToString()”值,这样我就可以追踪发生了什么。

检查每个参数是否为空。

使用“IsValid”框架检查对象本身和每个参数,其中 IsValid() 是对象声明其期望为真的方式(例如,如果我是 TableOfContentsEntry,我希望始终在 IsValid 的书中() 并指向 IsValid() 的页面。

那么,为什么不呢?

4

4 回答 4

1

很高兴看到我的书被插上!对我来说,最大的问题是我认为代码生成应该旨在与开发人员的代码“旁边”——即理想情况下,生成的代码不会与开发人员的代码混合。我想知道是否有任何方法可以将此“固化”代码添加为部分类或作为在类和调用它的客户端之间设置的代理?当然,当然可以生成代码并将其插入到开发人员的代码中,但是您需要创建某种约定,以便当开发人员进行更改并重新生成“出售”代码时,该工具可以删除旧的代码并根据开发人员代码的最新版本生成新代码。

于 2010-01-19T15:13:37.113 回答
1

当您将某些东西传递给工作线程时,我会喜欢不会丢失堆栈的东西。我什至不知道这个(C#)的解决方法。很高兴知道父线程的堆栈直到创建工作线程为止。

总的来说,我认为很多真正有用的东西都需要内置到一种语言中,而仅靠库或框架并不能真正干净地实现。我记得在高中时,他们教过总是在函数的评论中写下前置/后置条件,但我真正想看到的是编写前置/后置条件,如果可能的话,在编译时检查,如果不是那么在运行。它们会以某种方式被标记,以便编辑器可以选择显示或隐藏它们,这样就不会妨碍阅读真实代码。

于 2010-01-19T15:27:42.630 回答
1

如果要记录方法调用,可以使用PostSharp 之类的 AOP 框架。诸如执行方法前置/后置条件之类的事情最好使用按合同设计的机制来实现,例如新的代码合同库,它将与 .net4.0 一起提供。只检查 null 的参数当然没有意义,因为这可能是一个有效值,具体取决于方法。将 Debug.Asserts 注入代码可能会出现问题,因为您可能不希望/能够处理源函数中的异常。我认为为这类事情创建一个通用框架即使不是不可能也是不切实际的,因为项目之间的需求差异很大。

编辑:为了澄清我关于在方法中添加调试断言的评论 - 我读了你的建议,将方法体转换成这样的东西:

public void SomeMethod(args)
{
    try
    {
        //original method body
    }
    catch(Exception ex)
    {
        Debug.Assert(false);
        throw;
    }
}

这样做的问题是,断言指示的东西永远不应该是错误的——所以这个结构意味着该方法永远不会抛出,这通常是不正确的。现在的问题是,如果方法确实抛出,即使调用方法适当地处理了异常,断言也会失败。从您的评论看来,您正在做这样的事情:

public void SomeMethod(object arg)
{
    Debug.Assert(arg != null);
    if(arg == null) throw new ArgumentNullException("arg");

    //rest of method
}

这是一种有用的做法,我相信代码契约库在其静态分析中支持“遗留”前置条件检查(抛出异常)。

于 2010-01-19T15:28:02.320 回答
0

我怀疑是否有类似的东西,如果,那么它肯定不是那么有用。这取决于你的规则定义,不同的人有不同的想法,有不同的需求和框架......你描述的事情可以通过元编程或一些宏系统来实现。在 Java 中,有一些项目可以帮助实现这种使用注解的方法,不知道在 C# 世界中是否有一些等价物。然而,isValid() 功能看起来很像按合同设计的理念,也许有一些框架可以做到这一点。

于 2010-01-14T12:43:11.213 回答