【发布时间】:2015-04-11 09:57:50
【问题描述】:
作为一种好的做法,您认为应该在参数被传递到的函数中验证传递的参数,还是只是确保该函数将始终接受正确的参数?
考虑以下代码:
Matrix * add_matrices(const Matrix * left, const Matrix * right)
{
assert(left->rowsCount == right->rowsCount
&& left->colsCount == right->colsCount);
int rowsCount = left->rowsCount;
int colsCount = left->colsCount;
Matrix * matOut = create_matrix(rowsCount, colsCount);
int i = 0;
int j = 0;
for (i; i < rowsCount; ++i)
{
for (j; j < colsCount; ++j)
{
matOut->matrix[i][j] = left->matrix[i][j] + right->matrix[i][j];
}
}
return matOut;
}
你认为我应该在将参数传递给函数之前还是之后检查参数,即。在功能?什么是更好的做法还是取决于程序员?
【问题讨论】:
-
我认为这是基于意见的。在哪里检查并不重要......
-
是的,像您所做的那样添加前提条件是一种很好的做法。调用者必须确保矩阵的大小相同,但如果矩阵是在调用之前创建的,则不需要额外的测试。
-
@AugustKarlstrom 因此,即使有人在我之后编写此代码的可能性为 0%(这只是一个学校项目),如果有人这样做,那么此代码是否易于阅读和理解?另一个程序员会明白,为了使用这个函数,必须在传递参数之前在函数外部检查正确的参数吗?
-
这确实是一个设计决策。如果代码的用户可以保证输入是正确的,他们可能不想承担运行时检查的成本。另请注意,
assert在生产中被禁用是很常见的。 -
是的,只要您的函数有据可查,那么调用者就可以知道提供有效输入是否是他们的责任。 C 中充满了假定被调用者传递有效输入并产生未定义行为的函数。
标签: c parameter-passing