gpt4 book ai didi

php - 如何在编程中进行良好的验证?

转载 作者:行者123 更新时间:2023-12-03 07:41:15 28 4
gpt4 key购买 nike

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

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com