班级地址:2021春季软件工程 (罗杰 任健)
项目地址:2021_alige_homeworks / pair_works / 2021_Yuxuan_Wu-Yuhao_Yan_pair_work
结对成员:严宇皓 3201 吴昱宣 3256
结对编程照片:
结对编程感受
本次作业是我们第一次结对编程,和个人编程相比,区别还是比较明显的。
和个人编程相比,结对编程需要的结对成员在架构设计以及任务分工上有着共同的认识。由于本次任务设计思路较为明确,我们对于架构的设计很快达成了共识。同时,在设计过程中需要更加谨慎,如果因为设计的问题导致部分代码需要重构,很可能会影响另一成员已完成的代码,造成不良的连锁反应。因此,在设计过程中对于“低耦合、高内聚”的要求更加严格。比较幸运的是,这次作业过程中我们没有大规模的重构,避免了很多麻烦。在实现的过程中,应该让自己的代码更容易让人读懂,如果写出的代码不能让结对的成员理解,在后续延拓、bug调试等环节就会造成很大的困难。因此,也要求我们具有良好的写注释的习惯。
在解决这些问题的前提下,结对编程有相当多的便利。首先,每个结对成员都可以发挥自己的长处,当遇到不明白的问题时,可以随时询问,节省了去论坛查询以及学习的很多时间成本。另外。每个人对于代码规范都有自己的理解,当然也存在不足,结对编程可以及时发现对方的不足,达到更好的代码风格。最重要的一点,结对编程五一减小了工作量。我们每个人只需要分工实现各自的模块,总的工作量有了显著的减少。
设计与实现思路
目录中包含的信息有名称、创建时间、最后修改时间、包含的目录、大小等,显然目录应设计为一个独立的类,同时各级目录采用树形结构存储。在经过讨论之后,我们认为目录和文件具有明显的不同的特征,同时对于一条指令来说,我们能够很容易区分它是对于目录的指令还是文件的指令。因此,我们将它们设计为不同的类,并且没有让它们继承统一的父类。目录中包含的方法有构造方法以及各属性的获取方法,同时有递归获取大小的方法。为了保护属性不会被轻易改变,我们没有设计属性的Setter。对于子目录和包含文件,我们采取HashMap来存储,通过名称(String)访问。同时,我们增加了切换目录的方法,处理当目录名为"."或".."的特殊情况,同时我们让根目录的父目录指向自身,减少了特判。
在文件系统中,包含对于目录的操作以及对于文件的操作。我们模拟真实的文件系统,为文件系统类增加了一个当前目录的属性。对于任何关于目录的操作,我们的程序都会模拟操作系统真实的行为:将当前目录切换到待操作的目录、执行操作、返回原目录。在操作的过程中,当前目录属性的引用不断切换,但引用的内容不会改变,因此保证了操作的安全性。
文件部分较为简单,文件类记录了其内容、路径、文件名等基本信息,并提供修改、计算大小等的方法。
在文件系统各方法的实现过程中,我们经常需要对字符串的处理,这些方法显然不应属于我们之前设计的任何一个类,因此我们创建了一个工具类,包含所有解析文件路径以及处理字符串的方法。
UML类图:
模块开发时间
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 330 | 720 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 20 | 10 |
· Design Spec | · 生成设计文档 | 0 | 0 |
· Design Review | · 设计复审 (和同事审核设计文档) | 0 | 0 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 3 | 5 |
· Design | · 具体设计 | 5 | 10 |
· Coding | · 具体编码 | 210 | 480 |
· Code Review | · 代码复审 | 60 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 240 |
Reporting | 报告 | ||
· Test Report | · 测试报告 | 3 | 2 |
· Size Measurement | · 计算工作量 | 0 | 0 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 5 | 5 |
合计 | 366 | 782 |