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

程序员鱼皮

共 3050字,需浏览 7分钟

 ·

2023-09-19 04:46

大家好,我是鲏。

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

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


还记得我在几年前直播带大家开发过一个表情包网站,网站名叫 “爸爸”、域名是 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 分钟上线网站!

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

浏览 34418
点赞
评论
收藏
分享

手机扫一扫分享

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

手机扫一扫分享

分享
举报