【问题标题】:Should I be avoiding a long list of IF statements?我应该避免一长串 IF 语句吗?
【发布时间】:2013-02-12 08:56:59
【问题描述】:

我是否应该避免在我的代码中包含一长串序列化的 IF 语句?有时这似乎是不可避免的,但我想知道这是否只是我的经验不足。

例如,如果您正在处理用户上传的图片 - 并且您希望对任何错误提供准确的反馈 - 您可能会遇到以下情况:

if($file["size"] == 0) { 
    throw new Exception("ERROR: File was empty");
}

if (($file["type"] != "image/gif")
|| ($file["type"] != "image/jpeg")
|| ($file["type"] != "image/pjpeg")
|| ($file["type"] != "image/png")) {
    throw new Exception("ERROR: Image must be either GIF, PNG or JPEG!");
}

if ($file["size"] > 2000000) {
    throw new Exception("ERROR: Image must be than less 2MB!");
}

    if ($file["error"] > 0) {
    throw new Exception("UNKNOWN ERROR: ".$file['error']);
}

$imgDetails = getimagesize($file["tmp_name"]);

if($imgDetails['channels'] != 3){
    throw new Exception("ERROR: Image must be RGB.)";
}

if($imgDetails['0'] < 50 && $imgDetails['1'] < 50) {
    throw new Exception("ERROR: Image must be larger then 50 x 50.)";           
}

等等。等等等等。直到最终文件通过所有测试并被处理。

这是“坏习惯”吗?

【问题讨论】:

    标签: php optimization if-statement


    【解决方案1】:

    您可以使用in_array 来缩短类型检查,但通常这是一种很好的形式,除了直接将输出推送到此函数之外。如果这是通过类完成的,您可能希望使用异常而不是直接推送错误输出。

    早点回来,经常回来。

    【讨论】:

    • 听起来很明智! :) 不过,我正在阅读 Exceptions,而这个博客完全让我感到困惑。以上是什么类型的例外......? blogs.msdn.com/b/kcwalina/archive/2007/01/30/…
    • 这取决于你想用它走多远。如果您只想传递一条消息,那么您可以只使用基本异常类。设置异常类允许您以不同方式处理每种类型的异常,这可能是不需要的。
    • 谢谢,我现在更新了这个问题——只是为了更好的衡量:)
    【解决方案2】:

    您可以创建一个限制集合并编写代码为您查看该集合,而不是列出任意限制。

    虽然我忘记了在 javascript 中执行此操作的方法,但类似于 How do I check if an array includes an object in JavaScript?

    希望这会有所帮助>.>

    【讨论】:

    • 这是 PHP,不是 Javascript。
    【解决方案3】:

    我发现通常你所说的那种 if 链可以变形为函数的 hashmap,其中一些选择器作为它们的键。

    如果您有一个类似于 $processImage = { "image/gif" =&gt; function processGIF(){blah} } 的哈希映射,您可以访问 O(1) 中的每个函数,而不是平均 O(n/2) (假设调用的正态分布也是不准确的)。众所周知,除非它经常发生,否则这并不重要。

    然后你可以使用$processImage["image/gif"]();调用那个函数(我认为这是有效的语法,我最近几年做的JS比php多得多。)

    不过,我确实发现 hashmap 方法的可扩展性和可读性也很好,所以它也适用。

    当然,重构这些是有好处的。但在许多情况下,这样做的好处是微乎其微的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多