软件工程结对作业——第二阶段
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 2021春季软件工程 |
这个作业对应的GitLab项目地址 | 软件工程结对作业 |
学号后四位 | 3439和3358 |
设计思路
第二阶段作业在第一次作业的基础上扩展了文件系统,并新增加了用户系统。
文件系统
结构
文件系统在第一次的基础上新增加了两个类型的文件:软链接文件和硬链接文件。经分析可知,二者都是一种很特殊的文件,所以在第一次作业的基础上新创建了SoftLink
类和 HardLink
类,并继承于 File
类,三者类关系如图一所示:
其中由于软链接是一种通过链接路径来进行指向的文件,所以软链接中新增加pointPath
属性来保存所链接文件的路径;硬链接是一种指向某个具体文件的链接文件,所以在硬链接中新增加file
属性来记录其所指向的文件对象。
在实现过程中发现,第一次作业中用来查找一个路径对应的Dir
或File
对象在进行链接文件的重定向时会很难处理。我们分析发现是由于第一次作业实现中,并未将Dir
类和File
我们设计了 Dir
类和 File
类来分别实现对于一个目录和文件的抽象,并且两个类都继承了Entry
接口,同时对于软硬连接,我们分别创建了SoftLink
和HardLink
类,两个类都继承File
类,设计了MyFileSystem
类来实现指令对文件和目录的操作。UserSystem
类实现对用户的管理。同时对于两个System
创建一个manager
类,用来 两个系统之间的沟通。
主要操作实现
文件系统中的操作主要分为两类:对目录的操作和的对文件的操作。
-
对目录的操作。对目录的操作重点是如何根据一个目录路径来查找该路径所对应的
Dir
对象,并在查找过程中对此路径的合法性进行判断。我们的实现是对路径提取出每一个目录的name
,并从根目录或当前目录进行递归查找,找到之后进行对目标目录进行创建、修改或删除等操作,未找到时根据指令来判断是否抛出异常和是否进行创建目录。 -
对于文件的操作。对文件的操作重点是如何根据一个路径查找到该路径所对应的
File
类对象,并在查找过程中对输入路径进行合法性判断。我们的实现是同目录的操作,首先提出路径中的每一个过程目录的name
,并从当前根目录或当前目录进行递归查找,当查找到最后一层目录之后,在其子文件中查找目标文件对象,找到之后,进行对文件的修改、删除等操作,未找到时根据指令来判断是否抛出异常和是否进行创建文件以及对文件写入内容。
Manager
类中操作基本都是Set
和Get
方法,用于两个类之间信息的获取,基本就是再一个System
中set
一个属性,然后在另一个里面get
,通过这种方式,让两个类之间可以信息交流 ,Manager
是采用单例模式实现的,这保证了两个System
访问的是同一个manager
用户系统
用户系统是第二次作业中新增加的系统,主要涉及到用户和用户组的增、删、改、查操作。
由于涉及到用户和用户组两种用户类型,我们设计了两个类:User
和UserGroup
分别表示用户和用户组。在MyUserSystem
中对用户进行增、删、改、查操作是很简单的操作。
通信
这次作业中需要在文件系统和用户系统建立联系:文件系统需要知道当前用户,用户系统需要在切换路径时进行路径的保存和恢复。同时二者还需要在公用一个当前指令的序号,并对此序号进行更新和读取。
我们参考了issue中的单例模式来解决此问题。我们创建了一个Manger
类来对进行通信,并在类中创建一个静态实例来保证文件系统和用户系统的交互的统一。
编程感受
3439
-
这次作业合作时,我们尝试了在宿舍进行结对编程的感受。我的宿舍内部有比较大的显示屏幕、舒适的凳子并且宿舍的桌子要比教室更加舒服。合作效果也还不错,但能够在宿舍进行结对的时间并不多,需要考虑到舍友的生活作息等因素,下次作业可以尽量选择在宿舍进行结对,毕竟宿舍的设施配置比教室配置舒服很多。
-
这次结对的效率比上次更高,在上次作业合作基础上,两人默契和习惯都已经相互熟悉,这次合作时,无论是讨论设计还是代码编写都有很大的进步和收获。但仍然有些不足需要进行磨合和调整。
3358
-
对于结对编程有了更加深入的理解,在这一次的编程过程中,由于难度比上次大了很多,导致有时候在方法实现上两个人的理解相差比较大,在一次次的讨论中我们逐渐找到了最符合语义的解决方法,这个过程是很有意义的,相当于为以后的工作做了些准备。
-
其次,也让我感受到了自己的一些不足,比如不够细致,调试的时候不够有耐心等等,希望下次能够做出改进。
现场照片
由于在宿舍结对时时间比较短,并未进行拍照(图四,当时找到bug,有点开心)。下面是在教室结对现场照片。
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 10 |
· Estimate | · 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | 660 | 870 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 20 |
· Design Spec | · 生成设计文档 | 30 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 20 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 60 | 60 |
· Coding | · 具体编码 | 360 | 480 |
· Code Review | · 代码复审 | 30 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | 180 |
Reporting | 报告 | 100 | 100 |
· Test Report | · 测试报告 | 60 | 60 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 20 |
合计 | 770 |