2311061234/REPORT.md
张雪尔 d6fb6fac4c
Some checks are pending
autograde-final-vibevault / check-trigger (push) Waiting to run
autograde-final-vibevault / grade (push) Blocked by required conditions
更新 REPORT.md
2025-12-22 04:03:19 +08:00

45 lines
5.8 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 后端开发反思报告
> 请参考 `REPORT_GUIDE.md` 了解写作要求。建议 8001500 字。
---
## 1. 我遇到的最大挑战
<!-- 描述一个具体的问题、你的排查过程、以及最终如何解决 -->
  本次开发中我遇到的最大挑战是JWT认证过滤器与实体类方法不匹配引发的代码标红及功能失效问题。在整合 JwtAuthenticationFilter  User 实体类时IDE持续提示 user.getRole() 方法不存在即便我已确认在 User 类中定义了 role 字段及对应的 getter 方法。
  起初我将排查重点放在代码书写层面反复核对方法名拼写与访问修饰符甚至重新编写 getRole() 方法但问题并未解决。随后我又尝试排查Lombok插件的生效情况同样无果。在走了诸多弯路后我调整排查思路先通过清除Java语言服务器缓存并重启IDE排除了IDE缓存干扰的可能接着将目光聚焦到实体类的实例化环节。经核查发现测试代码中调用了三参数的构造方法创建 User 对象但初始的 User 类仅编写了无参和两参数构造方法导致实例化后的对象未正确初始化 role 字段进而使IDE误判 getRole() 方法无效。
  找到问题根源后我在 User 类中补充了包含 username  password  role 的三参数构造方法同时确保 getRole() 方法的访问修饰符为 public 。修改完成后代码标红消失JWT过滤器也能正常提取用户角色并完成权限认证流程。
  此次问题排查让我深刻认识到后端开发中实体类的构造方法设计与业务代码的匹配度至关重要。很多时候代码报错的根源并非方法本身存在缺陷而是对象实例化时的参数缺失。此外IDE缓存问题是高频“隐形坑”遇到代码标红时应优先排除缓存干扰再开展代码逻辑的排查工作。
## 2. 如果重新做一遍
<!-- 回顾你的设计决策,哪些地方可以做得更好? -->
  回顾本次开发过程,若能重新设计系统,我会在数据模型设计与业务逻辑分层两个方面做出优化调整。
  其一优化用户角色的存储方式采用枚举类替代字符串类型。本次开发中用户角色直接以 String 类型存储取值为 ROLE_USER  ROLE_ADMIN 。这种设计存在明显弊端一方面字符串手写输入易出现拼写错误例如将 ROLE_ADMIN 误写为 ROLE_ADMINN 会直接导致权限判断逻辑失效另一方面角色类型缺乏统一管理机制新增角色时需要在多处代码中修改字符串常量维护成本较高。重新设计时我会定义 UserRole 枚举类封装 USER  ADMIN 两个枚举值 User 实体类中使用枚举类型映射角色字段。这种方式既能借助枚举的强类型特性避免拼写错误又能实现角色类型的统一管理提升代码的健壮性与可维护性。
  其二拆分歌单复制功能的代码逻辑提升代码复用性与可测试性。本次开发中我将歌单复制功能的所有逻辑包括原歌单查询、新歌单创建、歌曲复制等全部集中在 copyPlaylist 这一个方法内导致该方法代码行数过多可读性与可维护性较差。重新设计时我会遵循单一职责原则将该功能拆分为三个粒度更细的方法 getOriginalPlaylistById() 负责查询原歌单并处理资源不存在的异常 createNewPlaylist() 负责构建新歌单的基础信息 copySongsToNewPlaylist() 负责将原歌单的歌曲复制到新歌单中。这种分层设计让每个方法只承担一项具体职责不仅便于编写单元测试还能在其他需要复制歌曲的业务场景中复用 copySongsToNewPlaylist() 方法。
## 3. AI 协同开发经验
<!-- 举 1-2 个具体例子,分享 AI 帮助你和误导你的经历 -->
在本次开发过程中AI作为高效的辅助工具为我节省了大量查阅资料的时间但同时也暴露出一些局限性让我总结出一套更高效的AI使用策略。
第一个典型场景是生成JWT服务类的核心代码。开发初期我对JJWT库的API使用并不熟悉于是向AI提问“如何基于JJWT 0.11.x版本实现JWT的生成、解析与验证功能” AI快速返回了完整的 JwtService 代码包含 generateToken  extractUsername 等核心方法其代码框架完全符合JJWT 0.11.x版本的使用规范帮我省去了翻阅官方文档的时间成本。但深入核查后发现AI提供的代码存在细节疏漏 isTokenValid 方法仅验证了用户名的一致性未判断token是否过期且未处理token解析时的异常情况。对此我在AI代码的基础上补充了 extractExpiration 方法用于判断token有效期并通过 try-catch 块捕获解析异常确保方法在token无效时能稳定返回 false 
第二个典型场景是解决实体类构造方法不匹配的问题。当 User 类因构造方法缺失导致代码标红时我向AI描述了问题现象AI准确指出了核心问题——缺少三参数构造方法并给出了正确的代码补充方案。但同时AI附带了一个错误建议即使用 new User(username: "admin", password: "123") 这种命名参数的写法而这种语法属于Kotlin语言并不适用于Java开发。我及时识别了该错误未采纳此建议而是按照Java的标准语法补充了构造方法。
基于以上两次使用经验我总结出两点核心心得大势所趋不能不用AI而且AI确实能帮助我们提升效率但也不能全信AI直接照搬它更适合当一个辅助工具最终效果还得看使用者尽信书不如无书。