|
Jun
22
|
有些程序员可能过于追求 if-else 对代码优化的效果, 却忽略了其带来的对代码清晰度的反作用. 假设这样一个功能, 根据用户的等级显示不同的页面. 如果用户的等级大于等于 5, 他能看到的东西和普通用户(等级小于5)不同, 代码如下:
echo "欢迎您, ";
if(level > 5){
echo "高级用户!";
}else{
echo "用户!"
}
// ... 大段代码
echo '<a href="#">个人信息</a>';
if(level > 5){
echo "审核文章!";
}else{
echo "发表文章!"
}
echo "...";
我们看到, 随着功能的继续, 不断地出现 if-else, 可能是十几个. 虽然在 if-else 之外的代码得到了重用, 也即冗余度降低了, 但是, 充斥各处的判断不是也极大地影响了代码的清晰度吗?
如果我 copy-paste 一份公用代码(不可过于极端地反对复制粘贴), 就可以只使用一个 if-else:
if(level > 5){
echo "欢迎您, 高级用户!";
// ... 大段代码
echo '<a href="#">个人信息</a>';
echo "审核文章!";
echo "...";
}else{
echo "欢迎您, 用户!";
// ... 大段代码
echo '<a href="#">个人信息</a>';
echo "发表文章!";
echo "...";
}
这样, 优化后全部的代码只有一个分支, 才是符合人思维的逻辑, 虽然代码量扩大了近一倍. 而且, “大段代码”可以封装成函数, 优化后的代码在行数和冗余度上不一定增加.
所以, 不要把冗余度作为代码优化的唯一条件, 更不要把 if-else 作为代码重用的唯一方法!
Related posts:
8 Responses to “if-else对优化代码冗余度的反作用”
Pages:
Leave a Reply

2010-06-22 at 11:15:34
“大段代码包成函数”是一个不错的方法,很多时候还可以通过变量来处理:
if (level > 5) {
$str1 = “欢迎您, 高级用户!”;
$str2 = ‘个人信息‘;
$str3 = “审核文章!”;
$str4 = “…”;
} else {
$str1 = “欢迎您, 用户!”;
$str2 = ‘个人信息‘;
$str3 = “发表文章!”;
$str4 = “…”;
}
echo $str1;
// … 大段代码
echo $str2, $str3, $str4;
2010-06-22 at 11:21:08
回复超群: 其实也可以用字符串拼接, 呵呵.
2010-06-22 at 11:34:28
后一种稍好,但其实代码看着还是别扭
比较学究的做法是用类似NullObject的方式,当然,有点学究,很多人不喜欢。。
2010-06-22 at 12:38:05
“NullObject方式”是一种什么方式?
2010-06-22 at 13:32:11
class 高级用户 extends ..
{
public function getName()
{
return ‘高级用户’;
}
}
class 用户 extends ..
{
public function getName()
{
return ‘用户’;
}
}
$str1 = “欢迎您, “ . $obj->getName() . ”!”;
2010-06-22 at 13:46:10
回复老王: 确实比较学究.
2010-06-23 at 11:06:18
5L这种方式就失去PHP的优势了吧,其实个人感觉PHP里的OO还是不要太多为好
2010-06-23 at 11:39:01
其实不仅仅是PHP, 是否要用class, 和业务分析也有很大的关系. 如果分析的结果不是很自然而然的对象, 不一定非得用class.