函数的输入输出设计

函数的输入输出设计

输入要保持开放,输出要保持保守。(Be liberal in what you accept, and conservative in what you send.)

-- Jon Postel 谈如何设计接口

我经常看到这样的程序:

1
2
3
4
5
6
7
8
9
10
11
void FuncName(char* str)
{
int len = strlen(str);
.....
}

char* GetUserName(struct user* pUser)
{
return pUser->name;
}

不!请不要这样做。

你应该先判断一下传进来的那个指针是不是为空。如果传进来的指针为空的话,那么,你的一个大的系统就会因为这一个小的函数而崩溃。一种更好的技术是使用断言(assert),这里我就不多说这些技术细节了。当然,如果是在C++中,引用要比指针好得多,但你也需要对各个参数进行检查。

写有参数的函数时,首要工作,就是要对传进来的所有参数进行合法性检查。而对于传出的参数也应该进行检查,这个动作当然应该在函数的外部,也就是说,调用完一个函数后,应该对其传出的值进行检查。

当然,检查会浪费一点时间,但为了整个系统不至于出现“非法操作”或是“Core Dump”的系统级的错误,多花这点时间还是很值得的。

同理,对于系统返回的或其它函数参数的参数,要先进行检查,例如fopen返回的是不是NULL