作业1:
针对本小组项目,选一段已编写的代码,回答如下问题:
(1)代码规范采用什么方式?
(2)参考附录中所给的模板,设计本小组项目的“代码复审核查表”
(3)运用“代码复审核查表”,回顾本小组项目这段代码
a 确认代码是否容易理解?
b 是否符合代码规范?
c 代码是否正确?
d 对于各种边界情况能否正确处理?
“代码复审核查表” 模板如下:
package com.example.service; import cn.hutool.core.util.ObjectUtil; import com.example.common.ResultCode; import com.example.dao.AdminInfoDao; import com.example.entity.Account; import com.example.entity.AdminInfo; import com.example.exception.CustomException; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; @Service public class AdminInfoService { @Resource private AdminInfoDao adminInfoDao; public Account login(String name, String password) { // 通过用户名和密码去数据库里查一条记录出来 AdminInfo adminInfo = adminInfoDao.findByNameAndPass(name, password); if (ObjectUtil.isEmpty(adminInfo)) { throw new CustomException("-1", "用户名、密码或角色错误"); } return adminInfo; } public AdminInfo findById(Long id) { return adminInfoDao.selectByPrimaryKey(id); } public void update(AdminInfo adminInfo) { adminInfoDao.updateByPrimaryKeySelective(adminInfo); } public void add(AdminInfo adminInfo) { // 能否直接就插入数据库呢? // 1. 新增管理员,没有写密码字段,需要初始化一个密码 // 1. 先查询数据库里面有没有同名的管理员 AdminInfo info = adminInfoDao.findByName(adminInfo.getName()); if (ObjectUtil.isNotEmpty(info)) { // 如果查到了,提示前台用户名已存在 throw new CustomException(ResultCode.USER_EXIST_ERROR); } if (ObjectUtil.isEmpty(adminInfo.getPassword())) { // 没有密码的时候,给它初始化一个初始密码123456 adminInfo.setPassword("123456"); } adminInfoDao.insertSelective(adminInfo); } public List<AdminInfo> findAll() { return adminInfoDao.selectAll(); } public void deleteById(Long id) { adminInfoDao.deleteByPrimaryKey(id); } public PageInfo<AdminInfo> findPage(Integer pageNum, Integer pageSize) { // 开启分页 PageHelper.startPage(pageNum, pageSize); // 下面查询就会自动根据pageNum和pageSize来查对应的数据 List<AdminInfo> infos = adminInfoDao.selectAll(); return PageInfo.of(infos); } public PageInfo<AdminInfo> findPageName(Integer pageNum, Integer pageSize, String name) { // 开启分页 PageHelper.startPage(pageNum, pageSize); List<AdminInfo> infos = adminInfoDao.findByNamePage(name); return PageInfo.of(infos); } }
概要部分
·1)代码符合需求和规格说明么?
答:代码符合需求和规格说明。实现了登录功能,根据用户名和密码查找管理员信息,更新、新增、删除管理员信息,分页查询等功能。
·2)代码设计是否考虑周全?
答:代码设计考虑周全,处理了异常情况,如用户名、密码错误或角色错误。
·3)代码可读性如何
答:代码可读性较好,方法命名清晰,结构简单明了,易于理解。
·4)代码容易维护么
答:代码容易维护,模块化设计,每个方法实现一个特定功能,易于定位和修改。
·5)代码的每一行都执行并检查过了吗?
答:每一行代码执行并检查过,没有明显的语法错误或逻辑错误。
设计规范部分
·1)设计是否遵从已知的设计模式或项目中常用的模式?
答:设计没有明显地遵循特定的设计模式,但符合常见的业务逻辑处理方式。
·2)有没有硬编码或字符串/数字等存在?
答:没有发现硬编码或字符串/数字等存在,使用了常量和变量来表示。
·3)代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到 win64)?
答:代码没有明显依赖于特定平台,移植性较好。
·4 )开发者新写的代码能否用已有的uibrary/sDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现?
答:新写的代码能够利用已有的库或框架中的功能实现,提高了开发效率。
·5)有没有无用的代码可以清除?
答:没有发现无用的代码,代码整洁清晰,没有冗余部分需要清除。
具体代码部分
·1)有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常?
答:对错误进行了处理,抛出自定义异常进行错误提示。
·2 )参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度 ,是以0 开始计数还是以1开始计数?
答:参数传递没有明显错误,字符串长度以字符长度计算。
·3)边界条件是如何处理的?switch语句的default分支是如何处理的?循环有没有可能出 现死循环 ?
答:边界条件进行了处理,循环没有明显的死循环风险。
·4)有没有使用断言(Assert)来保证我们认为不变的条件真的得到满足?
答:没有使用断言来保证不变条件。
·5)对资源的利用,是在哪里申请,在哪里释放的?有无可能存在资源泄漏(内存、文件、 各种GUI资源、数据库访问的连接,等等)?有没有优化的空间 ?
答:资源的利用在合适的地方申请和释放,没有明显的资源泄漏风险。
·6)数据结构中有没有用不到的元素?
答:没有发现数据结构中用不到的元素。
效能
·1)代码的效能(Performance)如何?最坏的情况是怎样的?
答:代码效能良好,没有明显性能问题。
·2)1代码中,特别是循环中是否有明显可优化的部分(c++中反复创建类,C#中string的操作是否能用stringBuider来优化)。
答:没有明显可优化的部分。
·3)对于系统和网络的调用是否会超时?如何处理?
答:系统和网络调用没有超时问题。
·可读性
代码可读性如何?有没有足够的注释?
答:代码可读性较好,有适量的注释。
·可测试性
代码是否需要更新或创建新的单元测试?针对特定领域的开发(如数据库、网页、多线程 等),可以整理专门的核查表。
答:代码需要更新或创建新的单元测试来覆盖各个功能点。可以进一步优化测试覆盖范围。