网站建设资讯

NEWS

网站建设资讯

C++说明后置条件有什么优点

这篇文章主要介绍“C++说明后置条件有什么优点”,在日常操作中,相信很多人在C++说明后置条件有什么优点问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++说明后置条件有什么优点”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

为企业提供网站建设、成都做网站、网站优化、网络营销推广、竞价托管、品牌运营等营销获客服务。成都创新互联拥有网络营销运营团队,以丰富的互联网营销经验助力企业精准获客,真正落地解决中小企业营销获客难题,做到“让获客更简单”。自创立至今,成功用技术实力解决了企业“网站建设、网络品牌塑造、网络营销”三大难题,同时降低了营销成本,提高了有效客户转化率,获得了众多企业客户的高度认可!

I.7: State postconditions (说明后置条件)

Reason(原因)

To detect misunderstandings about the result and possibly catch erroneous implementations.

一方面可以检查对于结果的错误理解,另一方面可以捕捉易错实现。

Example, bad(反面示例)

Consider:(考虑)

int area(int height, int width) { return height * width; }  // bad

这里我们(鲁莽地)遗漏了定义前置条件,因此没有明确高度和宽度必须为正值这件事。我们也没有定义后置条件,因此当面积大于最大整数的时候算法存在错误这件事也不容易被察觉。这里会发生溢出错误。考虑使用:


int area(int height, int width){    auto res = height * width;    Ensures(res > 0);    return res;}

译者注:和Expects表示前置条件相对,Ensures用于表现后置条件。这符合现代C++的发展思路:提倡表达目的而不是做法。

Example, bad(反面示例)

Consider a famous security bug:(考虑一个著名的安全性bug)

void f()    // problematic{    char buffer[MAX];    // ...    memset(buffer, 0, sizeof(buffer));}

There was no postcondition stating that the buffer should be cleared and the optimizer eliminated the apparently redundant memset() call:

不存在后置条件表明buffer应该被清空,因此优化程序会消除明显多余的memset调用。


void f()    // better{    char buffer[MAX];    // ...    memset(buffer, 0, sizeof(buffer));    Ensures(buffer[0] == 0);}

译者注:这个例子比上一个稍好,但是Ensures的内容更像是专门防止优化的,似乎并没有反映本来的想法。

Note(注意)

后置条件经常在描述函数目的的注释中被非正式表达。使用Ensures()可以让后置条件更系统,直观和便于检查。

Note(注意)

当后置条件和某些不会直接反映到返回值的结果时显得尤为重要,例如数据结构被使用过的状态等。

译者注:调用者的可能更加注意有没有,而忽略状态等细节。

Example(示例)

Consider a function that manipulates a Record, using a mutex to avoid race conditions:

考虑一个操作记录的函数,它使用mutex防止竞争条件。

mutex m;
void manipulate(Record& r)    // don't{    m.lock();    // ... no m.unlock() ...}

这里我们“忘记了”说明mutex应该被释放这件事,因此我们不知道保证释放mutex失败这件事是bug还是功能。说明后置条件可以明确这件事:

void manipulate(Record& r)    // postcondition: m is unlocked upon exit{    m.lock();    // ... no m.unlock() ...}

有bug这件事已经很明显了(但还只是人类可读的注释)。更好一些的选择是:使用RAII来保证后置条件(“锁必须被释放”)会被强制释放。

void manipulate(Record& r)    // best{    lock_guard _ {m};    // ...}

译者注:lock_guard是C++11开始的新特性,其实就是简单的RAII封装,在构造函数中进行加锁,析构函数中进行解锁。这样做的好处是保证函数退出时,锁一定被释放。

Note(注意)

理想情况下,后置条件在接口或声明时说明,这样用户就可以简单地看到它们。只有和用户相关的后置条件才可以在接口中描述。只和内部状态有关的后置条件属于定义和实现。

Enforcement(实施建议)

(非强制)这是一条哲学层面的准则,通常没有办法直接检查。在很多工具链中会存在领域限定的检查器(例如锁保持检查器)。

到此,关于“C++说明后置条件有什么优点”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


网站名称:C++说明后置条件有什么优点
当前URL:http://cdweb.net/article/ispijj.html