如何在C#中实现具有前/后条件和不变量的Stack类?
有没有人有关于如何/什么是在C#中实现Stack类的最佳方式的例子或想法?我知道已经有一个Stack类,但我需要了解如何实际实现Stack类.
我还需要有关如何在C#中使用Contracts来指定此类的前置条件,后置条件和不变量的建议.我认为在ASP.NET MVC架构中创建模型之前我曾经使用过类似的东西,但我不完全确定它是否是同一个东西并且工作方式相同. (我在前置条件/??后置条件/不变量上有点迷失,如果你还不能说 – 那么请耐心等待.) 我的主要问题 – 有人可以给我一些关于正确使用类别如Stack的类的建议. 是的,我已经付出了努力: public interface IStack { void Push(Object e); Object Pop(); Object Top(); void EnsureCapacity(); } } public class Stack : IStack { private Object[] elements; private int size = 0; public Stack() { elements = new Object[0]; } public void Push(Object e) { // check if this array capacity has been reached and increase if needed EnsureCapacity(); elements[size++] = e; } public Object Pop() { // check if the method call is invalid for the object's current state if (size == 0) throw new InvalidOperationException("Stack.Pop"); Object result = elements[--size]; elements[size] = null; return result; } public Object Top() { // check if the method call is invalid for the object's current state if (size == 0) throw new InvalidOperationException("Stack.top"); return elements[(size - 1)]; } private void EnsureCapacity() { if (elements.Length == size) { Object[] oldElements = elements; elements = new Object[(2 * size + 1)]; } } } 解决方法
如果你想,为了开始使用微软代码合同,我做了一次
blog post.该职位涵盖了基本的前提条件,后置条件和不变量.
作为概念的总结,您可以将它们想象如下: >在执行方法之前必须满足的前提条件 – 客户承诺您的方法. 所以,在我的头顶,对于一个堆栈,一个容易想到的可能是一个不变的.如果您使用数组对堆栈建模,则可以在类上声明一个永远不会设置为null的类的不变量,例如,您将定义不变方法: [ContractInvariantMethod] private void ObjectInvariant() { Contract.Invariant(elements != null); } 看起来你已经有了一个pop方法的先决条件 – 你想说用户有责任在执行pop时确保堆栈不为空.所以,在pop方法的开头,你有: Contract.Requires(size > 0); 最后,你可以在pop上指定一个后置条件,该大小总是小于pop操作之前的大小(如果你愿意,可以更具体): Contract.Ensures(Contract.OldValue<int>(size) > size); 祝它好运 – 合同很酷且很有用.这是一种非常干净的编码方式. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |