编程逻辑最佳实践 - 冗余检查

eld*_*blz 3 php logic coding-style

我正在创建一个大型的PHP项目,我对如何继续进行一个微不足道的疑问.

假设我们有一个类books,在这个类我有方法ReturnInfo:

function ReturnInfo($id) {
    if( is_numeric($id) ) {
        $query = "SELECT * FROM books WHERE id='" . $id . "' LIMIT 1;";

        if( $row = $this->DBDrive->ExecuteQuery($query, $FetchResults=TRUE) )   {  
                return $row;
        } else {
            return FALSE;
        }
    } else {
        throw new Exception('Books - ReturnInfo - id not valid.');          
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我有另一种方法 PrintInfo

function PrintInfo($id) {
    print_r( $this->ReturnInfo($id) );
}
Run Code Online (Sandbox Code Playgroud)

显然,代码示例仅是示例,而不是实际的生产代码.

在第二种方法中,我应该(再次)检查id是否为数字?或者我可以跳过它,因为在第一种方法中已经注意了,如果它不是异常将被抛出?

直到现在我总是用冗余支票编写代码(无论是否已在其他地方检查过,我也会在这里查看)

有最好的做法吗?只是常识吗?

提前感谢您的回复.

dec*_*eze 5

好吧,通过检查每一层,问问自己你获得了什么.它更安全吗?不,因为使用该值的函数(唯一一个易受攻击的函数)执行检查本身.

它唯一的优点是你可以提前停止无效值,从而执行更少的代码.在知道值无效之前,它不必一直向下和备份.这可能是也可能不是真正的优势.

它确实会产生问题:你有更多的代码.你的代码不再干了.如果更改"有效"值的定义,则必须更改所有地方的检查.那些是更大的问题.

我会以这种方式处理问题:您的核心业务模型执行详细检查,最终负责确保值有效,并且它是唯一一个使用此值执行"危险"操作的人.外层(控制器,视图)仅传递值.除了一个例外:他们可能会进行"粗略"的数据验证.假设您的模型需要具有特定格式的电话号码.您应该在模型中检查此特定规则.在视图/控制器层中,您可以大致验证该值至少在某种程度上是数字的.说,你有一个Javascript检查.这会阻止您的核心应用程序出现错误的错误值,同时仍然可以灵活地在一个地方调整核心验证规则.