检查前提条件应由谁负责?

时间:2018-10-13 19:09:06

标签: c++ c architecture paradigms

在函数是关键角色的过程语言中,按合同范式进行的设计基本上表明,采用参数的函数与调用者之间存在协议。

该协议类似于“如果调用者确保满足该功能的先决条件,则该功能将以预期的方式工作和/或返回预期的值。”

如果我们严格按照这种方式编写代码,则仅由调用方负责确保对函数的正确输入。但是以防御性编程的名义,包括内部保护措施以防调用者做一些愚蠢的事情似乎是明智的。

在软件体系结构和设计方面,最好的方法是什么?

2 个答案:

答案 0 :(得分:3)

这是来电者的责任。例如,如果strlen的实现传递了空指针怎么办?它唯一能做的就是中止程序-这是C语言中可行的选择(如果过于严格)。在C ++中,它可能引发异常(但如果遵循C ++标准,则不会抛出异常),但是处理该异常将非常难。因此,允许程序保持在已知状态下运行的唯一明智的解决方案是,不要使用空指针作为参数来调用strlen,将检查的责任放在调用代码上。

答案 1 :(得分:1)

正如尼尔所说,检查是呼叫者的责任。你说,

  

包括内部保护措施以防呼叫者做一些愚蠢的事情似乎是明智的。

为描述为什么这不是理想的方法,我将在Neil的示例中进行扩展,该示例使用检查将空指针传递给strlen的情况,设想两种情况:

  1. 调用strlen的函数会预先检查输入。
  2. strlen在对其进行操作之前会先对其内部进行检查。

如果您一次调用strlen,则这两种方法的效率没有区别。但是,假设您不是连续调用strlen,而是连续调用strlenstrstr和其他字符串函数。在方案1中,无论您是从字符串库中对函数进行1、2、10还是100次调用,都只需检查一次错误的输入即可。在方案2中,每个调用都被迫检查输入,从而使过程慢得多。