This topic created in 3908 days ago, the information mentioned may be changed or developed.
以下代码出自medoo,(php 一个数据库操作类)。总体写得不错,在看源码的时候其中有些写法让我蛋疼。。
foreach ($relation as $key => $value ){
$joins[] = (
strpos ($key, '.') > 0 ?
'"' . str_replace ('.', '"."', $key ) . '"' :
$table . '."' . $key . '"'
) .
' = ' .
'"' . (isset ($match[5]) ? $match[5] : $match[3]) . '"."' . $value . '"';
}
能一次过看懂以上代码的码农请举手。。
Supplement 1 · Sep 10, 2015
好吧,大家的回复我都看了。可能我举的这个例子不太好,只是随手看到一个就 copy 过来了。我再举个详细一点的例子:
1.比较简单的如下的:
$values[] = isset ($column_match[0]) ?
$this->quote (json_encode ($value )) :
$this->quote (serialize ($value ));
2.最多我能接受这样的:
$wheres[] = 0 !== count (array_diff_key ($value, array_keys (array_keys ($value )))) ?
'(' . $this->data_implode ($value, ' ' . $relation_match[1]) . ')' :
'(' . $this->inner_conjunct ($value, ' ' . $relation_match[1], $conjunctor ) . ')';
3. 而我要吐槽的例子是这样的:
// 一行代码过长的 e.g:
$where_clause .= ($where_clause != '' ? ' AND ' : ' WHERE ') . ' MATCH ("' . str_replace ('.', '"."', implode ($MATCH['columns'], '", "')) . '") AGAINST (' . $this->quote ($MATCH['keyword']) . ')';
//e.g: 三元运算符互相嵌套,且内部太多逻辑运算的,下面这个其实格式还算不错的,换行换得比较好:
$joins[] = (
strpos ($key, '.') > 0 ?
// For ['tableB.column' => 'column']
'"' . str_replace ('.', '"."', $key ) . '"' :
// For ['column1' => 'column2']
$table . '."' . $key . '"'
) .
' = ' .
'"' . (isset ($match[5]) ? $match[5] : $match[3]) . '"."' . $value . '"';
如上, medoo 的代码的可读性其实不算差。更厉害的我也见过。。只不过我刚好想起这个问题。。顺手拿了它做反面例子。。 sorry :doge:
33 replies • 2015-09-10 23:36:52 +08:00
 |
|
1
sandideas Sep 10, 2015 via iPhone 3
让我想起来一个梗。 a==b?a:b
|
 |
|
2
leavic Sep 10, 2015 1
全世界最好的语言可读性真 tm 高
|
 |
|
3
laoyur Sep 10, 2015 1
其实还好了,人家还很贴心地把 ? 和 : 单独作为一行
|
 |
|
5
slowgen Sep 10, 2015 1
三目运算符,凡是超过一行的,或者一行长达 70 个字符左右的,看到一个就重写一个
php 的替代语法也是蛋疼,简直是坑队友神器: phpstrom 无法高亮逻辑边界 netbeans 对于逻辑开始的边界只高亮个冒号,对于代码过长时上下翻动不方便,sublime text 的 BracketHighlighter 插件还好
但是共同的缺点都是无法直接一个快捷键匹配括号来快捷跳转,都得用肉眼去区分逻辑块 凡是用了替代语法的,见一个改一个
|
 |
|
6
chmlai Sep 10, 2015
又没有嵌套, 这有什么问题.
|
 |
|
7
catfan Sep 10, 2015
人家明明在源代码换行处还写了注释的...怎么把它给删除了?
|
 |
|
8
ffffwh Sep 10, 2015
if (xx ){yy}else{zz} <-- 这个叫 if 语句 xx?yy:zz <-- 请称呼为 if 表达式 /条件表达式
不再多说
|
 |
|
9
jhdxr Sep 10, 2015
我也没觉得有什么问题,相比之下如果拆成两个 if 我觉得会更蛋疼些
|
 |
|
10
cin Sep 10, 2015
为什么不格式化下代码, 你这样发的帖看一眼就想 x 掉.
|
 |
|
11
lianyue Sep 10, 2015
还好 来看看我写的。。我找找。。 // 不需要该表的 if ($tables && !($table->alias ? in_array ($table->alias, $aliasUse, true ) : ($table->expression || in_array ($table->value, $aliasUse, true ))) && (is_array ($table->column ) && !array_intersect ($table->column, $columnUse ))) { continue; }
|
 |
|
12
lianyue Sep 10, 2015
在 if 里面里面用 。。。
|
 |
|
13
mogita Sep 10, 2015
medoo 猫不服请大家不要忽略啊 xD
|
 |
|
14
ChiangDi Sep 10, 2015
我讨厌这个三元运算符,除了最简单的情况基本上不用。
|
 |
|
15
raincious Sep 10, 2015
我能看懂……
第一行:判断是否有. <=点 第二行:如果有,就将字符串组合成"something"."blabla"(话说不应该是`么喂 4 ?) 第三行:否则,就拼成 table."col"( table 是自己拿参数补的,自己之前已经包好了")
果然是 PHP 写太多了。
|
 |
|
16
realpg Sep 10, 2015
是不是你把缩进干掉了…… 源代码除了换行还是有缩进的吧…… 有缩进的话看起来不难看啊
|
 |
|
17
Xrong Sep 10, 2015
我觉得这个还好吧,又不是嵌了 5 、 6 层
|
 |
|
18
jin5354 Sep 10, 2015
我觉得用三元运算符节省代码行数完全没有必要 除了极简单的操作我会用,其他都用 if
|
 |
|
19
mcfog Sep 10, 2015
这里主要坑在长字符串拼接吧
|
 |
|
20
msg7086 Sep 10, 2015 1
首先这里的问题根本不是三元运算符而是字符串拼接。
$keyformat = ... ? ... : ...; $key = sprintf ($keyformat, str_replace (......, $key )); $valformat = ... ? ... : ...; $val = sprintf ($valformat, $value ); $joins[] = sprintf ("%s=%s", $key, $val );
同样是 2 个三元运算符,这样写你看着有困难么?
|
 |
|
22
fuxkcsdn Sep 10, 2015
20 楼+1 主要是字符串拼接在没代码配色的情况下,看起来很乱
|
 |
|
23
cxbig Sep 10, 2015
这里三元运算很短啊,只是这个写法不够美观,可以先运算赋值给变量,再拼 string
|
 |
|
25
zj299792458 Sep 10, 2015 via iPhone
无论什么情况都等于 a 哈哈哈哈哈
|
 |
|
27
zjqzxc Sep 10, 2015 1
@ sandideas a==b?a:b 我想起了另一个更: 如果和媳妇意见一致,就听我的;如果意见不一致,就听她的。
|
 |
|
28
aa45942 Sep 10, 2015
三元符很蛋疼+1 ,特别是三元套三元,简直了 对效率提升没任何效果,对代码可读性影响效果拔群
|
 |
|
32
xpol Sep 10, 2015 via iPad
单独一个变量存储一下又不会怀孕。
|
 |
|
33
lincanbin Sep 10, 2015
你想要证明这样算滥用,你必须拿出比这个可读性更好的解决方案,不是么?
你想要证明这样算滥用,你必须拿出比这个可读性更好的解决方案,不是么?
你想要证明这样算滥用,你必须拿出比这个可读性更好的解决方案,不是么?
|