一个工作了 6 年的同事写的代码,不看 git 记录我还以为是实习生写的

2020-09-27 09:58:01 +08:00
 garlics

第一次见到那么离谱的代码,完全没有封装的意思。

        if ($config['theme'] == 1) {
            if ($config['plugin']['PG_SHOPPING_CART']) {
                $tabIndex = [
                    'index' => 0,
                    'collection' => 1,
                    'bestforyou' => 2,
                    'cart' => 3,
                    'mine' => 4
                ];
                $tablist = [
                    [
                        'pagePath' => '/pages/index/index',
                        'text' => '首页',
                        'iconPath' => '/assets/images/home_unactived.png',
                        'selectedIconPath' => '/assets/images/theme1_home_actived.png',
                    ],
                    [
                        "pagePath" => "/pages/collection/collection",
                        "iconPath" => "/assets/images/collection.png",
                        "selectedIconPath" => "/assets/images/collection_actived.png",
                        "text" => "收藏"
                    ],
                    [
                        "pagePath" => "/pages/bestforyou/bestforyou",
                        "iconPath" => "/assets/images/bestforyou_unactived.png",
                        "selectedIconPath" => "/assets/images/bestforyou_actived.png",
                        "text" => "为你优选"
                    ],
                    [
                        'pagePath' => '/pages/cart/cart',
                        'text' => '购物车',
                        'iconPath' => '/assets/images/cart_unactived.png',
                        'selectedIconPath' => '/assets/images/cart_actived.png',
                    ],
                    [
                        'pagePath' => '/pages/mine/mine',
                        'text' => '我的',
                        'iconPath' => '/assets/images/mine_unactived.png',
                        'selectedIconPath' => '/assets/images/mine_actived.png',
                    ]
                ];
            } else {
                $tabIndex = [
                    'index' => 0,
                    'collection' => 1,
                    'bestforyou' => 2,
                    'mine' => 3
                ];
                $tablist = [
                    [
                        'pagePath' => '/pages/index/index',
                        'text' => '首页',
                        'iconPath' => '/assets/images/home_unactived.png',
                        'selectedIconPath' => '/assets/images/theme1_home_actived.png',
                    ],
                    [
                        "pagePath" => "/pages/collection/collection",
                        "iconPath" => "/assets/images/collection.png",
                        "selectedIconPath" => "/assets/images/collection_actived.png",
                        "text" => "收藏"
                    ],
                    [
                        "pagePath" => "/pages/bestforyou/bestforyou",
                        "iconPath" => "/assets/images/bestforyou_unactived.png",
                        "selectedIconPath" => "/assets/images/bestforyou_actived.png",
                        "text" => "为你优选"
                    ],
                    [
                        'pagePath' => '/pages/mine/mine',
                        'text' => '我的',
                        'iconPath' => '/assets/images/mine_unactived.png',
                        'selectedIconPath' => '/assets/images/mine_actived.png',
                    ]
                ];
            }
        } else {
            if ($config['plugin']['PG_SHOPPING_CART']) {
                $tabIndex = [
                    'index' => 0,
                    'cart' => 1,
                    'mine' => 2
                ];
                $tablist = [
                    [
                        'pagePath' => '/pages/index/index',
                        'text' => '首页',
                        'iconPath' => '/assets/images/home_unactived.png',
                        'selectedIconPath' => '/assets/images/home_actived.png',
                    ],
                    [
                        'pagePath' => '/pages/cart/cart',
                        'text' => '购物车',
                        'iconPath' => '/assets/images/cart_unactived.png',
                        'selectedIconPath' => '/assets/images/cart_actived.png',
                    ],
                    [
                        'pagePath' => '/pages/mine/mine',
                        'text' => '我的',
                        'iconPath' => '/assets/images/mine_unactived.png',
                        'selectedIconPath' => '/assets/images/mine_actived.png',
                    ]
                ];
            } else {
                $tabIndex = [
                    'index' => 0,
                    'mine' => 1
                ];
                $tablist = [
                    [
                        'pagePath' => '/pages/index/index',
                        'text' => '首页',
                        'iconPath' => '/assets/images/home_unactived.png',
                        'selectedIconPath' => '/assets/images/home_actived.png',
                    ],
                    [
                        'pagePath' => '/pages/mine/mine',
                        'text' => '我的',
                        'iconPath' => '/assets/images/mine_unactived.png',
                        'selectedIconPath' => '/assets/images/mine_actived.png',
                    ]
                ];
            }
        }
29888 次点击
所在节点    程序员
298 条回复
Mindjet
2020-09-27 17:46:58 +08:00
@jackrelative #220
看到你说的那种情况,我猜测有部分人会将读不懂他人的代码,归结到「他人写的烂」上头,实际上阅读他人的代码本来就是个很难的事情。当然,如果遗留代码有文档有测试,风格良好可能会有助于阅读,但不能忽略处理遗留代码本身的难度就很大。
tiedan
2020-09-27 17:50:17 +08:00
这代码离谱,review 绝对不给他过
Mindjet
2020-09-27 17:54:54 +08:00
@a719031256 #218
举出反例总是轻而易举,在软件开发这个行当,积累了些经验并写在了书里,除了那些算法什么的,或者其他的用数学证明的,大多数的经验都没有用科学手段去验证,这是个很大的问题。我只零零星星的听别人提到过引用实证研究的事情,但从来没在这些出名的书中见到过。

《‪软件困局:为什么聪明的程序员会写出糟糕的代码》,好像说的就是这个事情,当然我没有把这本书看完,只是看完前言(序章)后有这种感觉。

> 软件工程其实并没有多少“工程”的成分,这已经是公开的秘密了。
> ...
> 自计算机诞生以来,特别是 20 世纪 60 年代大批软件问世之后,围绕软件的种种问题一直伴随且困扰着从事软件生产和研究的人们。... 在大学里,学生并没有学到在团队中如何编写便于后续维护的软件,他们在大学里完成的软件作业仅达到了课程项目的要求,却与业内软件开发的实际规模和真实复杂度完全脱节 ;另一方面,在工业界,靠自学成长起来的一代聪明的程序员习惯于凭自己的直觉和经验来解决问题,他们相信软件必然会包含 bug,但这些包含了 bug 的软件照样可以带来巨大财富,这些根深蒂固的观念导致工业界缺乏改进软件工程的动力。
> ...
> 但是,编写软件却不是这样的。虽然软件被称为工程学科,但它几乎没有工程的特征,即随着时间的推移,在严格的实验基础上建立起一个知识体系。人们自然会问关于工程产品的那些问题:它有多坚固?可以使用多久?什么情况下可能失败?对于软件来说,无论是针对程序的一个部分还是整个软件,这些问题都无法得到可靠的答案。专业许可是大多数工程学科的标志,但这却被软件行业视为潜在的诉讼来源,而不是制定标准的机会。
> ...
> 早在 1990 年 11 月,卡内基–梅隆大学的玛丽·肖( Mary Shaw )为《 IEEE 软件》杂志撰写了一篇题为《软件工程学科的前景》的文章,她解释说:“工程依赖于有关技术问题领域的、以实践者可以直接使用的方式编纂的科学知识,从而为实践中常见的问题提供答案。普通的工程师可以用这些知识来更快地解决问题。这样一来,工程部门就可以共享先前的解决方案,而不是总依赖于某个行家的问题解决方案。”
> ...
> 她将软件工程与土木工程进行了比较,并指出,“尽管大型土木结构在有历史记载之前就已经建成,但在过去的几个世纪里,它们的设计和建造都是基于理论知识,而不是凭直觉和积累的经验 。”1 我翻阅了美国土木工程师协会的出版物目录,其中尽是有趣的标题,如《水管情况评估》和《寒冷地区路面工程》,我很欣赏在其他工程学科中有这么多的理论知识。

我感觉之所以会出现这种现象,就是因为软件「工程」太想成为「工程」了,这个领域的很多经验都直接和人相关,而不是跟什么物理化学研究的对象相关,那么研究的方法就应该参考社会科学,而不是工程学甚至是数学。
jinhan13789991
2020-09-27 18:03:24 +08:00
你有没有想过,一开始没有这么多判断,只有一种场景。
后来需求变化,但是也不过两种情况,所以添加一个 if else 就解决了。
后面随着版本需求迭代,场景越来越多,项目赶进度,各种需求都是力求尽快的完成。 这个时候最快的解决方法就是增加一个 if else,把上面的内容拷贝复制然后改一下。1-2 分钟就搞定了。
而如果重构,可能就是半小时起步了,该完后还要测试,对以前的各种场景进行测试等等。如果某处不小心改出了 bug,那就是很麻烦的事情。

最最最重要的是,在很多公司,重构优化项目不加 kpi 的。改的好没人理会,改出问题就都是你的锅了。
soulmt
2020-09-27 18:22:50 +08:00
@jackrelative 你错了,我不是新手,但是我工作也 4 年了,我从来不喜欢推翻重来,反而我用范围重构的方式优化了不少大的项目,我来说说为什么我觉得这个代码垃圾,你也说了,一个特殊需求的 for 循环的耐心都没有,为什么会没有耐心?因为懒, 随便拉出来一个没有核心逻辑的代码,屁屎尿流的全部堆砌上去,谁愿意看,这就跟有主题思想的作文跟记流水账的作文一样,叙的一件事,有些就是字里行间透露着浅显易懂的东西, 为什么有组件库,sdk, 丰富的包在流通吗?因为大家都懒,懒的看到底是什么逻辑直接用就好了,当然你会告诉我,那些都不是业务代码,通用性的东西当然可以封装, 但是谁说业务代码就不能封装呢?封装把握好度就好来,况且没有业务何谈通用?哪个不是业务提炼出来的???当然我也不提倡步步为营,每一步都要考虑,这就是过度思考了,但是小技巧有大作用的东西,往往让代码简单有效。我觉得很多人为了杠而杠,优秀的代码往往是 1 行顶好几行,但是谁规定优秀的代码就是难懂的?过滤写 for 循环好还是用 Array.filter 好? Array.filter 是不是对 for 循环的封装?难道大家好的方法都不要用,全部 for 循环怼上去才是简单易懂的代码??当然这完全靠个人能力,没有这种意识和能力的去胡乱封装,也是会造成大麻烦,如果你们认为封装带来的是难懂,复杂的代码,说明你们根本没想过怎么更好的封装,或者没有那能力。
tabris17
2020-09-27 18:23:17 +08:00
@NjcyNzMzNDQ3 为什么不封装就是「黑」?请先说明这个逻辑吧
alan0liang
2020-09-27 18:27:40 +08:00
我们学校某个答题小程序源代码:
https://i.loli.net/2020/09/27/V9q1ADKUBmXExzN.jpg
wx:if="{{item.optionnumber==2}}"
wx:if="{{item.optionnumber==3}}"
一直到
wx:if="{{item.optionnumber==12}}"

看多了就习惯了……
soulmt
2020-09-27 18:27:43 +08:00
@jinhan13789991 但是你有没有想过,在下手之前就动动脑袋思考维护性避免这种写法,是不是就不会有这么长无用的代码??你们都说复制粘贴才是尽快完成 ? 当这里面慢慢变成 10 个 20 个的时候 还有尽快这么一说吗?
a719031256
2020-09-27 18:33:38 +08:00
@Mindjet 书这东西就是把简单的东西写得超级复杂,我看游戏引擎架构,FreeBSD 实现,还有 c++经典几套书籍后感觉真的是这个道理,太痛苦了,看完了还得自己去梳理总结,还不如翻翻博客看看别人的开发经验之谈来得实在,有时候觉得写书的人有点脱离实际情况了
mrkelly
2020-09-27 18:38:57 +08:00
@soulmt 有个时间和成本动态平衡。。我当年就重构过很多不好的代码哎.... 当时确实是内心在咒骂.... 多了就。。习惯了
godblessumilk
2020-09-27 18:44:11 +08:00
茴香豆要搞个多少种写法??
haohappy
2020-09-27 18:44:59 +08:00
这么喜欢喷人 一会 6 年 一会实习生 一会不能忍 显得自己很生气的样子 不知道楼主什么学历? 看到很多喷同事的。。有点好奇
说实话我的看法:他写得很烂 但你的并不如他 还需优化

不知道是哪个大 V 带头喷了下 if else 个人看法:你没那水平抽象封装,还是老老实实地 if else 吧,至少不给别人挖坑
UnderTakerMS
2020-09-27 18:47:22 +08:00
手机党看得眼睛都快瞎了
soulmt
2020-09-27 18:54:27 +08:00
@mrkelly 这倒是,不过我们公司还好,我会申请代码优化的时间
xiangbohua
2020-09-27 18:57:08 +08:00
我觉得封装的前提是可以复用以及提高复杂逻辑的可读性。否则就无所谓了
tydl
2020-09-27 19:30:22 +08:00
@OnlyShimmer 不出意外的话,这是 VUE 前端
oldhorse
2020-09-27 19:31:38 +08:00
清晰易懂。虽然好像确实不太优雅
dobelee
2020-09-27 19:39:07 +08:00
@tabris17 #5 你可真是个人才。
charlie21
2020-09-27 19:39:34 +08:00
如果以 “小学生看得懂的代码就是没问题的代码” “能跑就行的代码就是没问题的代码” 为标准,
那么 “编码规范” 这个东西也就不用存在了

https://github.com/google/styleguide
https://github.com/airbnb/javascript

公司项目里连 “变量应如何命名” 都是有规范的,不按规范写 第二天别来了

当自己写作业呢?瞎划啦两笔交工就完事了
小至 coding convention,style guide,编码规范阿,大至最佳实践,特定问题的通行解法,当摆设?不懂可以学阿。

不想学阿,“能跑就行” 阿,滚蛋吧
哪里要你你就去哪 ...
cokyhe
2020-09-27 19:48:49 +08:00
有的时候老板不给时间,也只能这么堆砌代码了,反正又不会一直在这个公司干下去

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

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

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

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

© 2021 V2EX