这个作业属于哪个班级 | 2021春季软件工程 (罗杰 任健) |
项目地址 | 2021_alige_homeworks / pair_works / 2021_Yuxuan_Wu-Yuhao_Yan_pair_work |
结对成员 | 严宇皓 3201 吴昱宣 3256 |
结对编程感受
本次作业是我们第二次结对编程,在设计和调试的整体难度上都比原来大了很多。
由于上一次的部分架构已经不能够很好地完成本次作业,因此对部分类的架构进行了小规模的重构(例如File
类和Folder
类)。好在整体架构还可以沿用,因此并无大规模的重构。
本次作业有些方法并不是那么容易实现,因此,集思广益就显得尤为重要。本次作业中,如果是单人编程,某些方法的实现过程估计会困难得多。同时,结对编程十分有利于发现互相的bug。本次结对作业中,我们就在编程的过程中发现了一些bug,降低了debug过程的负担。尤其是逻辑较为复杂的mv
和cp
等操作,能够明显地感觉到在结对的情况下逻辑清晰很多。
本次结对线下以明确架构为主,部分比较复杂的操作也共同实现。总的来说还是线上交流居多(基本都是关于修bug的交流)。
另外,单就本次作业来说,虽然我们一开始讨论过很长时间的设计问题,但是由于指导书被反复地进行修改,很多时候我们不得不推翻之前的编码重来。这就导致本次作业花费了很长的时间。
截图如下:
设计与扩展思路
本次作业在第一次结对编程作业的基础上,扩展了一些文件系统的功能,并且增加了和用户系统的交互。
用户系统的设计较为简单,对于User
类,存储的是用户名和所属的主用户组;对于Group
类,存储的是组名和用户名。需要注意的有以下两点:
- 对于异常类的抛出顺序,首先应注意判断操作是否支持(
root
用户和用户组不能被删除),然后判断是否有用户权限,最后判断对应用户(组)是否存在 - 和文件系统的交互问题。
AppRunner
的逻辑为先实例化文件系统再实例化用户系统,并且二者之间没有进行关联的操作。同时,AppRunner
不可修改。对于这个问题,我们采用的方法是设置一个调度器Manager
,在文件系统中,该调度器为static
,然后用户系统实例化时管理该调度器,就可以确保二者共享同一调度器。在交互时,通过设计调度器中的方法即可实现文件系统与用户系统数据的交互。
对于文件系统,本次作业主要扩展了两大类功能,一类是文件(目录)的复制,另一类是链接以及重定向。
对于文件(目录)的复制操作,必须实现对象的复制。对象复制包括浅拷贝和深拷贝,在本次作业中,文件(目录)的复制是复制一份与原来完全相同且无任何联系的对象,显然需要深拷贝。我们采用了序列化以及字节流的方式实现深拷贝。
文件系统的扩展是本次最为复杂的部分,实现相应需求所做的操作如下:
硬链接:为了实现硬链接,参考Linux的实现方式,我们将第一阶段中的文件和其存储的数据分离,抽象为一个新的Data
类,File
类只用于存储文件名和路径,而Data
类存储文件内容、修改时间等信息,这样就比较方便地实现了硬链接文件地同步。
软链接:软链接文件的Data
存储目标的绝对路径。除某些情况外,解析软链接时均会读取Data
中的路径进行重定向。
异常的处理:本次作业涉及到的异常非常之多,因此我们在编写代码时尽量遵循指导书的描述顺序进行分情况处理。
文件系统和用户系统的UML类图如图所示:
模块开发时间
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 5 | 5 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 20 | 60 |
· Design Spec | · 生成设计文档 | 0 | 0 |
· Design Review | · 设计复审 (和同事审核设计文档) | 0 | 0 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 3 | 3 |
· Design | · 具体设计 | 6 | 10 |
· Coding | · 具体编码 | 300 | 900 |
· Code Review | · 代码复审 | 6 | 10 |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | 300 |
Reporting | 报告 | ||
· Test Report | · 测试报告 | 3 | 5 |
· Size Measurement | · 计算工作量 | 0 | 0 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 3 | 7 |
合计 | 466 | 1300 |