
如题,最近我在整理之前写的项目,发现有一个接口的代码越发出现失控的趋势(一个请求已经一百多行了),想请教一下大家是怎么处理这种问题的
项目是一个社区程序,用户回复一个主题后首先要
要做的内容非常的多,但是能抽象成单独函数的貌似只有审核和生成昵称,其他大部分都无法复用
但是我总觉得一个请求接口就这么老长,是不是我写项目的方式不对?
请各位大神指教
项目使用 Flask+Mongo
1 seki 2020-08-04 10:30:54 +08:00 你的逻辑就是这样,那就这么写咯 如果想不到怎么优化就先别优化,过早优化的效果不一定会那么好 |
2 hunter2015 2020-08-04 10:38:36 +08:00 拉面条就对了,优化,啥是优化 |
3 2kCS5c0b0ITXE5k2 2020-08-04 10:43:53 +08:00 via iPhone 才 100 多行嘛 还好啦 |
4 lower 2020-08-04 10:44:00 +08:00 才一百多行……就敢叫超长代码? |
6 icebay 2020-08-04 10:50:32 +08:00 via iPhone 无法复用为什么就不能拆呢? |
7 kop1989 2020-08-04 10:57:44 +08:00 没想好就先别动。千万别把代码设计和所谓“行数”做强关联。 你把他们都抽象出来看似接口只有几行了,其实是掩耳盗铃。 |
8 buffzty 2020-08-04 10:59:04 +08:00 四十行就受不了只能说明你没写过大项目. 你去看看 mysql oracle 源码 四十行? 你说的是一个小函数里面的括号吗 |
9 gz911122 2020-08-04 11:07:59 +08:00 不要过分拆分看着更累. 逻辑清晰按步骤走就行了 |
10 wysnylc 2020-08-04 11:18:09 +08:00 经验太少,过几年你就知道怎么写屎了 |
11 GBdG6clg2Jy17ua5 2020-08-04 11:18:18 +08:00 感觉逻辑挺清晰的啊 |
12 ppphp 2020-08-04 11:22:38 +08:00 没文档不清楚上下文就是这样的,吃过的奥利给多了,就香起来了 |
14 lijsh 2020-08-04 11:31:14 +08:00 积分变动和同步社交内容这个可以搞成事件或者消息 |
15 Vegetable 2020-08-04 11:33:51 +08:00 100 行的超长代码可还行? 每一个步骤可以分开,哪怕不能复用也可以抽象一下,不是过度设计,只是为了让逻辑更有层次方便理解。不会各种语句堆在一起,看着眼花。 |
16 xuanbg 2020-08-04 11:43:45 +08:00 每个功能抽象一个方法,接口负责调用这些方法。有些方法还可以异步处理,进一步减少接口响应时间。 |
17 WebKit 2020-08-04 11:47:32 +08:00 via Android 40 行??我移动端传参数就 10 几行 |
18 VictorJing94 2020-08-04 11:49:10 +08:00 .............骚年,见过几万行的函数嘛 |
19 hoyixi 2020-08-04 12:01:05 +08:00 你这里好几个步骤都是子功能 or 单独模块,别的地方都会用到,你这里不过调用一下罢了 |
20 Jackeriss 2020-08-04 12:42:24 +08:00 via iPhone 不是能复用才抽函数呀,函数可以让代码逻辑更清晰 |
21 EscYezi 2020-08-04 13:18:31 +08:00 via iPhone 按功能拆分函数,就算无法复用以后维护也更容易 |
22 libook 2020-08-04 13:35:07 +08:00 出现问题或确定会出现问题的时候再考虑优化,把精力放在当下最重要的事情,如果实在没有事情可做,就对自己的系统做压力测试、可用性测试、边界测试,提前发现些问题,再根据问题的影响排优先级,从高优先级的问题开始解决优化。 如果代码可读性上有问题,就适当调整代码结构、增加注释,少用些奇淫技巧,少偷懒。 |
23 skypyb 2020-08-04 13:36:10 +08:00 via Android 你说的这些审核啊、积分变动啊、内容同步啊。 后续需求拓展起来应该是可以有一大堆代码的。 需要保证先后关系的如 审核- 匿名去敏 - 入库,可以解耦成责任链, 后续往上加东西对其他的代码改动就不会那么大。 其他的像是内容同步和积分变动这种,考虑观察者模式, 发个事件 /消息之类的 |
24 vertigo OP |
27 Hanggi 2020-08-04 13:52:10 +08:00 复杂的代码一定要装进黑盒,避免污染到其他功能,对外接口要简单清晰,里面爱怎么整怎么整。 |
28 Veneris 2020-08-04 14:20:05 +08:00 审核,匿名抽象出工具类,大概率会复用 积分变动,同步到其他平台等使用消息队列异步处理 btw,其实这个代码行数不多 |
29 ZehaiZhang 2020-08-04 14:23:18 +08:00 那你是没见我同事七千行的代码 |
30 msaionyc 2020-08-04 14:57:13 +08:00 其实代码长不是问题,你这个抽方法,抽模块都很容易解决,最难解决的是慢接口,你这审查图片和审查文本,查表,落表,筛选这么多流程,后期数量大了,用户体验会非常差 有几个地方可以优化: 1.匿名的随机昵称是否需要使用到时再生成,可不可以预生成 2.增加积分功能抽模块,消息? 3.同步到其他社交平台也可以抽成模块,异步去做,或者定时任务去做 4.图片处理一定要在这个逻辑里同步做吗?是否可以异步做,然后再处理掉 |
31 vertigo OP @msaionyc 1. 随机昵称这个必须同步做,因为用户回复完立刻就显示出来了 2. 同步平台的确可以异步或者定时任务完成,这个我事先没想到,nice. 3. 积分想了想的确可以抽象 4. 图片和内容审查就比较纠结,因为前有 soul 那档子烂事...如果做成异步或定时的,就怕有恶意用户发帖截图删举报一条龙(虽然法律上可以很直接追责,但是一旦发生产品基本也 GG 了)这是我完全独立运营和开发的项目,我觉得这种风险还是要权衡下 |
32 bugmakerxs 2020-08-04 15:55:45 +08:00 看到这个数了数公司那个大接口的代码。。。2000 多行一个方法,不敢动不敢动 |
33 Rwing 2020-08-04 15:57:47 +08:00 设计模式 |
34 RadishWind 2020-08-04 15:59:53 +08:00 抽象成 workflow,然后复用 workflow 中的 step |
35 vertigo OP @bugmakerxs 我整个项目一共 900 多行代码(包含注释和空行).....你说的那个接口肯定 java 写的吧 |
36 Youen 2020-08-04 16:07:52 +08:00 不一定非要短. https://news.ycombinator.com/item?id=18772873 // ================================================================== // PLEASE DO NOT ATTEMPT TO SIMPLIFY THIS CODE. // KEEP THE SPACE SHUTTLE FLYING. // ================================================================== |
37 h123123h 2020-08-04 16:16:34 +08:00 我见过一个项目很多代码都是几千行的,第二天果断跑路了 |
38 coderxy 2020-08-04 16:18:33 +08:00 我最夸张的一个方法里 3000 行代码。 你这不算什么 |
39 wellsc 2020-08-04 16:20:49 +08:00 via iPhone 两三千行的函数见过嘛 |
40 xuxuzhaozhao 2020-08-04 16:35:40 +08:00 100 多行也叫超长代码,玩呢?我现在正在改一个 800 多行的函数。 |
41 msaionyc 2020-08-04 17:03:34 +08:00 @vertigo 第一点预生成的意思是提前生成好,到时候直接取,但想了想这个操作也是不太需要的,生成昵称这个操作基本 0 耗时 |
42 raaaaaar 2020-08-04 17:37:30 +08:00 via Android 一个函数只做函数名所表示的功能。只要能做到这一点,函数长度不要过于要求。 |
43 zhuweiyou 2020-08-04 17:39:07 +08:00 100 毛毛雨,几千行的都写过。 |
44 bccoder 2020-08-04 18:04:17 +08:00 via Android 我提交的参数有 100 多个,加上校验逻辑什么的,好几百行 |
45 csl1995 2020-08-04 18:05:15 +08:00 一个函数上千行。。。 |
46 luxinfl 2020-08-04 18:54:52 +08:00 jdk 和 spring 里面也有很多超长的源码,这都不是事 |
47 amundsen 2020-08-04 19:04:08 +08:00 都是一把梭,又不是不能用~ |
48 rockyou12 2020-08-04 19:06:23 +08:00 从你描述的业务来看,其实 100 行不算多啊……就码 if else if else 都要码很多行,逻辑清晰就别乱优化行数了 |
49 zgzb 2020-08-04 19:08:50 +08:00 现在硬盘容量足够大,只要功能多,界面美观,写成屎也没关系 |
50 EminemW 2020-08-04 19:22:24 +08:00 via iPhone 我司有个几千行的接口,一个函数几百行,我改了几次,最后怕改出啥问题,就回退了 |
51 leafdream 2020-08-04 19:23:00 +08:00 一个文件 8000 行的路过 |
52 nthhdy 2020-08-04 19:35:54 +08:00 只要不影响阅读和思考,单个函数长一些是没问题的。 抽函数的另一个考量是,是不是有一些部分是独立的概念,从而能当作新的 building block,简单的说就是看它能不能被重用。行数不是“硬指标”。 不用太教条了。 |
53 Jooooooooo 2020-08-04 19:57:18 +08:00 八个模块八个方法 主方法就八行? 挺清晰的 |
54 zjddp 2020-08-05 09:54:17 +08:00 说个歪的,换个带鱼屏,竖过来用就不超长了手动狗头 |
55 NCZkevin 2020-08-05 10:15:27 +08:00 写的一个处罚接口 快 1000 行,感觉随时可能出问题 |
57 taowen 2020-08-05 10:25:22 +08:00 ``` 对内容进行审核(看是否有黄暴或者攻击词汇) 筛选关键 tag 如果附带图片,图片内容审核 如果是匿名回帖还要生成随机昵称 如果是匿名私信还要处理私信内容 处理回复者和发帖人的积分变动 如果主贴超过一定回复数同步到其他社交平台等等 数据库处理入库 ``` 这个例子举得挺好的。把所有的这些逻辑都实现在帖子回复这个接口里的问题是什么?如果没有问题,改进也就没有收益。楼主提出了抽函数貌似也无法复用,那还需要抽函数吗? 这里有两个关键词 * 抽函数 * 复用 为什么手段一定是抽函数,为什么目标是复用? 这种一竿子写到底的写法的问题是什么? 如果问题不清楚,直接拿抽函数这个解决方案去套,就可能缘木求鱼了。 所以希望楼主或者其他回复的人,能够举一些具体场景的具体例子,这样的写法会带来的非常具体的问题。只有针对这些问题才有讨论价值。一段静态的代码文本,没有对错好坏之分。只有带入了具体的场景里,有针对性的问题,才有讨论意义。 |
58 vertigo OP @taowen 我认为一竿子写到底方法的问题是"边界感",细想一下,我们看代码的第一眼并不是精细到文字,而是一个个矢量块(常见例子是 3d 游戏渐进式加载,先是一个大立方体块,接着更多细节,最后才是具体贴图) 作为不常修改的稳定模块(不常改就记不住),突然想加东西时第一眼就是一长条色块,接下来需要自己通读一下代码才可以知道哪里改 例:添加一个自动添加水印功能,我需要找到图片审核后,生成昵称前,然后插入逻辑,但是如上说,纯文字代码需要彻底读完或者读到大班才能知道在哪里动手,效率有点尴尬.(并且随着代码变大,每次这个通读过程会越来越多) 而极端的抽离逻辑后,我们视觉上是一个个短色块,此时我们只要读取 function name 就能大致知道这个模块是不是该改动(类似数据库加 index 了),这是我觉得抽象逻辑的好处 实际上我也认同楼上其他大佬说的,能不乱改还是不乱改,只是想知道有没有两者结合的方法 |
59 Ryzebo 2020-08-05 15:41:59 +08:00 其实,作为老实人, 你是面向薪资编程,还是面向项目编程,还是面向自己编程,还是面向加班编程? |