引言
小组成员介绍
小组:第三小组
组长:何骏达
组员:廖家聪、纪俊强、林彦彤、吴文敏、徐远欢
小组成员博客链接
何骏达:http://t.csdnimg.cn/6zj69
纪俊强:用例图了解和绘制-CSDN博客
廖家聪:http://t.csdnimg.cn/SqDRc
林彦彤:http://t.csdnimg.cn/ZBRRA
吴文敏:学生信息管理系统用例图-CSDN博客
徐远欢:http://t.csdnimg.cn/DCM2C
学生信息管理系统介绍
学生信息管理系统是一个针对学校学生处大量工作处理而开发的管理软件,旨在实现学生信息关系的系统化、科学化、规范化和自动化。该系统集信息展示、查询、增删和修改多种功能为一体,能够高效录入和查询学生个人信息,方便用户快速进行数据操作。
系统的主要用户包括学校在校学生和教师。对于学生而言,他们可以通过系统查询和修改自己的个人信息,例如姓名、学号、联系方式等。而对于教师,系统提供了更多的功能,如添加学生信息、管理学生成绩等,以便更好地进行日常教学管理工作。
此外,学生信息管理系统还包括考勤管理、资助管理、综合测评、职业能力分析、社团管理、党员管理等多个模块,可以满足学校对学生信息管理的各种需求。例如,教师可以通过系统快速统计学生的出勤情况,提高日常管理效率;学生也可以自行查询成绩,了解自己的学习状况。
作业1
问题1:代码规范采用什么方式?
常规的代码规范
代码规范是为了保证代码的可读性、一致性和可维护性而制定的一系列规则和标准。采用代码规范的方式通常包括以下几个方面。
1.命名约定
1.1使用有意义的变量、方法和类名,避免使用缩写和模糊的词汇。
1.2遵循Java命名规范,例如,类名使用大驼峰命名法(CamelCase),变量和方法名使用小驼峰命名法(camelCase)。
2.代码格式化
2.1保持一致的缩进,通常使用4个空格作为一个缩进级别。
2.2在操作符前后保持适当的空格,例如`if (condition)`而不是`if(condition)`。
2.3每行代码的长度最好不要超过80-120个字符,超出则应适当换行。
3.注释和文档
3.1为复杂的逻辑和关键代码段添加注释,注释应简洁明了。
3.2使用JavaDoc为公共类、接口和方法编写文档。
4.错误处理
4.1对可能抛出异常的代码进行适当的异常处理,避免程序崩溃。
4.2不要使用异常控制流程,例如在`try-catch`块中使用`return`语句。
5.代码结构
5.1遵循单一职责原则,即一个类或方法只负责一项任务。
5.2避免过长的方法,适当的时候将代码拆分为多个方法。
6.性能考虑
6.1避免在循环中创建不必要的对象。
6.2使用有效的数据结构和算法来优化性能。
7.安全性
7.1避免暴露敏感信息,例如使用密码或其他关键数据作为变量名或日志输出。
7.2遵循最佳安全实践,例如避免使用不安全的API。
8.版本控制
8.1为每次提交添加有意义的提交信息。
8.2避免频繁的小型提交,合理地组织和合并代码变更。
9.代码复用
9.1鼓励使用设计模式和库来提高代码的复用性。
9.2避免重复代码,如果发现重复,应该将其抽取为公共的方法或类。
10.测试
10.1编写单元测试和集成测试来验证代码的正确性。
10.2测试应该覆盖主要的功能和边界条件。
11.代码审查
11.1定期进行代码审查,以确保代码遵循规范,并提供改进的机会。
12.遵循框架和语言的最佳实践
12.1遵循所使用的编程语言和框架的最佳实践,例如Spring框架的IoC和AOP的使用。
我们项目学生信息管理系统中的代码规范
上述代码片段在代码规范方面有待改进的地方,以下是一些建议,以提高代码的可读性和一致性:
1.缩进和空格
1.1代码应该保持一致的缩进风格,这里推荐使用4个空格作为标准缩进。
1.2在操作符(如逗号、点号、括号)前后应保持适当的空格,以提高代码的可读性。
2.命名规范
2.1变量和方法的命名应具有描述性,避免使用简写和模糊的词汇。
2.2类名应使用大驼峰命名法(CamelCase),变量和方法名应使用小驼峰命名法(camelCase)。
3.注释
3.1代码中的注释应简洁明了,对复杂的逻辑或关键代码段进行解释。
3.2避免在注释中出现无意义的内容,如“//获取成绩列表”应替换为更具体的描述,例如“//根据用户角色获取相关成绩列表”。
4.代码结构
4.1方法应尽量保持简短,如果一个方法的行数过多,应考虑将其拆分为多个方法。
4.2遵循单一职责原则,确保每个方法只完成一项任务。
5.异常处理
5.1应当对可能出现异常的代码进行适当的异常捕获和处理。
5.2避免在代码中出现裸露的异常抛出,应使用适当的异常处理策略。
6.代码格式化
6.1代码应遵循一致的格式化标准,例如,每行代码的长度不宜超过80-120个字符。
6.2对于长表达式和复杂语句,应适当使用括号和换行来提高代码的可读性。
7.安全性和性能
7.1避免在代码中硬编码敏感信息,如数据库密码、API密钥等。
7.2考虑代码的性能,优化查询语句和数据处理逻辑。
8.遵循框架规范
8.1如果使用了特定的框架,如Spring Boot,应遵循该框架的最佳实践和规范。
9.测试代码
9.1编写单元测试来验证代码的正确性,确保每个功能点都有相应的测试用例覆盖。
通过上述建议,可以提升代码的整体质量,使其更加规范、易读和易于维护。如后续还有其他的代码规范还可以根据常规的代码规范进行增加,对于后续工作有助于团队协作,也有利于代码的长期发展和维护。
问题2:参考附录中所给的模板,设计本小组项目的“代码复审核查表”
代码复核审查表模板
代码片段
/**
* 获取成绩列表
*/
// @Anonymous
@GetMapping("/list")
@PreAuthorize("@ss.hasPermi('system:score:list')")
public TableDataInfo list(long pageNum , long pageSize)
{
//获取当前用户包含的角色
List<String> roles = getLoginUser().getUser().getRoles().stream().map(item -> item.getRoleKey()).collect(Collectors.toList());
//判断是否为学生
boolean includesStudent = roles.stream().anyMatch(s -> s.equals("student"));
QueryWrapper<StuScores> queryWrapper = new QueryWrapper<>();
queryWrapper.like(includesStudent, "student_id", getUserId());
//分頁器
Page<StuScores> stuScoresPage = scoreService.page(new Page<>(pageNum, pageSize), queryWrapper);
return getDataTable(stuScoresPage.getRecords()).setTotal(stuScoresPage.getTotal());
}
概要部分
代码符合需求和规格说明么?
是的,根据提供的代码片段,该list方法实现了获取成绩列表的功能,符合获取成绩列表的需求,并且使用了@PreAuthorize注解进行权限校验,符合规格说明。
代码设计是否考虑周全?
代码中考虑了用户的角色权限,特别是学生角色的处理,但未显示处理其他角色的逻辑,可能需要更全面的角色权限考虑。此外,对于错误处理和异常情况未给出明确代码,需要进一步完善。
代码可读性如何?
代码可读性较好,变量命名合理,逻辑关系清晰,使用了流式编程和Lambda表达式,使得代码简洁。
代码容易维护么?
代码结构清晰,但缺少必要的注释,尤其是业务逻辑和复杂操作部分,这可能会影响代码的可维护性。
代码的每一行都执行并检查过了吗?
从代码片段无法判断每行代码是否都经过执行和检查,这通常需要在实际环境中进行单元测试或集成测试来验证。
设计规范部分
设计是否遵从已知的设计模式或项目中常用的模式?
代码使用了Spring Security的@PreAuthorize注解进行权限控制,这是一种常见的安全设计模式。除此之外,没有明显使用其他设计模式。
有没有硬编码或字符串/数字等存在?
代码中没有明显的硬编码字符串或数字,但需要注意在配置文件或常量类中是否存在硬编码的情况。
代码有没有依赖于某一平台,是否会影响将来的移植?
代码看起来是Java编写的,依赖于Spring框架,这可能会影响到非Spring环境的移植性。但考虑到现代Java应用普遍使用Spring,这种依赖性相对普遍。
开发者新写的代码能否用已有的ubrary/sDK/Framework中的功能实现?
代码使用了Spring框架的注解和分页功能,这是利用已有框架功能的一个例子。但具体到其他功能,需要具体分析是否有现成的库或框架可以使用。
有没有无用的代码可以清除?
从提供的代码片段来看,没有明显的无用代码。但整个项目中可能存在冗余或未使用的代码,需要进行代码清理。
具体代码部分
有没有对错误进行处理?
代码中没有显示错误处理逻辑,如服务层调用失败、数据库查询错误等。
参数传递有无错误,字符串的长度是字节的长度还是字符的长度?
参数传递看起来没有问题,但字符串长度的处理依赖于QueryWrapper的实现,需要确保它正确处理了字符长度。
边界条件是如何处理的?
代码中没有显示处理边界条件的逻辑,如分页参数为0或负数的情况。
效能
代码的效能(Performance)如何?
代码使用了分页查询,这在处理大量数据时有助于提高性能。但具体的性能还取决于数据库结构、索引、数据量等因素。
代码中,特别是循环中是否有明显可优化的部分?
代码中没有明显的循环,所以无法判断循环中是否有可优化的部分。
对于系统和网络的调用是否会超时?如何处理?
代码中没有显示处理超时的情况,通常这种处理会在服务层或配置文件中进行。
可读性
代码可读性较好,但注释不足,尤其是业务逻辑部分需要添加必要的注释。
可测试性
代码是否需要更新或创建新的单元测试?
是的,为了确保代码的正确性和稳定性,需要编写相应的单元测试,特别是针对权限校验、分页查询等关键功能。
有没有使用断言(Assert)来保证我们认为不变的条件真的得到满足?
代码中没有显示使用断言,但在单元测试中应使用断言来验证代码的正确性。
对资源的利用,是在哪里申请,在哪里释放的?
代码中没有显示资源申请和释放的逻辑,但通常这些操作会在服务层或框架中自动处理。
数据结构中有没有用不到的元素?
从提供的代码片段无法判断数据结构中是否有用不到的元素,需要具体分析整个项目的数据结构。
问题3:运用“代码复审核查表”,回顾本小组项目这段代码
a 确认代码是否容易理解?
b 是否符合代码规范?
c 代码是否正确?
d 对于各种边界情况能否正确处理?
以下是根据小组项目中的实际例子来重现上述问题:
1、代码覆盖率对于“应该写但是没有写的代码”无能为力
例子:假设在小组项目中,我们有一个类负责处理文件操作。其中有一个方法用于打开文件并读取内容。在编写测试用例时,我们确保了当文件存在且可读时,这个方法能够正确执行。但是,我们忘记了编写处理文件不存在或没有读取权限的情况的测试用例。
问题:尽管代码覆盖率报告可能显示这个方法已经被测试覆盖,但实际上,对于文件不存在或权限不足的情况,代码并没有进行任何处理,这可能导致运行时错误。
解决方案:除了正常的文件读取测试外,还需要编写针对异常情况的测试用例,确保代码能够优雅地处理这些错误情况。
2、代码中有效能问题
例子:在小组项目中,我们实现了一个算法用于大数据集的处理。在单元测试中,我们验证了算法的正确性,即它总是返回正确的结果。但是,在实际使用中,用户反馈算法执行速度非常慢。
问题:尽管代码执行了并且返回了正确的结果,但其效率非常低,可能是因为算法的时间复杂度过高,或者没有使用合适的数据结构。
解决方案:除了正确性测试外,还需要对算法的性能进行测试。可以使用性能测试工具或编写专门的性能测试用例来评估算法的执行时间、内存消耗等。同时,可以考虑优化算法和数据结构来提高效率。
3、多线程环境中的同步问题
例子:在小组项目中,我们实现了一个多线程的服务器,用于处理多个客户端的请求。每个请求都会创建一个新的线程来处理。服务器内部有一个共享的资源(如计数器),用于记录已处理的请求数量。
问题:在多线程环境中,如果没有正确的同步机制,可能会导致共享资源的访问冲突,从而引发数据不一致或其他不可预测的行为。例如,两个线程可能同时读取和修改计数器,导致计数不准确。
解决方案:在访问共享资源时,需要使用适当的同步机制,如互斥锁(mutex)、读写锁(read-write lock)或原子操作(atomic operation)等。同时,需要编写针对多线程环境的测试用例,确保在并发访问下,共享资源的访问是安全和正确的。可以使用多线程测试框架或手动创建多线程环境来模拟并发请求,并验证共享资源的状态是否符合预期。
作业2
(临近结课时再做)