如何在C#中实现具有前后条件和不变量的Stack类?

如何在C#中实现具有前后条件和不变量的Stack类?,第1张

概述有没有人有关于如何/什么是在C#中实现Stack类的最佳方式的例子或想法?我知道已经有一个Stack类,但我需要了解如何实际实现Stack类. 我还需要有关如何在C#中使用Contracts来指定此类的前置条件,后置条件和不变量的建议.我认为在ASP.NET MVC架构中创建模型之前我曾经使用过类似的东西,但我不完全确定它是否是同一个东西并且工作方式相同. (我在前置条件/​​后置条件/不变量上有 有没有人有关于如何/什么是在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);

祝它好运 – 合同很酷且很有用.这是一种非常干净的编码方式.

总结

以上是内存溢出为你收集整理的如何在C#中实现具有前/后条件和不变量的Stack类?全部内容,希望文章能够帮你解决如何在C#中实现具有前/后条件和不变量的Stack类?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1234036.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存