首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合同设计与防御性编程的栈实现

合同设计与防御性编程的栈实现
EN

Software Engineering用户
提问于 2016-10-07 23:49:08
回答 1查看 1K关注 0票数 2

我试图使用两种技术来编写堆栈代码,即契约设计与防御性编程,但我不确定我做的是对还是错,我不会在合同中抛出任何异常或错误,假设所有输入都是正确的。

EN

回答 1

Software Engineering用户

发布于 2016-10-08 00:22:15

  1. 它有助于了解您使用的是哪种语言,特别是该语言是否为您提供了一些安全特性,比如数组边界检查。例如,如果您使用的是Java或C#,您将得到数组边界检查,这将在出错时自动抛出,但是如果您在C/C++中工作,您的程序可能会像受伤的动物一样工作一段时间,然后跑掉并在其他地方死亡。
  2. “契约式设计”的概念超出了接口(仅仅是方法签名)的范围,涉及到必须指定的先决条件和后条件,而您还没有这样做。例如,如果堆栈已满(如果它增长存储或抛出异常或其他),或者在堆栈为空时弹出,则未指定行为是什么。此外,在“按合同设计”中,我们完全期望对先决条件和后条件进行监测,因此对它们的测试是有效的。(将通过语言构造来支持这一点,但您可以通过断言或条件抛出在其他语言中这样做。)例如,是否弹出空堆栈会产生null和异常。Design不使用读取实现来确定该契约,因此您应该在某个地方(例如,在JavaDoc中)显式地声明这类信息。没有文档化的构造函数,所以我们甚至不能从方法签名的角度来判断合同的最终结果。
  3. 你所做的防御性的工作就是检查某些语言会给你带来的错误(或者不取决于你对语言的选择)。因此,根据语言的不同,这要么是好的,要么不是完全必要的,但也取决于您想要做的日志记录的方法(不过,println‘S不是最好的日志记录形式)。尽管如此,您可能希望抛出一些更具体的异常,而不是让运行时选择一个,但在这个简单的例子中,我可能会让运行时为我检查和抛出边界。
  4. 如果您确实是在进行防御性编程,那么您将编写程序来防止您自己的错误,而不仅仅是您的调用者的错误。这意味着您的push操作应该检查>= size,而不是== size,因为谁知道您的代码是否允许任意设置大小。
  5. 如果您使用的语言是基于零的数组,则应该在push和预减量( pop)中添加增量,否则将浪费数组中的第一个元素。(如果您调整了这一点,那么大小检查应该被1抵消。)意外的浪费,导致无法提供所宣传的容量,可能是违反合同,就像打电话的人太多了一样。
票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/333126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档