我正在为一个小项目编写一些碰撞检测代码,我有这个用于矩形碰撞:
bool RectColl(const SDL_Rect *r1, const SDL_Rect *r2)
{
assert(r1 != nullptr);
assert(r2 != nullptr);
// cool stuff here
}
这用于像素级完美碰撞
bool PPColl(const SDL_Rect *r1, const SDL_Surface *s1, const SDL_Rect *r2, const SDL_Surface *s2)
{
assert(r1 != nullptr);
assert(r2 != nullptr);
assert(s1 != nullptr);
assert(s2 != nullptr);
// Make sure that it's got rectangular collision
if(!RectColl(r1, r2))
return false;
// more cool collision detection code here
}
如您所见,我在调用 PPColl 时对 r1 和 r2 进行了两次断言。这是多余的,还是我应该保留 r1 和 r2 的断言?
最佳答案
断言应该是多余的,因为它们应该检查您的代码确保始终为真的东西。他们的目的是捕捉那些你认为总是正确但实际上错误的东西。他们捕获的这类问题通常是 future 对代码进行更改的结果,而不是程序的当前状态。
在这种情况下,您的断言有不同的用途,应该全部保留。 PPColl
中的那些正在检查它 从未使用空参数调用。 RectColl
中的参数与 PPColl
的参数无关;他们正在检查 RectColl
的参数。如果 RectColl
仅被 PPColl
调用,那么它们是同一件事,因此它们已经被检查过,但这是代码的属性现在;如果你删除了 RectColl
的断言,你可能无法捕捉到 future 的错误,在这种情况下,一些其他代码也使用可能为 null 的参数调用它,或者如果 PPColl
后来被更改能够接受空指针来表示某事,或任何其他可能的变化。
关于c++ - 什么时候断言变得多余?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21396056/