关于恶心人的屎山代码
最近在维护公司以前的代码,准确来说应该是重构,之前看这个项目的时候我还以为这玩意儿应该至少是7,8年前的代码了,然后看了一下 SVN(忽略为什么现在这公司在用 SVN,我也不知道呵呵).
呵呵,大部分的代码都是 2019 年的代码,我实在不能够想到 2019 年能将代码写成那个样子。
2019年,C# 8 也已经发布了吧(先忽略,我为什么又跑去写 C# 了),实在搞不能够为什么代码能够写成那个样子。
下面列举一下我个人举的非常恶心的地方,欢迎各位对号入座,包括我自己(因为我已经开始摆烂了)。
-
无处不再的魔法常量,WTF, 116 是什么东西,9 又是什么东西,「咕噜咕噜」(一个中文字符串)又是什么东西
我真是吐了,定义一个静态类将这些东西收敛在一起整理干净不好吗,鬼知道这都是啥啊 -
恶心人的各种方法名函数名变量名,xgschool, xgylschool是什么东西?xxwz又是什么东西?你要是说两个三个中文关键字不好翻译也就算了,满屏的 xyz 是什么意思?
还不带注释,尼玛好一个不可替代(不得不说牛逼)好的,这些我都忍了,我直接看实现就好了。xgschool 看起来是 xgulschool 的反向操作,他们是互反的。也就是将
一些指定的名称替换成为外部名称。
好的,我大概明白了,可是你这也不对呀。然后来告诉你为什么很恶心,这两个方法都是接口一个字符串,然后一直链式调用Replace方法
大概像是这样 str.Replace("张三", "李四").Replace("王无", "二百五"),然后这俩方法是互反的替换,然后还缺,对不上我真是
服了,线上系统是怎么跑起来的? -
恶心人的 SQL 拼接,你实在是难以想象这里拼接 SQL 的方法,抽象一段方法,然后这个方法拼前面的一截,大概像是 "select x, y from table",
然后该方法接受一个字字符串参数拼后面一截,它可能是 "where z > 0" 或者其他什么东西(这里简化了一下例子,明白意思就好)。
调用开起来像是这个样子GetXYZ("where z > " + i + "and n != " + name)
WTF,你不能把他抽象成根据条件拿对象吗?请问你这抽象是什么意思?好吧,这也不是问题,烂代码而已。 -
。。。 不胜枚举,懒得再谈
-
最后一条,或者说我已经懒得搬着指头数这项目代码哪些问题了。知道最大的问题是什么吗。整个项目就是一坨东拼西凑用屎糊出来的机器,逻辑这里散落一点,
那里散落一点,而且还不一致,就好像是这个窗户漏风,然后赶快刨坨屎糊上去,结果豁口更大了。没办法只好弄一坨更大的屎把这窗户糊住。呵呵。
这是之前的代码恶心的地方,那么现在来说说问什么现在的代码一样让我感到烦躁。
首先项目是个门户网站,也就是说这些数据很少做更改,更多的是对已有的数据做一个聚合展示的作用,也就是说读很多,但是写很少。写操作永远只会在管理后台进行。
业务逻辑根本是不复杂的,或者说根本没啥也无逻辑(有什么业务逻辑呢?)。这个是项目背景,也就是解释,为接下来的吐槽做一个铺垫。
然后现在的代码设计要求是,对于部分表的数据都做一个缓存,然后对一些聚合的查询做一些缓存(直接放到 redis 中)。我们肯定知道是吧,知道用到缓存就一定存在
怎么处理缓存一致性的问题,而这也是一个恶心的问题,如果能够不处理这个问题,那么当然是不处理得好。对部分表的数据做缓存不是不行,可是这不是将事情复杂化了
么。我的想法是直接缓存页面数据,URL 作为 Key,设置一个过期时间,根本就不需要考虑缓存一致性的问题,用实时性换响应速度,然而这个问题很大吗?
而且比他这样做表数据的缓存要快得多,一次 Redis 请求和多次 Redis 请求谁快?而且更加简单。
而且就算按他的想法来,代码设计也有问题啊。如果按他的想法(或者说明确指定),那么有两个缓存层级,一个是表(或者你叫他领域对象,不过我羞于启齿),一个
是聚合查询的方法,而实际代码的编写又将他们混在了一起,也就是说在一个相同的层级上有的方法用了缓存,而有的没有。
这样子一个问题是可能不一致(现在想象好像也不是什么大问题,不一致也没什么问题),再就是很丑。
这个是代码让我不喜欢,在一个就是现在这个工作基本上就是我一个人在做。其他人他们都有其他的项目,也都不想碰这个项目,于是这个大责任自然也就来到了我这个新人
手里。呵呵哒。
而已我到现在也没梳理清楚原来的代码怎么搬到现在这里来,一个是原来的项目我是实在没搞懂他是怎么正常跑起来的?再一个就是这个新的重构项目他们创建的模型(我更宁
愿称之为表)我没法直接对应到原来对应的 SQL 查询上面去。
关于原来那个狗屎项目的表设计又是一个值得吐槽的地方,然而已经很晚了,就此打住。