我应该避免在代码中列出一长串序列化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.)";
}
等。等等。直到最终文件通过所有测试并进行处理。
这是“不良做法”吗?
答案 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方法具有相当的可扩展性和可读性,所以它具备了这一点。
有些人可以重构这些,当然......但在很多情况下,这样做的好处是极少/情境化。