无聊问下代码风格的事

公司连我在内 6 个码农。。。
5 个都是习惯风格 1。。。
只有我一个是风格 2。。
你们用哪种风格?

公司连我在内 6 个码农。。。
5 个都是习惯风格 1。。。
只有我一个是风格 2。。
你们用哪种风格?
比如:
if (短小绣花针){
code
和
if (短小绣花针)
{
code
公司是按代码行数付工资吗
我是总体倾向风格 2 的
但如果 1. 内容不是特别多特别长的,并且 2. 不是列表而是元组,可以接受风格 1
我解释下 2.,就是说这些字段间有某种内在联系,而不是单纯的枚举或者并列。
比如构成一个字典用的键值(“`dctdata=dict(zip([…],lstdata))“` 中 […] 的部分可以在一行内没问题)
或者是(迫于格林斯潘第十定律)需要写伪 Lisp 时 “`html=[‘html’, [‘body’, [‘h1’, ‘Hello World!’]]]“`
或者描述某种顺序 “`[first, second, last]“`
不用 golang 的风格,我浑身难受
大神都是用 2 个空格???
1. 印象中单双引号这个大部分 formatter 不怎么管( black 除外),一般 format 的时候会直接略过不处理( as-is ),这个和你的风格并不冲突;
但你主题中的这个问题大部分 formatter 都可以统一解决,一个 column 限制就够了
2. 而且规范从来就不是用来约束某一个人,个人的代码风格和品味一直随着时间和能力改变,自己一个人写的项目从来不会有人关心是按着什么规范写的。
但既然你们都在同一份代码上工作,你是这么用引号以及长列表的,你的同事呢?你如何保证同事这么用?如果你保证不了,你同事的代码也许全是单 /双引号甚至相反的使用习惯,那你们阅读彼此的代码时也会难受啊?同事哪天改你的代码改成人家自己的“个人规范”了,你们打一架吗……规范就是用来提前避免这些的啊。(比较激进的 black 全给你 format 成双引号了)
详细地针对 1. 进行论述:
就算对 column 进行限制仍然导致 A. 风格有歧义,就像 #5 那样,仍然可能存在多个元素一行的情况 —— 不要说限制单行单元素,那样的话就是 B. 无法变通,比如使用一维表示二维数组,那样显然仍然按照二维方式书写更好;或者是分几类的,比如枚举 alphanumeric,一行数字一行小写字母一行大写字母,不然还需要做列表拼接或者 flat。
我没理解错的话,你说的重点是,你对代码风格的要求,细到了现有大部分工具都无法完美解决的地步,这是事实。然后你实解决的方式就只能是靠你自己去人工 Review 了,如果你们团队就是全靠你来 Review,而且你有话语权和精力一直做这个事,我当然没有任何意见。
我只是给你提供一个大部分团队(就我所知)都能接受的方案,即达成一份所有人能接受的规范,然后用一套自动化工具达到 90%的代码风格(可读性)需求,然后所有人忘掉这件事去做开发。
我们也遇到过自动化工具不能完美解决所有需求的问题,一些不重要又难开发的需求我们就放弃了,剩下的需求我用一些 ast 库补完了工具来满足。我们做 Review 时的 checklist 排除了所有 formatter,linter,sanitizer 能查出来的项,重点放在接口,安全,性能,架构(对于大一点的改动)。
PS. 之前说 column 是因为所有 formatter 都会支持,有些工具是能提供更细的选项的,比如制定函数传参是不是换行,dict 定义能不能换行,以及对于用户需要自定义格式的 region 提供关闭 formatter 的功能(比如手写矩阵的时候)
再举几个反驳 2 的例子。
1、拿着 20 年前的规范定义现在的显示器,1/5 宽度都用不到,剩下留着照镜子?
2、100 行完事的代码,非要拉出 500 ~ 600 行,按行数给钱?
3、一屏幕显示完的逻辑,非要滑几屏幕,太直观难以体现能力?
PS. 总感觉免不了出现图灵完备的换行与否要求,不过那都无关紧要了
对于将数组看作一个整体的,会更倾向于第一种。
对于将数组看作个体的集合的,会更倾向于第二种。
人们常说,一本书是先越读越厚,然后越读越薄的 —— 对于代码风格应该也一样,逐渐倾向第二种,然后再重新倾向第一种。
实际上,我最近对同一个事物建了三次模正好类似 1、2、1 的形态…… 但第一个 1 和最后一个 1 是不同的。
前者是粗略粗糙;后者是精炼简洁。
前者是对其组成的不理解,只得以整体考虑;后者是已经清楚明晰,不必单独考虑。
还有加不加分号,tab 还是空格缩进,4 个空格还是 2 个空格,争这个真是浪费生命,早点下班不好?
②
let userList = [
{ name: ‘name1’, phone: ‘222’, age: ‘333’ },
{ name: ‘name2’, phone: ‘222’, age: ‘333’ },
{ name: ‘name3’, phone: ‘222’, age: ‘333’ },
{ name: ‘name4’, phone: ‘222’, age: ‘333’ }
]