在生产代码中使用条件“调试模式”(if \ else)块是不好的做法 - PHP

时间:2018-01-06 18:44:22

标签: php validation debugging

我正在为处理数据的个人项目编写一些类,并确保它符合我的确切规范。输出是一个数组(API的JSON对象),由相应字段的true \ false值组成,以查看它们是否通过了我的测试。

有些测试很复杂,有多种情况,很难确定一个字段为什么某个字段测试失败。

对于每个测试,我都考虑放置一个可以在对象实例化时启用的DEBUG标志。这让我有两个选择。

A)如下复制验证功能。在debug_validate()函数中,我返回一个附加数组,其中包含字段及其失败的原因。这要求我保留两份功能。

if ($this->debug_mode) {
    debug_validate();
}else{
   validate();
}

B)在实际验证功能中,我可以执行以下操作

if (!test1($field)) {
    $validation_result[$field]=false;
    if($this->debug_mode) {
       $debug_result[$field]="Field is too small. Result of strlen: ".strlen($field);
    }
}
.
.
.

这意味着每次验证函数运行时我都必须运行“if”块,即使它在99.9999999%的时间内不会被使用。这似乎效率低下。

我是否在思考这个问题。我的意思是现代硬件谁会关心它是否运行额外的if声明。我只是想知道在生产中这对于数以百万计的请求是否真正重要(必须考虑大:) :)这些调试语句开始加起来(这里很少有MS,很少有MS)

2 个答案:

答案 0 :(得分:-1)

好吧,如果你是为一家公司写的,那么是的,这将是一个不好的做法。在代码审查期间,团队会将代码交回给您。你有没有删除调试代码。

由于您正在开发个人项目,因此您现在可以使用调试代码。好处是它可以帮助您更快地调试项目,而不是没有它。您可以稍后清理代码,当您为其最终生产版本烘焙时。或者,如果您在将来的版本中从beta切换到gold状态(比如说从现在开始的6个月或1年)。

困难的部分是看到服务器发生了什么,你无法直接访问源代码。这通常发生在QA,测试,登台或生产服务器上。您可以轻松编辑localhost框中的代码,但无法在其他服务器上轻松编辑代码。

你不想做的就是保持开放状态,而不是写一个安全保护它的方法。您不希望其他人能够触发此代码... if ($this->debug_mode) {。如果你把一些重要的东西放在那个PHP块中...就像SQL ......那么有人可以看到它&开始了解数据库的布局方式。它会告诉他们去哪里,开始入侵你的数据库。他们想要开始提升用户访问权限!你不希望他们成为一名管理员和他们。锁定你自己的数据库!因此,请确保使用以下内容保护代码:

if (($_SERVER['HTTP_HOST'] === 'qa.yoursite.com') && ($this->debug_mode)) {
    debug_validate(); // <- QA uses this.
} else {
   validate(); // <- Production uses this.
}

注意:这只能在QA服务器上运行,但它适用于可以使用该服务器的所有人!所以要小心,除了你自己之外,你不能让任何人访问QA服务器!

如果您使用userId进行了密码保护登录,则可以使用此示例。它适用于任何服务器。您还可以将这两个代码示例组合在一起,将userId锁定到特定服务器。

if ($myUserId === 'myUserId') {
   debug_validate(); // <- You'll use this.
} else {
   validate(); // <- Everyone else uses this.
}

理想情况下,您要做的是仅使用validate();代码而不使用debug_validate();代码,并设置单元测试以针对您的代码运行。它应该包括测试,以验证一切正确验证。它还应包括用于验证错误数据无法验证的测试。当您的网站达到该级别时,您将不再需要使用debug_validate()方法。单元测试将报告一切是否良好或是否有任何失败。

此时我不担心ms加载时间。也不是服务器负载。 PHP代码运行得如此之快,以至于你不会注意到它。更专注于让代码正常工作,而不是让它看起来漂亮。您可以随后重构代码,以便在其工作后进行清理。当你看到工作代码越来越清洁时,它会让你感到更快乐!

答案 1 :(得分:-1)

您的生产代码必须评估额外的&#34; IF&#34;在任何一种情况下都有条件,除非我误解?无论是在函数内还是在调用脚本中,额外的开销(即使在负载下也可能非常小,除非你有数千个)将是相同的。

我的生产代码是&#34;调试模式&#34;在过去键入标志并且它运行良好 - 但是,这种方法存在一些问题 - 即,您需要更改代码(即打开或关闭标志),因此需要执行另一个构建/部署以进行调试。此外,记住打开/关闭调试模式可能是一件苦差事。它往往会弄脏您的代码/使其不易读/易维护。

就个人而言,我会采取一些不同的方法,特别是如果您认为调试对您的应用程序来说是常见的事情 - 您可以使用像PHP单元这样的工具编写单独的单元测试来进行调试。如果您以某种形式或形式将传入的请求记录到您的应用程序,则应该很容易将生产数据传输到您的单元测试代码库并在该环境中进行调试,而不是在生产代码中。

如果您正在运行测试驱动的开发环境,那么首先编写单元测试应该是常见的做法。

相关问题