php - 编程中如何做好验证?

标签 php validation error-handling

问题是,我想开发自己的一套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/

相关文章:

xampp - XAMPP 上的 php.ini 设置被忽略

javascript - 使用 javascript 进行文本框验证

javascript - 如何将所有 javascript/Jquery 异常写入一个文本文件?

ruby-on-rails - Rails 表单错误 - 验证

ios - ios中uitextField中金额条目的正则表达式

jquery - 当我使用 .ajax 和 JSONP 时,如何处理失败的 JSON 请求?

php - MediaWiki 批量页面重命名

javascript - 使用 bootstraptoggle 动态更改切换

php - 来自 mysql 的数组数组用于填充国家/地区城市的选择

c# - 如何仅在填充上面行的特定单元格后才向 datagridview 添加新行?