回味下自己几年前写的 “酱香代码”

程序员鱼皮

共 3050字,需浏览 7分钟

 · 2023-09-19

大家好,我是鲏。

从酱香拿铁、酱香巧克力、再到酱香大床,最近茅台真的是一步步刷新了大家的认知。

但我若掏出自己几年前的 “酱香代码”,阁下如何应对?!


还记得我在几年前直播带大家开发过一个表情包网站,网站名叫 “爸爸”、域名是 father.cool:

当时这个网站用户未万,就中道崩殂了,主要的原因是流量费、以及图片内容安全问题,后面我也就不再维护了,但是把代码完全开源给了大家。

开源地址:https://github.com/liyupi/father

最近是在整理自己的原创文章时,又发现了这个项目,所以决定再翻出来看看代码。

俗话说,检验一个程序员进步的最好方式,就是让他去评价自己之前写过的代码。

如果想吐槽 “这烂代码谁写的?!” 那么恭喜你,有进步了!👍🏻

那接下来跟着鱼皮一起来看看,当年直播的时候写的烂代码吧,相信很多同学也都写过。

前端

先把前端项目运行起来,给大家看看效果。

打开依赖文件,发现这个项目我竟然用的是 Vue 3!

几年前做这个项目的时候,应该是 Vue 3 刚开始流行,所以我用了 Vue 3 来尝个鲜:

接下来试着运行下前端项目。但很不幸的是,代码保质期有限,用 npm 运行的时候失败了,换了 yarn 依赖管理才成功运行。不得不感慨(吐槽),前端依赖升级的实在是太快了!

项目运行后,长下面这个 🐦 样子:

左上角的裂图是由于当时项目 Logo 用的是网络图片,而不是放在本地的,后面这张图片失效了所以无法显示。

像 Logo 这种重要的图片,还是老老实实放在 public 目录下吧。

点击图片后,可以对图片进行编辑,比如添加文字等,制作自己的表情包:

不运行后端也能使用,效果还是不错的:

后端

重点看下后端的代码。

先看 pom.xml 依赖文件,几年前项目用的就已经是 Spring Boot 2.5 了,到现在 Spring Boot 2 还是主流,而且会持续很长一段时间。

依赖文件中引入了 Apache 的 httpclient,用来发送 Http 请求的工具包。但是这个库其实是有坑的,所以后面我很少用这个包了,基本上会用 Hutool 工具库来代替。

来看看项目结构,大多数类名还是比较规范的,见名知意。除了那个 MyConstant 常量类。。。

当时估计是偷懒了,就随便起了个名字。定义常量时最好还是分个类,比如把用户相关的常量放在 UserConstant 下。

打开一个 Controller,在类名上有一行长长的 @CrossOrigin 注解,用来定义允许哪些域名跨域:

其实不太推荐使用这种在每个类上打注解的方式实现跨域,虽然方便,但是不利于后期的修改和维护,因为每次要改很多类。

大多数情况下,对于同一个后端服务提供的接口,应用的跨域规则是一致的。

所以后面很多项目我都采用统一的配置类来实现全局的跨域配置了:

再看 Controller 文件内新增表情功能的实现代码,非常的简短,非常的朴实无华。

但其实问题也很大,当时肯定是出于直播、为了快速实现功能才这么写了,上述代码存在至少 3 个问题:

1)直接用了实体类接收请求参数,可能会导致调用方传了一些不允许传递的参数,比如传递 reviewStatus = 1 直接让表情过审

2)未对字段做任何的校验,直接插入到数据库中了

3)没有指定上传用户的 id。即使有些系统不要求登录,也建议传个能够标识用户(或机器)的字段,比如 IP 地址,防止有小人恶意插入大量数据

其实判断对象是否为 null 这行代码也是可以优化的:

可以自己封装一个断言工具类来抛异常,比如下列示例代码:

AssertUtil.assertNotNull(emoji);

再接着看 Controller,在搜索表情接口中,竟然写了老长一段封装 SQL 查询对象的代码:

其实根据对象封装查询对象是一个通用逻辑,可以把它单独提取出来作为一个方法,而不是写在接口类中。Controller 层的代码尽量保证精简,尽量不要写业务逻辑。

再看文件上传功能,到第二行就绷不住了:

上面的代码中,我用当前时间 + 用户上传的原始文件名来拼接新的文件名,当时应该是图省事儿,用这种方式保证文件名不重复。

但其实,这种命名规则,是非常不利于文件维护的!最好使用 业务前缀 + 用户标识 + 日期 等维度来拼接完整的文件路径,便于检索和迁移文件。

再往下看,当时自己还手写了很多工具类,比如下载图片:

现在想想,挺天真的,明明用个工具类(比如 Hutool)一行代码就搞定了。

再往下看,在 resources 目录中有一个 banner.txt 文件,这东西很有意思,可以允许你自定义启动项目时控制台的输出信息。

像我当时用了个字符画生成网站,生成了 Father 单词对应的字符画,这就是属于程序员的浪漫吧~


OK,就分享到这里,大家自己写过的每个项目(哪怕是玩具)代码都一定要留好,都是属于自己的财富。多年之后回过头来看看,真的会有一种别样的快乐!

👇🏻 点击下方阅读原文,获取鱼皮往期编程干货

往期推荐

这次是真【一条龙】了!

转学 Java 一年半,最大的问题是?

最累的一场面试,还得是腾讯!

简历项目造假,被发现了。

不用服务器,1 分钟上线网站!

如何打造出色的求职简历?

浏览 34402
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报