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

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 内核,各种设计模式,不同编程语言各自的特色等。

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

6644 次点击
所在节点    程序员
67 条回复
keithwhisper
2022-05-07 18:03:34 +08:00
应该是
```js
if (Array.isArray(list) {
// do sth.
}
```
keithwhisper
2022-05-07 18:05:09 +08:00
其实加上了 `list.length` 的判断反而不好读了, 对空数组做一次处理也没什么问题
keithwhisper
2022-05-07 18:10:48 +08:00
另外用 `length` 判断的话, 会有 array-like 的数据通过校验
simonlu9
2022-05-07 18:17:41 +08:00
我来说下 java 怎么处理这种,假如你代码确定这个类型是集合的话一般会用 CollectionUtils.isEmpty 方法,如果是字符串的话就用 StringUtils.isEmpty, 其他类型就是 Option.ofNullable(T) 来处理但是 js 是动态语言,没法判断,只能你根据行为来判断比较好,建议项目中封装这几个判断,减少太多的判空重复代码
chiling
2022-05-07 19:46:15 +08:00
1. 如果是长期维护的中大型项目,上 Typescript ,因为相对强类型,所以能解决掉一部分楼主所说的代码问题
2. 在实际业务团队协作中确实会遇到一些代码风格、书写方式的问题
举一些例子:
- 对象属性的 merge Object.assign(oldObj, newObj) 和 { ...oldObj, ...newObj }
- 数组的 merge:const newArr = oldArr.concat(arr) 和 const newArr = [...oldArr, ...arr];
- 属性判空操作 obj.fun && obj.fun() 和 obj?.fun()
- ....

我个人感觉合适的解决方式:1. 建立团队的代码规范 2. 给项目代码加上 eslint

3. 写法的好坏我感觉主要看适配业务场景谁更好一点,写法上谁更优雅易读一点,前端之前几年发展很快,一些可能的优雅写法可能又有了更优雅的写法,加上自己的认知在变化,觉得之前写的代码糟糕可能是正常的

4. 我的写法倾向于

if (list?.length > 0) {

}
lucays
2022-05-07 22:02:45 +08:00
单说 python 里,都是用第一种的,if obj: xx ,这个 obj 不管是 None(null)还是[]还是''还是{}还是什么乱七八糟的都过不了
songkeys
2022-05-08 01:41:22 +08:00
看到楼主的附言:

> 这个只是做为一个举例引用,没想到反而成为大家的焦点。
> 这是我事先没有预料到的,这个贴子的回复已经背离我的初衷,因为我本想通过举个例子来看下其它人在其它领域的遇到的情况,但没想到所有人都纠住这个例子不放。
>
> 如果是这样,此贴可以关闭了,后面如果再对这个例子进行讨论的话,就真的没意思了,真的意义不大。
> 有时间应该放在更重要的事情上,真的没必要再往这个例子再多做说明了。

实在槽点满满。你的举例犯了这种低级错误,当然会让人摸不着头脑,讨论开来。怎么反而责怪大家讨论这个的对错呢?另外,帖子已经发出来了,人们作出如何回复自然是无法百分百遵循发帖人的「意愿」的,说出「这个贴子的回复已经背离我的初衷」这种冲浪新手才会说的丧气话可谓是二度让人摸不着头脑。

我非常同意「有时间应该放在更重要的事情上」,但建议楼主下次发帖前仔细审审有无纰漏,不要疑惑了大家后,望着一片狼藉的讨论,等了二十多楼后再站出来一边纠正错误一边感慨这届网友水平不行实在带不动,然后拂袖离去,深藏功与名。这样才是真的浪费了大家的时间。

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

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

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

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

© 2021 V2EX