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

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

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

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

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

求解惑

10147 次点击
所在节点    程序员
96 条回复
dog82
2020-06-10 09:21:31 +08:00
你能把它改成 3 层吗?不行就不要动
cxknmsl
2020-06-10 09:23:49 +08:00
@zzzmh,牛批,这场面真没见过
Hallelu
2020-06-10 09:25:19 +08:00
我们公司很多函数都在一两千行,各种业务逻辑判断。
neroransom
2020-06-10 09:28:55 +08:00
这种 if else 又不是一个人写出来的,有时和完全重构相比,直接加一个 else 才是最优选项。
lyz1990
2020-06-10 09:33:31 +08:00
手上维护的项目,1000 行以上的函数五六个吧,所有的历史作者都离职了。
zhuweiyou
2020-06-10 09:35:00 +08:00
几千上万行一个文件,都是很正常的事情,大惊小怪?
yuchenyang1994
2020-06-10 09:36:43 +08:00
我见过 3000 行的
fhsan
2020-06-10 09:37:45 +08:00
代码 commit+1,离职+1,成为老坑
ma836323493
2020-06-10 09:52:19 +08:00
关键是有个功能要在这基础上改,俺修改的时候瑟瑟发抖,生怕改坏了(注意,这个函数没有相关测试)

这感觉就像是拿着一个很脆弱的易碎品,生怕摔了。
又像是你去蹲坑,发现停水很久了,坑里已经被 S 塞满了,而你不得不忍着恶心蹲下



以前同事也是这么想的,可能原先只有七层嵌套, 他怕改出问题,一个稳妥的办法,八层嵌套
galikeoy
2020-06-10 09:56:46 +08:00
那就再加一层 if #滑稽
mbtfdwlx
2020-06-10 10:03:38 +08:00
我在维护老项目时候遇到过这种情况,稳妥一些的办法,首先要在原来的基础上做好新需求。上线后再把原来的代码一点点重写掉,扔到测试服,多测试,最后体验服跑上一段时间后没问题,就可以上线了...
statement
2020-06-10 10:03:56 +08:00
如果你在这家公司待了三年以上,可以考虑重现一个实现替换,但也别改。
如果你刚来这家公司,且不是大牛。有这种想法可以但最好别和别人说。
vevlins
2020-06-10 10:04:39 +08:00
四百多行我见过有二十个 ifelse 的,有时候代码烂是工期、需求、技术人员多方面一起造成的,有它的历史背景在。 如果要改就找个工期宽裕的,测试愿意配合,加上单测。
whypool
2020-06-10 10:10:30 +08:00
事实证明代码洁癖要不得
如果再加一个需求,你还是会用 if,再去嵌套
Doracis
2020-06-10 10:11:34 +08:00
我可能就是写了八层 if else 的程序员,没办法,开发周期短,需求变更频繁,本来我都计划的好好地,用一个 if else 解决,谁知甲方中途加需求改设计方案,后台加字段加状态加各种 flag,我也抓狂啊

不过好在每次写 if else 我都会留下注释,为什么加每一层判断以及要干嘛这种的,算是方便后期维护吧,毕竟代码放了三个月再看,亲妈都不认识了

这种代码俗称屎山,屎山不是一日堆成的,你要想撬动屎山就做好被屎淹没的勇气,撬不动就再堆点屎,浮冰之下用户也看不到屎山,再说了就大部分程序员的这个代码水平,芳古流传不可能了,十七八年基本就会整体换一代框架, 没必要,真的没必要
micean
2020-06-10 10:20:16 +08:00
老纠结嵌套和行数,不如写上注释,啥都不是事
jasonding
2020-06-10 10:25:44 +08:00
想起我写的一个类,1400 行,其中一个函数是 excel 导入,差不多占了近千行。两个 sheet,涉及 7 层数据结构,sheet1 是前四层,sheet2 是后四层,其中一个是映射层,这是基础数据结构。然后还有 excel 模板校验、实际数据格式校验、脚本逻辑校验、穷举遍历、组合计算、数据入库等实际业务逻辑。总共改版三次,其中第三版是兼容版,要求兼容老的 excel 模板,同时支持新的 excel 模板导入,我 TM 都快疯了。
codergrowing
2020-06-10 10:28:39 +08:00
8 层算什么,前一段接了一个项目,一个函数嵌套层级有 12 层……真的是理逻辑理到怀疑人生
zhangyangkam1
2020-06-10 10:44:33 +08:00
从某种意义上来说写个十几层嵌套也不出错一直用下来也算挺厉害的
tremblingblue
2020-06-10 10:48:11 +08:00
所以一个 if 上去保平安 然后下个月再加一个.

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

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

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

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

© 2021 V2EX