我应该避免一长串的IF声明吗?

时间:2013-02-26 18:54:25

标签: php optimization if-statement

我应该避免在代码中列出一长串序列化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.)";           
}

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

这是“不良做法”吗?

3 个答案:

答案 0 :(得分:1)

您可以使用in_array来缩短类型检查,但通常这是一个很好的形式,除了直接从此函数推出输出。如果使用类完成,则可能需要使用Exceptions而不是直接推送错误输出。

早退,经常回归。

答案 1 :(得分:0)

你可以制作一系列限制,并为你做一个查看该集合的代码,而不是列出任意限制。

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

希望这有点帮助&gt;。&gt;

答案 2 :(得分:0)

我发现通常你所谈论的if链的类型可以变成函数的hashmap,有一些选择器作为它们的键。

如果你有一个类似$processImage = { "image/gif" => function processGIF(){blah} }的哈希映射,你可以访问O(1)中的每个函数而不是O(n / 2)平均值(假设正常的调用分布也是不准确的)。你知道,除非它发生了很多,否则你无所谓。

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

我确实发现hashmap方法具有相当的可扩展性和可读性,所以它具备了这一点。

有些人可以重构这些,当然......但在很多情况下,这样做的好处是极少/情境化。