Tag: 不变量

代码契约:抽象类中的不变量

我在使用带有代码约定的不变量时遇到了问题。 我想在我的抽象类中定义一个Invariant,但它只是被忽略了。 下面的代码显示了我的界面和抽象类。 [ContractClass(typeof(IPointContract))] interface IPoint { int X { get; } int Y { get; } } [ContractClassFor(typeof(IPoint))] abstract class IPointContract : IPoint { public int X { get { return 0; } } public int Y { get { return 0; } } [ContractInvariantMethod] private void PointInvariant() { Contract.Invariant(X > Y); } } […]

如何validation对象的内部状态?

我有兴趣听听您在操作期间使用什么技术来validation对象的内部状态,从它自己的角度来看,只有因为内部状态不良或不变的违规才能失败。 我的主要关注点是C ++,因为在C#中,官方和流行的方式是抛出exception,而在C ++中,不仅有一种方法可以做到这一点(好吧,不是真的在C#中,我知道)。 请注意,我不是在讨论函数参数validation,而是更像是类不变完整性检查。 例如,假设我们希望Printer对象异步地对打印作业进行Queue 。 对于Printer的用户来说,该操作只能成功,因为异步队列的结果会在另一时间到达。 因此,没有相关的错误代码传达给调用者。 但是对于Printer对象,如果内部状态不好,则此操作可能会失败,即类不变量被破坏,这基本上意味着:一个错误。 这种情况不一定是Printer对象的用户感兴趣的。 就个人而言,我倾向于混合三种内部状态validation方式,我无法确定哪一个是最好的,如果有的话,哪一个绝对是最差的。 我想听听你对这些问题的看法,并且你也分享了自己在这方面的经验和想法。 我使用的第一个样式 – 以可控制的方式比损坏的数据更好地失败: void Printer::Queue(const PrintJob& job) { // Validate the state in both release and debug builds. // Never proceed with the queuing in a bad state. if(!IsValidState()) { throw InvalidOperationException(); } // Continue with queuing, parameter checking, etc. // Internal […]