问题是,我想开发自己的一套API,并且它将与其他人共享,当我开发这个API时,我无法确保其他人正在做正确的事情......假设我提供了一个简单的打招呼程序... 在任何错误检查和验证中都会有这样的内容:
function sayHello($yourName){
echo($yourName);
}
然后,有些人可能不知道应该传递 $yourName 参数什么,并包括类型检查,所以我将增强这样的东西......
/**
* Say hello to someone.
*
* @param string $aName
**/
function sayHello($yourName){
if (!is_string($aName)) {
throw new ArgumentException("Type not correct.");
}
echo($yourName);
}
好吧,我可能还要进一步检查,例如,用户可能会传递一个空字符串或很长的字符串给我,所以我也需要避免这种情况,所以我的代码将变成这样:
/**
* Say hello to someone.
*
* @param string $aName
**/
function sayHello($yourName){
if (!is_string($yourName)) {
throw new ArgumentException("Type not correct.");
}
if(strlen($yourName)) == 0 || strlen($yourName)) > 100){
throw new ArgumentException("argument length is invalid.");
}
echo($yourName);
}
好吧,即使是最坏的情况,我的函数中有一些业务逻辑,例如,我的函数只允许英文名称,所以,我会有更复杂的东西,如下所示:
/**
* Say hello to someone.
*
* @param string $aName
**/
function sayHello($yourName){
if (!is_string($yourName)) {
throw new ArgumentException("Type not correct.");
}
if(strlen($yourName)) == 0 || strlen($yourName)) > 100){
throw new ArgumentException("argument length is invalid.");
}
if(!isEnglishName($yourName)){
throw new ArgumentException("argument business logic is wrong.");
}
echo($yourName);
}
正如你所看到的,仅仅这个简单的sayHello程序就可以从3行代码变得更多,它只是一个简单的功能,考虑到我更复杂的逻辑,我怎样才能简化这个过程呢?我可以采取什么样的策略?谢谢。
最佳答案
出色的例子!
简而言之 - 不要验证任何东西,这不值得付出更多的努力。
- 你必须编写它们 - 这很困难(3 条规则,甚至可能更糟)
- 它们通常在不同的地方重复(sayHello、setDefaultHello 等) - 因为您没有正确的类型(名称),您仍然只是“限制”字符串。
- 你必须抛出异常 - 但是是哪一个呢?
我知道这听起来有多糟糕(我完全忽略了按接触设计,我有多糟糕!),但是:
- 无论如何,限制输入参数有什么意义?
- 您真的想禁止传递对象吗?
- 你的代码是关于“做”还是“限制”?专注于您的目标 - 必须做什么,而不是如何做和何时做。
- 哪个版本更具可读性?有或没有验证?
尤其是最后一个应该令人信服。
摘要:
- 您可以引入 Name 类(以及适用于您所有类型的许多其他类)
- 或者您可以进入duck-typing
我建议后者。如果您还没有意见,那就尝试一下,您随时可以回到按契约(Contract)设计。只是永远不要将它们混合在一起。
关于php - 编程中如何做好验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6475992/