这篇文章主要介绍“C++说明后置条件有什么优点”,在日常操作中,相信很多人在C++说明后置条件有什么优点问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++说明后置条件有什么优点”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
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++的发展思路:提倡表达目的而不是做法。
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的内容更像是专门防止优化的,似乎并没有反映本来的想法。
后置条件经常在描述函数目的的注释中被非正式表达。使用Ensures()可以让后置条件更系统,直观和便于检查。
当后置条件和某些不会直接反映到返回值的结果时显得尤为重要,例如数据结构被使用过的状态等。
译者注:调用者的可能更加注意有没有,而忽略状态等细节。
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<mutex> _ {m}; // ...}
译者注:lock_guard是C++11开始的新特性,其实就是简单的RAII封装,在构造函数中进行加锁,析构函数中进行解锁。这样做的好处是保证函数退出时,锁一定被释放。
Note(注意)
理想情况下,后置条件在接口或声明时说明,这样用户就可以简单地看到它们。只有和用户相关的后置条件才可以在接口中描述。只和内部状态有关的后置条件属于定义和实现。
Enforcement(实施建议)
(非强制)这是一条哲学层面的准则,通常没有办法直接检查。在很多工具链中会存在领域限定的检查器(例如锁保持检查器)。
到此,关于“C++说明后置条件有什么优点”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。