0

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

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

这是“坏习惯”吗?

4

3 回答 3

1

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

早返,常返。

于 2013-02-26T19:02:47.750 回答
0

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

虽然我忘记了在 javascript 中执行此操作的方法,但类似于 如何检查数组是否包含 JavaScript 中的对象?

希望这有点帮助>.>

于 2013-02-26T18:57:00.027 回答
0

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

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

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

不过,我确实发现 hashmap 方法也非常可扩展和可读,所以它可以做到这一点。

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

于 2013-02-26T19:01:17.740 回答