作者CloudyWing (孤单ㄉ翼)
看板Soft_Job
标题Re: [讨论] 写三元判断式code review被打枪
时间Wed Dec 28 00:16:05 2022
这边不针对效能,也不针对说阶层太多,应该用什麽方式重构之类的
只是看到有人提到巢状的三元运算子,阅读性太差,应该改回用if else写
我只是好奇两者的可读性有差很多吗?
以下只是举例,不是指实务上会真的这样写
(1) 三元运算子:
int i = condition1
? condition2
? condition3
? 1
: 2
: 3
: 4;
(2) if else:
int i;
if (condition1) {
if (condition2) {
if (condition3) {
i = 1;
} else {
i = 2;
}
} else {
i = 3;
}
} else {
i = 4;
}
单就上面的范例来说,我觉得两者可读性差不多,还是只是因为我看习惯产生的错觉 XD
以我自己的观点来看,像这种条件式指派单一变数值的情境,三元写起来比较顺手
也不用担心像在写 if else 时,因漏写了 else 导致有情况没指派到值
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 203.204.160.44 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1672157770.A.D00.html
2F:嘘 MoonCode: 12/28 01:20
3F:嘘 ben810514: 有 12/28 01:34
4F:嘘 hegemon: 阅读性差很多好吗..... 12/28 01:45
5F:嘘 unixxxx: 原Po认真? 明显一阅读性比较好 12/28 01:57
老实说我也是觉得明显一比较好啊
只是看前面文章和推文,想说讲差不多来测一下风向 XD
6F:推 Ericz7000: :( 12/28 03:35
7F:→ xxi511: 这种情况两个都不适用,重写好吗 12/28 07:50
8F:→ cokellen: 觉得差很多 12/28 08:10
9F:→ knives: 写成波动拳最棒 12/28 08:31
10F:→ testPtt: 通常会拆开多层 常遇到的问题是每层里的程式码一长串 12/28 08:42
11F:→ testPtt: 如果里面都是这种简单内容其实都OK 12/28 08:44
12F:推 LeoSW: 这种case 我会写成function,把巢状结构摊平,增加可读性以 12/28 08:50
13F:→ LeoSW: 及维护性 12/28 08:50
实务上来说我也是会用 Array Map,或是拆成 Function 来摊平巢状结构
大部分的情况下写到两层就是极限
而且真写成巢状,以这案例会在 Condition 加 Not 来对调顺序
所以从推文来看,问题点不在巢状三元,而是只要是写成多重巢状都不好阅读
有些情境在相同结构下,反而有人会觉得改写 if else 却降低可读性
14F:→ sniper2824: 差很多== 12/28 09:20
15F:→ Lipraxde: Condition 加个 not 就可以摊成平的了... 12/28 10:03
就看到前面说巢状三元可读性劣於if else
所以故意写一个很丑的结构来看一下相同结构下,是否真的三元比较难阅读 XD
16F:推 YukiTW: 你这例子看起来(一)比较好懂 12/28 11:07
17F:→ YukiTW: 但实际上每个判断式里的function变多的话,就是(二)比较好 12/28 11:08
18F:嘘 qwer338859: 都很丑 拆掉好吗= = 12/28 11:14
19F:推 zxcasdjason1: 你看看你在说些什麽 XD 12/28 11:20
20F:嘘 GLaDOS1105: 都超丑 12/28 11:33
21F:嘘 timsheu: 写成巢状是wtf… 12/28 12:02
22F:嘘 Alex548291: 丑到流汤 而且这串为啥要一直讨论啊 啊就看自己公司规 12/28 12:30
23F:→ Alex548291: 定啊 干嘛一直洗 12/28 12:30
※ 编辑: CloudyWing (61.216.190.109 台湾), 12/28/2022 13:21:11
24F:→ leolarrel: 你的错觉 12/28 13:21
※ 编辑: CloudyWing (61.216.190.109 台湾), 12/28/2022 13:41:25
25F:→ abraxas: 举一个正常人都会摊平的例子真的有效吗? 12/28 13:36
我认真说,如果是专案公司,你可能高估了正常人的水平了
多的是能动就好(叹气
以我的经验,我之前同事如果修改要在 if 内部加判断就直接加了
多半不会条件反转
另外 else if 本身就是巢状的,有些程式语言本身没有提供 else if 语法
它们的 else if 是以下程式码排版後产生看起来摊平的效果
if (condition1) {
} else {
if (condition2) {
}
}
而且两种写法都反转後,if else 也真未必有比较好阅读
例如:
三元运算子:
int i = condition1
? 1
: condition2
? 2
: condition3
? 3
: 4;
if else:
int i;
if (condition1) {
i = 1;
} else if (condition2) {
i = 2;
} else if (condition3) {
i = 3
} else {
i = 4;
}
26F:→ unixxxx: 用function的话 会影响效能 12/28 13:42
※ 编辑: CloudyWing (61.216.190.109 台湾), 12/28/2022 14:20:13
27F:推 WaterLengend: 我曾经看过写成这样的可以当主管,听说一年一百多, 12/28 14:23
28F:→ WaterLengend: 颗颗 12/28 14:23
29F:推 hidog: function造成的效能影响通常不大 12/28 14:40
30F:→ leolarrel: 在某padle效果器,if-else + function 的效能就差很大了 12/28 14:54
31F:→ leolarrel: 干死老板硬要用效能很差的MCU 12/28 14:55
32F:→ leolarrel: *pedal效果器 12/28 14:57
33F:嘘 CoNsTaR: if else 有比较好阅读 12/28 15:14
34F:推 gofigure: chatGPT:他们在吵什麽 12/28 15:57
35F:推 bear1414: 三元在硬体语言如VERILOG在逻辑电路写法上比较方便 12/28 16:20
36F:→ testPtt: 毕竟硬体用goto很正常 到软体就可能被骂 12/28 16:28
37F:→ unixxxx: goto js 很常见 12/28 16:35
38F:→ viper9709: 拜托别用第一种写... 12/28 18:03
39F:嘘 NCKUFatPork: 两个写法都很烂,请用guard clauses 12/28 18:50
刚 Google 一下,Guard Clauses 我也很爱用
只是我之前不知道它叫 Guard Clauses
40F:嘘 MoonCode: 什麽语言没有 elseif 且没有替代品 12/28 20:22
这边来说明一下 else if 是怎麽来的
1.
完整程式长这样:
if (condition1) {
} else {
if (condition2) {
} else {
}
}
2.
我们已知 else 後面只有单行可以不用加大括弧,而 if else 语句将之视为一个单行
所以我们将第一个 else 的大括弧去掉变成以下这样
if (condition1) {
} else
if (condition2) {
} else {
}
}
3. 最後再用排版将第二个 if 放置在第一个 else 後面,else if 就诞生了
if (condition1) {
} else if (condition2) {
} else {
}
所以我前面说 else if 本质上还是巢状结构,只是靠排版摊平
不过有些程式语言像 PHP 是真的有提供 elseif 这个关键词
41F:推 kyoe: guard clauses+1 12/28 21:22
42F:→ DendiQ: 写那样 SonarQube 会叫 12/28 22:00
43F:推 pot1234: if else一定要弄三层?写法一也很讨厌 12/28 22:12
本文一开始就加一堆但书,并注名只是举例,非实务上的写法 XD
实际上当然是 Array Map、Function 和 Guard Clauses 等方法来优化写法 XD
推文提到的比较好的写法,才是我实务上真正在写的
大部分情况我最多只会写到两层,且不会用成波动拳结构
我只是因为前面文章有推文提到巢状三元运算子容易漏看,且不好阅读
而改回写成 if else
关於容易漏看这部分我是疑惑为什麽会容易漏看
至於可读性部分,两种方法当然都很糟
但看起来也不是每个人都认为巢状 if else 可读性优於巢状三元运算子
实际上真正影响阅读的多层巢状这件事,真的多层巢状起来
if else 和 三元运算子都不好阅读
※ 编辑: CloudyWing (203.204.160.44 台湾), 12/28/2022 23:35:33
44F:→ viper9709: 巢状的三元会是一场灾难...脑袋要转两次@@ 12/28 23:40
45F:嘘 BlueBird5566: 就是习不习惯的问题啊= = 12/29 00:07
46F:→ BlueBird5566: 1、2的可读性其实根本一样 就是习惯问题 12/29 00:07
47F:→ BlueBird5566: 说巢状难读的是指全写在一行 没像你这样排版的 12/29 00:08
48F:→ BlueBird5566: 有的还是JAVA + HTML + JSTL 组出来 12/29 00:10
49F:→ pot1234: 觉得写法1比较困难阅读的原因是没括号又少见,要稍微想 12/29 01:24
50F:→ pot1234: 一下。if else虽然缩三层很烦但不太可能看错。会写出这 12/29 01:24
51F:→ pot1234: 种code的话排版大概也不会都排的跟你一样,要多花一下时 12/29 01:24
52F:→ pot1234: 间找冒号,个人感觉啦。 12/29 01:24
53F:推 Sunal: 实务上都还是会用formatter吧,review时不会看到这种特殊 12/29 04:03
54F:→ Sunal: 排版 12/29 04:03
55F:嘘 MoonCode: 高手 12/29 04:07
56F:→ ezaki: 自己举的例看不出差别,有点可怕 12/29 08:38
57F:→ lycantrope: 高手境界 12/29 12:40
58F:推 GoalBased: 你的例子,我觉得可读性差不多,但我会写2 12/29 13:45
59F:→ GoalBased: 如果说以後这段都不改,就没差,会被改2我觉得好一点 12/29 13:46
60F:→ GoalBased: 中断点也好下一点 12/29 13:46
61F:→ GoalBased: 可读性本来就要根据现实情况做判断 12/29 13:47
62F:→ GoalBased: 跟你说怎样一定好的,多数是见树不见林 12/29 13:48
63F:→ ku72: 老实说 只要没事先规范两个做法我都会接受 如果都只看自己爱 12/29 21:02
64F:→ ku72: 看的code style那接手到烂code或者工作需要得去看别人的code 12/29 21:02
65F:→ ku72: 能保证都是自己要的写法? 12/29 21:02
66F:→ hongsiangfu: 第一种写法用反逻辑别缩排 12/30 07:08
67F:→ hongsiangfu: cd1?1:(换行)cd2?2:(换行)...(cdn)cdn:n:m 12/30 07:11
68F:→ hongsiangfu: 曾在verilog语法看过类似排版 12/30 07:12
69F:→ hongsiangfu: 更正cdn?n:m 12/30 07:12
70F:→ ku399999: 巢状三元分没有明确分界线 需靠排版维持 即使不讨论是否 12/30 09:18
71F:→ ku399999: 好读 巢状三元更难改也是不争的事实 12/30 09:18
72F:推 kyoe: php 现在都用 ?: 跟 ?? 香~ 12/30 12:04
73F:→ acgotaku: 第一种看到会想吐吧,写多层判断就很恶心了,再写成这样 12/30 16:38