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

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

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

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

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

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

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

请各位大神指教

项目使用 Flask+Mongo

4771 次点击
所在节点    程序员
60 条回复
EscYezi
2020-08-04 13:18:31 +08:00
按功能拆分函数,就算无法复用以后维护也更容易
libook
2020-08-04 13:35:07 +08:00
出现问题或确定会出现问题的时候再考虑优化,把精力放在当下最重要的事情,如果实在没有事情可做,就对自己的系统做压力测试、可用性测试、边界测试,提前发现些问题,再根据问题的影响排优先级,从高优先级的问题开始解决优化。

如果代码可读性上有问题,就适当调整代码结构、增加注释,少用些奇淫技巧,少偷懒。
skypyb
2020-08-04 13:36:10 +08:00
你说的这些审核啊、积分变动啊、内容同步啊。 后续需求拓展起来应该是可以有一大堆代码的。
需要保证先后关系的如 审核- 匿名去敏 - 入库,可以解耦成责任链, 后续往上加东西对其他的代码改动就不会那么大。 其他的像是内容同步和积分变动这种,考虑观察者模式, 发个事件 /消息之类的
vertigo
2020-08-04 13:43:29 +08:00
@lijsh
@xuanbg
@hoyixi
@Jackeriss
@EscYezi

我想表达的意思是,比如一个函数是

```python
def foo():
print('a')
print('b')
print('c')
```
改成
```
class methods:
def a(self):
print('a')
def b(self):
print('b')

def foo():
bar = methods()
bar.a()
bar.b()
print('c')
```
反而会凭空多出复杂度出来,又少了可读性.比较困扰
但是看了上面其他大佬的回答,那么看来基本就是这个样子啦,那就保持原样这样吧
vertigo
2020-08-04 13:44:33 +08:00
@skypyb 如上条回复,我觉得可能只是把代码换了一个位置,真改起来来回找文件感觉更麻烦
vertigo
2020-08-04 13:46:46 +08:00
@skypyb 观察者模式这种方式很不错,我没有想到,谢谢大佬
Hanggi
2020-08-04 13:52:10 +08:00
复杂的代码一定要装进黑盒,避免污染到其他功能,对外接口要简单清晰,里面爱怎么整怎么整。
Veneris
2020-08-04 14:20:05 +08:00
审核,匿名抽象出工具类,大概率会复用
积分变动,同步到其他平台等使用消息队列异步处理
btw,其实这个代码行数不多
ZehaiZhang
2020-08-04 14:23:18 +08:00
那你是没见我同事七千行的代码
msaionyc
2020-08-04 14:57:13 +08:00
其实代码长不是问题,你这个抽方法,抽模块都很容易解决,最难解决的是慢接口,你这审查图片和审查文本,查表,落表,筛选这么多流程,后期数量大了,用户体验会非常差
有几个地方可以优化:
1.匿名的随机昵称是否需要使用到时再生成,可不可以预生成
2.增加积分功能抽模块,消息?
3.同步到其他社交平台也可以抽成模块,异步去做,或者定时任务去做
4.图片处理一定要在这个逻辑里同步做吗?是否可以异步做,然后再处理掉
vertigo
2020-08-04 15:37:28 +08:00
@msaionyc
1. 随机昵称这个必须同步做,因为用户回复完立刻就显示出来了
2. 同步平台的确可以异步或者定时任务完成,这个我事先没想到,nice.
3. 积分想了想的确可以抽象
4. 图片和内容审查就比较纠结,因为前有 soul 那档子烂事...如果做成异步或定时的,就怕有恶意用户发帖截图删举报一条龙(虽然法律上可以很直接追责,但是一旦发生产品基本也 GG 了)这是我完全独立运营和开发的项目,我觉得这种风险还是要权衡下
bugmakerxs
2020-08-04 15:55:45 +08:00
看到这个数了数公司那个大接口的代码。。。2000 多行一个方法,不敢动不敢动
Rwing
2020-08-04 15:57:47 +08:00
设计模式
RadishWind
2020-08-04 15:59:53 +08:00
抽象成 workflow,然后复用 workflow 中的 step
vertigo
2020-08-04 16:04:14 +08:00
@bugmakerxs 我整个项目一共 900 多行代码(包含注释和空行).....你说的那个接口肯定 java 写的吧
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.
// ==================================================================
h123123h
2020-08-04 16:16:34 +08:00
我见过一个项目很多代码都是几千行的,第二天果断跑路了
coderxy
2020-08-04 16:18:33 +08:00
我最夸张的一个方法里 3000 行代码。 你这不算什么
wellsc
2020-08-04 16:20:49 +08:00
两三千行的函数见过嘛
xuxuzhaozhao
2020-08-04 16:35:40 +08:00
100 多行也叫超长代码,玩呢?我现在正在改一个 800 多行的函数。

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

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

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

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

© 2021 V2EX