0

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

如果我有这样的创造自己的东西,它的工作方式如下:当你和一个调试标志,它会自动添加神奇地“凝固”的代码为每个方法编译代码:

使用try-catch修改代码,并在catch中放置Debug.Assert(true)(以便在原始位置捕获异常)。

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

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

那么,为什么不呢?

+0

也希望听到更多关于这个框架应该包含什么的建议。焦点在C#上,显然这是对静态代码检查规则的补充。 – Avi 2010-01-13 07:59:24

回答

1

如果你想记录方法调用,你可以使用AOP框架,如PostSharp。诸如强制执行方法前/后处理等事情最好通过使用按照契约机制进行,如新的Code Contracts库将随.NET 4.0一起提供。仅仅检查参数为null是没有意义的,因为这可能是一个依赖于方法的有效值。注入调试。断言代码可能会有问题,因为您可能不希望/能够处理源代码函数中的异常。我认为如果不是不可能为这种事情创建一个通用框架是不切实际的,因为项目之间的需求会有很大差异。

编辑:为了澄清我有关添加调试断言到方法,评论 - 我看了你的建议是对的方法体转换为这样的事情:

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 
} 

这是一种有益的做法,我相信合约代码库支持“传统”的先决条件检查它的静态分析(抛出异常)。

+0

谢谢 - 伟大的参考资料,让他们陷入困境。 恕我直言,Debug.Assert不会引发异常,它提供了在“检测到问题的地方”附近停止执行的重要好处。问题在于它在运行时“死亡”,并且如果发生错误,它将毫无益处。所以我开始做的是: #region ArgCheck bool badCond =(theArgument == null)//例如 Debug.Assert(!badCond); if(badCond) throw new ArgumentNullException(); #endregion ArgCheck 糟糕的程序员的解决方案。但是让我感到恼火的是,通过这个代码来扩展这个区域。 – Avi 2010-01-20 16:31:36

0

我怀疑有类似的东西,如果,那么它肯定是不是可用的,这取决于你的规则定义,不同的人认为不同,有不同的需求和框架...... 你描述的东西可以通过元编程或一些宏观系统来实现 In J ava,有一些项目可以帮助实现这样的方法使用注释,不知道在C#宇宙中是否存在某些等价物。 然而,isValid()的功能看起来很像设计合同的想法,也许有一些框架。

+0

我在Safari Books Online上看到了Peter Vogel的“粗糙剪切”(即预览)“实用代码生成.NET”,我开始思考为什么要生成代码,然后我认为摆脱这种有效性检查手工劳动是一个很好的用法,所以我想知道是否有人这样做。 并重新规则/定义等 - 这已通过静态代码分析和规则实施工具(如FxCop)解决 - 显然,这样的框架必须是可配置的。 – Avi 2010-01-14 18:47:11

+0

不要忘记,静态分析只是使用一些度量标准,但没有证明任何东西,如果它确实是编译器的一部分。代码生成肯定是一种方式。 – 2010-01-15 00:40:27

1

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

1

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

一般来说,我认为很多真正有用的东西都需要内置到一种语言中,而不能单靠图书馆或框架来实现。我记得在高中时,他们教过的任何一个函数的注释中总是写前/后的条件,但我真正想看到的是写前/后条件,如果可能的话,在编译时检查,如果不是,则在运行。他们会被标记为某种方式,以便编辑者可以选择显示或隐藏它们,以免妨碍阅读真实代码。