8 层嵌套, 400 多行代码的函数。。。

2020-06-09 21:13:10 +08:00
 asanelder

遇到一个老的项目,有一个函数是 8 层嵌套,if 套 while 再套 if 再套 while 再套 if ....,而且每个条件判断中,各种&& 套 || 再套 &&,这个 8 层嵌套俺数了一下,一共 400 多行代码。。。

让俺感觉到奇怪的是,之事从事这个项目的老员工对这个函数竟然没有丝毫的意见,他们似乎很平静。

那么问题来了,俺之前受的教育是,函数应该尽量短小,嵌套应该尽量浅。所以遇到这个函数俺自然感觉浑身不适,但那些老员工似乎都很平静。是俺太笨了,理解不了这种 8 层嵌套,还是俺太矫情,太理想主义了,太教条了,还是老员工已经习惯了?

求解惑

10124 次点击
所在节点    程序员
96 条回复
lmmortal
2020-06-09 21:14:50 +08:00
老员工见怪不怪了,这种东西谁都懒得动。动好了没好处,动坏了就捅破天了所以都不愿意动
singerll
2020-06-09 21:15:56 +08:00
你改了呗,以后系统有问题甭管是啥原因,第一个怀疑的就是你改的代码的问题,让你好好查个遍再查其他
luckyrayyy
2020-06-09 21:18:44 +08:00
首先你得看好不好改啊,是不是确实极其复杂,不好下手?
或者说里面其实有大量裁剪,不一定复杂多真的这么高,这么写只是为了好理解?
另外从事这个项目的老员工都接手过这一块的逻辑吗?说不定人家负责别的模块见都没见过这里的代码?
最后都没问题的话,你改呗...即优化了代码,又满足了自己强迫症,多好啊。
asanelder
2020-06-09 21:21:39 +08:00
@lmmortal
@singerll

关键是有个功能要在这基础上改,俺修改的时候瑟瑟发抖,生怕改坏了(注意,这个函数没有相关测试)

这感觉就像是拿着一个很脆弱的易碎品,生怕摔了。
又像是你去蹲坑,发现停水很久了,坑里已经被 S 塞满了,而你不得不忍着恶心蹲下
asanelder
2020-06-09 21:23:11 +08:00
@luckyrayyy #3 看了一下 git 记录,有 6 个人修改过,其中 4 个已经离职,还有 2 个健在。。。
prenwang
2020-06-09 21:24:19 +08:00
没事的, 反正蹲下拉出来的也是 s
asanelder
2020-06-09 21:25:04 +08:00
@prenwang #6 这话俺看听
dswyzx
2020-06-09 21:28:54 +08:00
敢承担后果就敢上手搞 bug
无非就是修 bug 嘛
786375312123
2020-06-09 22:11:29 +08:00
如果是 legacy code 就不要动,如果需要维护的话其实问一问改过的同事,也没什么大不了的。你们又不是微软,能遇到 80 年代写的代码。
silvernoo
2020-06-09 22:20:46 +08:00
flutter 表示 8 层嵌套根本不叫事
miao666
2020-06-09 23:31:35 +08:00
黑猫白猫,能跑就是好猫
asanelder
2020-06-09 23:32:02 +08:00
@silvernoo #10 还没开始学 flutter,表示十分期待
x86
2020-06-10 00:26:59 +08:00
没问题就不要改,要改就准备好出问题背锅的准备…
Vegetable
2020-06-10 00:47:16 +08:00
他们可能也年轻过,迷茫过,尝试过,服了。
charlie21
2020-06-10 00:58:33 +08:00
应该该成状态机
xstmjh
2020-06-10 01:01:53 +08:00
一看就是没测试
XanderChen
2020-06-10 04:05:52 +08:00
我倒是觉得 if while 与或非各种嵌套的代码挺好改的,

你用文本的形式或者思维导图把所有情况列出来就行了,按图索骥呗。
ericgui
2020-06-10 04:24:34 +08:00
从理论上说,你应该改。从现实上,你先问问老板,然后再考虑下一步。
IllBeBack
2020-06-10 05:46:37 +08:00
这么多逻辑写在一起在 Debug 的时候可能还清晰一点,IDE 都有 if else 及 while 的折叠功能,功能区块还可以用 region 包起来,说不定还很直观。

如果拆成 N 个函数,Debug 的时候东跳西跳可能完全理不清头绪。理论上函数应该尽量短小,但实际上要看好不好 Debug,好不好理解。

也就 400 行,你可以试着理一下,如果不是把一垞屎变成 N 垞屎,那就可以跟领导邀功了。
Tony042
2020-06-10 07:26:13 +08:00
试下 matlab 的 state flow?貌似挺有效解决这类问题的

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

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

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

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

© 2021 V2EX