服务端复杂项目超长代码该如何组织呢?

2020-08-04 10:28:34 +08:00
 vertigo

如题,最近我在整理之前写的项目,发现有一个接口的代码越发出现失控的趋势(一个请求已经一百多行了),想请教一下大家是怎么处理这种问题的

项目是一个社区程序,用户回复一个主题后首先要

  1. 对内容进行审核(看是否有黄暴或者攻击词汇)
  2. 筛选关键 tag
  3. 如果附带图片,图片内容审核
  4. 如果是匿名回帖还要生成随机昵称
  5. 如果是匿名私信还要处理私信内容
  6. 处理回复者和发帖人的积分变动
  7. 如果主贴超过一定回复数同步到其他社交平台等等
  8. 数据库处理入库

要做的内容非常的多,但是能抽象成单独函数的貌似只有审核和生成昵称,其他大部分都无法复用

但是我总觉得一个请求接口就这么老长,是不是我写项目的方式不对?

请各位大神指教

项目使用 Flask+Mongo

4805 次点击
所在节点    程序员
60 条回复
msaionyc
2020-08-04 17:03:34 +08:00
@vertigo 第一点预生成的意思是提前生成好,到时候直接取,但想了想这个操作也是不太需要的,生成昵称这个操作基本 0 耗时
raaaaaar
2020-08-04 17:37:30 +08:00
一个函数只做函数名所表示的功能。只要能做到这一点,函数长度不要过于要求。
zhuweiyou
2020-08-04 17:39:07 +08:00
100 毛毛雨,几千行的都写过。
bccoder
2020-08-04 18:04:17 +08:00
我提交的参数有 100 多个,加上校验逻辑什么的,好几百行
csl1995
2020-08-04 18:05:15 +08:00
一个函数上千行。。。
luxinfl
2020-08-04 18:54:52 +08:00
jdk 和 spring 里面也有很多超长的源码,这都不是事
amundsen
2020-08-04 19:04:08 +08:00
都是一把梭,又不是不能用~
rockyou12
2020-08-04 19:06:23 +08:00
从你描述的业务来看,其实 100 行不算多啊……就码 if else if else 都要码很多行,逻辑清晰就别乱优化行数了
zgzb
2020-08-04 19:08:50 +08:00
现在硬盘容量足够大,只要功能多,界面美观,写成屎也没关系
EminemW
2020-08-04 19:22:24 +08:00
我司有个几千行的接口,一个函数几百行,我改了几次,最后怕改出啥问题,就回退了
leafdream
2020-08-04 19:23:00 +08:00
一个文件 8000 行的路过
nthhdy
2020-08-04 19:35:54 +08:00
只要不影响阅读和思考,单个函数长一些是没问题的。
抽函数的另一个考量是,是不是有一些部分是独立的概念,从而能当作新的 building block,简单的说就是看它能不能被重用。行数不是“硬指标”。
不用太教条了。
Jooooooooo
2020-08-04 19:57:18 +08:00
八个模块八个方法

主方法就八行?

挺清晰的
zjddp
2020-08-05 09:54:17 +08:00
说个歪的,换个带鱼屏,竖过来用就不超长了手动狗头
NCZkevin
2020-08-05 10:15:27 +08:00
写的一个处罚接口 快 1000 行,感觉随时可能出问题
vertigo
2020-08-05 10:22:12 +08:00
@zjddp 有,脖子疼
taowen
2020-08-05 10:25:22 +08:00
```
对内容进行审核(看是否有黄暴或者攻击词汇)
筛选关键 tag
如果附带图片,图片内容审核
如果是匿名回帖还要生成随机昵称
如果是匿名私信还要处理私信内容
处理回复者和发帖人的积分变动
如果主贴超过一定回复数同步到其他社交平台等等
数据库处理入库
```

这个例子举得挺好的。把所有的这些逻辑都实现在帖子回复这个接口里的问题是什么?如果没有问题,改进也就没有收益。楼主提出了抽函数貌似也无法复用,那还需要抽函数吗? 这里有两个关键词

* 抽函数
* 复用

为什么手段一定是抽函数,为什么目标是复用? 这种一竿子写到底的写法的问题是什么? 如果问题不清楚,直接拿抽函数这个解决方案去套,就可能缘木求鱼了。

所以希望楼主或者其他回复的人,能够举一些具体场景的具体例子,这样的写法会带来的非常具体的问题。只有针对这些问题才有讨论价值。一段静态的代码文本,没有对错好坏之分。只有带入了具体的场景里,有针对性的问题,才有讨论意义。
vertigo
2020-08-05 10:38:59 +08:00
@taowen 我认为一竿子写到底方法的问题是"边界感",细想一下,我们看代码的第一眼并不是精细到文字,而是一个个矢量块(常见例子是 3d 游戏渐进式加载,先是一个大立方体块,接着更多细节,最后才是具体贴图)

作为不常修改的稳定模块(不常改就记不住),突然想加东西时第一眼就是一长条色块,接下来需要自己通读一下代码才可以知道哪里改

例:添加一个自动添加水印功能,我需要找到图片审核后,生成昵称前,然后插入逻辑,但是如上说,纯文字代码需要彻底读完或者读到大班才能知道在哪里动手,效率有点尴尬.(并且随着代码变大,每次这个通读过程会越来越多)

而极端的抽离逻辑后,我们视觉上是一个个短色块,此时我们只要读取 function name 就能大致知道这个模块是不是该改动(类似数据库加 index 了),这是我觉得抽象逻辑的好处

实际上我也认同楼上其他大佬说的,能不乱改还是不乱改,只是想知道有没有两者结合的方法
Ryzebo
2020-08-05 15:41:59 +08:00
其实,作为老实人,
你是面向薪资编程,还是面向项目编程,还是面向自己编程,还是面向加班编程?
vertigo
2020-08-06 10:13:50 +08:00
@Ryzebo 这个是我个人项目呀,面向彩虹屁编程

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

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

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

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

© 2021 V2EX