有点意思的话题: 程序员认知相关

2022-05-07 09:50:44 +08:00
 luffy

近日在 JS 项目开发中有个 array 条件判断,有人这么写:

if (list) {
 // do something
}

我的 code review comment 这么建议:

if (list.length > 0) {
  // do something
}

这时有另一个同事在上面留言说,按他的认知,应该是下面这么写,也就是上面第一种才对。

if (list) {
 // do something
}

这当然只是个非常非常小的问题,甚至都可以忽略不计。

但我联想到一个更有普适性的问题:当这么写代码能跑起来,另一种方式写代码也能跑。那凭什么要用另一种了?

认知 这个词可能很适合用来理解或者解释这类问题。比如这里的 认知: 变量比较 implicitexplicit 的问题。

还有一些其它的例子:

比如,自己在若干年前写代码,当时觉得自己很牛气很完美,而现在再去看,会觉得当时的代码好糟糕。

或者,当别人用 A 用法实现时,你提出用 B 用法更好,别人还得觉得自己的更好。

或者,相反的,当你觉得用 A 方式比较好时,另一个水平更高的说用 B 更好时,你还是坚持已见,觉得别人不懂你。

所有类似的问题,或许都能归结为:认知深度 的差异。这里的认知领域包括:项目工程化,模块化,团队协作,一致性,计算机编译器原理,数学,linux 内核,各种设计模式,不同编程语言各自的特色等。

这里是由一个现实案例联想到的认知问题。那么朋友们,你们有遇到过类似的场景嘛?有的话,不妨举例看看,让我们都来提高下认知吧。当然也包括,在面试或者招聘,会有人关心这类认知问题嘛?

6585 次点击
所在节点    程序员
67 条回复
luqingliang
2022-05-07 09:55:27 +08:00
空格还是 tab ?
murmur
2022-05-07 09:56:18 +08:00
你写的也不对啊,应该是 if list &&list.length
noe132
2022-05-07 09:58:06 +08:00
难道 if (list) 是正确的吗? Boolean([]) === true.
如果要判断非空当然得使用 list.length 。不过第二种写法可以改成 if (list.length),不需要判断大于 0
storyxc
2022-05-07 09:58:20 +08:00
if(conditions)后面的 { 要不要换行
murmur
2022-05-07 09:59:10 +08:00
@noe132 list 如果不为 null 的话,在上面做函数操作一般没啥问题,最多返回一堆空数组,渲染也是空的
luqingliang
2022-05-07 09:59:30 +08:00
这不是认知问题啊,你们这俩判断就不是一回事啊,而且就只执行到这一步判断的情况下,你的建议有报错风险
tyx1703
2022-05-07 10:02:52 +08:00
就你这个例子已经是两种语意了,改不改要看 if 里面做的事
Leviathann
2022-05-07 10:03:41 +08:00
list && list.length > 0 ?
fiypig
2022-05-07 10:03:41 +08:00
len(list)
thunderw
2022-05-07 10:09:17 +08:00
js 中这几个都是 false:
undefined
null
false
0
NaN
"" 或 ''(空字符串)
而 [ ] 却是 true 。
所以归根结底你们这两种写法根本就是在判断不同的内容。所以还是要看你们这里其实是想干嘛。
f0rger
2022-05-07 10:10:00 +08:00
if(list?.length)
irobbin
2022-05-07 10:10:15 +08:00
这难道不是两种业务场景吗

如果 list 表示用户当前关注的人,list.length = 0 表示没有关注人,list = null ,表示接口数据还没返回或者出错了
ALLROBOT
2022-05-07 10:10:46 +08:00
无非是搭建玩具用孩童级别的电子积木,建造大楼就用工程化的电子积木
fstar
2022-05-07 10:11:53 +08:00
风格问题和语义化问题
- Boolean(val) 和 !!val
- String(num) 和 '' + num
- cb && cb() 和 if (cb) { cb() }

风格有很多种,比如经典的空格和 tab 。

不过你这个例子,感觉已经不是写法风格不同的问题了,而是代码对不对的问题。
因为空数组也是被判断为 true 的,因为它是一个不为 null 的对象。
具体得看上下文才行,其中可能有一种错误的写法。
chengyiqun
2022-05-07 10:12:30 +08:00
if (list) 这种写法, 在 list 是空 list, 但是不是 NaN 的时候, 是 true
说不定他只要判断 NaN 就行了, 不需要判断集合是否为空.

如果你要判断集合不为空
最好像上面说的
if(list && list.length)
pengtdyd
2022-05-07 10:14:59 +08:00
让我想起了 rust 的哲学,既不相信程序员,也不相信机器,一切以规则为主。
oldshensheep
2022-05-07 10:18:36 +08:00
js 的问题,第二种要判空,要不会异常,
学 js 的时候,什么!!a ,!a 莫名其妙
Java 肯定不会那么多事了
list != null && list.isEmpty())
只有一种写法还容易理解
fuck js
yesterdaysun
2022-05-07 10:19:58 +08:00
空数组下这个 if (list)也不对吧, 我选择 if (list?.length)

顺便我也说一个应该算得上你说的这种认知问题的:

Java 中很多人说不要 object.equals("test")而要"test".equals(object), 但是我一直觉得后面的写法读起来顺序很怪很反人类, 所以我宁可用 Objects.equals(obj,"test")代替, 但是其他人选择"test".equals(object)
yiqunz
2022-05-07 10:21:48 +08:00
封装成工具类统一标准即可。CollectionUtils.isEmpty()
前端还有 undefined 判断 看着烦直接封装。
yiqunz
2022-05-07 10:24:20 +08:00
@yesterdaysun 这是为了避免不必要的 NPE 。不是什么教条,确实是经验所谈。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/851284

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX