我讨厌编写使我的软件更加稳固的代码。这是框架应该做的事情!那么,是否有人知道代码“增强”实用程序来巩固代码?
如果我必须自己创建这样的东西,它将按如下方式工作:当您使用Debug标志编译代码时,它会自动为每个方法添加“固化”代码:
使用try-catch对代码进行扭曲,并在catch中放入Debug.Assert(true)(以便在其原点捕获异常)。
记录每个方法的条目,打印参数的“ToString()”值,这样我就可以追踪正在发生的事情。
检查每个参数是否为空。
使用“IsValid”框架来检查对象本身和每个参数,其中IsValid()是对象声明其期望为真的方式(例如,如果我是TableOfContentsEntry,我希望总是在预订IsValid()并指向一个IsValid()的页面。
那么,为什么不呢?
答案 0 :(得分:1)
很高兴看到我的书被插上了!对我来说最大的问题是我认为代码生成的目标应该是“旁边”开发人员的代码 - 即。理想情况下,生成的代码不会与开发人员的代码混合在一起。我想知道是否有任何方法可以将这个'solidfying'代码添加为部分类或作为代理在类和调用它的客户端之间设置?当然,生成代码并将其插入开发人员的代码当然是可能的,但是您需要创建某种约定,以便在开发人员进行更改并重新生成“售罄”代码时,该工具可以删除旧代码。代码并根据开发人员代码的最新版本生成新代码。
答案 1 :(得分:1)
当你把一些东西传递给工人线程时,我会喜欢不丢失堆栈的东西。我甚至不知道这个(C#)的解决方法。很高兴知道父线程的堆栈直到工作线程的创建点。
总的来说,我认为很多非常有用的东西需要构建成一种语言,并且不能仅靠图书馆或框架来实现。我记得在高中时他们总是教导在函数的注释中写入前/后条件,但我真正希望看到的是编写在编译时检查的前/后条件,如果不是那么在运行。它们会被某种方式标记,以便编辑可以选择显示或隐藏它们,这样就不会妨碍阅读真实的代码。
答案 2 :(得分:1)
如果要记录方法调用,可以使用像PostSharp这样的AOP框架。像使用.net4.0一起提供的新Code Contracts库这样的契约式设计机制最好能够实现强制方法前/后条件。仅检查null的参数当然没有意义,因为这可能是一个有效的值,具体取决于方法。将Debug.Asserts注入代码可能会有问题,因为您可能不希望/能够处理源函数中的异常。我认为为这类事情创建一个通用框架即使不是不可能也是不切实际的,因为项目之间的需求差别很大。
编辑:澄清我关于将调试断言添加到方法中的评论 - 我读到你的建议是将方法体转换成这样的东西:
public void SomeMethod(args)
{
try
{
//original method body
}
catch(Exception ex)
{
Debug.Assert(false);
throw;
}
}
这个问题是Asserts表明永远不应该是假的东西 - 所以这个构造意味着该方法永远不会抛出一般不正确的东西。现在的问题是,如果方法抛出,即使调用方法适当地处理异常,断言也会失败。从您的评论看来,您似乎正在做这样的事情:
public void SomeMethod(object arg)
{
Debug.Assert(arg != null);
if(arg == null) throw new ArgumentNullException("arg");
//rest of method
}
这是一种有用的做法,我相信代码契约库在静态分析中支持“遗留”前提条件检查(抛出异常)。
答案 3 :(得分:0)
我怀疑有类似的东西,如果,那肯定不是那么可用。这取决于你的规则定义,不同的人认为不同,有不同的需求和框架...... 您描述的内容可以通过元编程或某些宏系统来实现。 在Java中,有一些项目可以帮助实现这种方法使用注释,不知道C#中是否存在一些等价物。 然而,isValid()功能看起来非常像契约构思的设计,也许有一些框架。