首页 > 技术文章 > 软工结对编程 博客作业2

zxc3wyx 2021-04-02 00:23 原文

项目
内容
这个作业属于哪个班级 2021春季软件工程 (罗杰 任健)
项目地址 2021_alige_homeworks / pair_works / 2021_Yuxuan_Wu-Yuhao_Yan_pair_work
结对成员 严宇皓 3201 吴昱宣 3256

结对编程感受

​ 本次作业是我们第二次结对编程,在设计和调试的整体难度上都比原来大了很多。

​ 由于上一次的部分架构已经不能够很好地完成本次作业,因此对部分类的架构进行了小规模的重构(例如File类和Folder类)。好在整体架构还可以沿用,因此并无大规模的重构。

​ 本次作业有些方法并不是那么容易实现,因此,集思广益就显得尤为重要。本次作业中,如果是单人编程,某些方法的实现过程估计会困难得多。同时,结对编程十分有利于发现互相的bug。本次结对作业中,我们就在编程的过程中发现了一些bug,降低了debug过程的负担。尤其是逻辑较为复杂的mvcp等操作,能够明显地感觉到在结对的情况下逻辑清晰很多。

​ 本次结对线下以明确架构为主,部分比较复杂的操作也共同实现。总的来说还是线上交流居多(基本都是关于修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

推荐阅读