2021软件工程结对作业——第二阶段
2021软件工程结对作业——第二阶段
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 2021-春 软件工程(罗杰 任健) |
这个作业的GitLab项目地址 | 2021年软工结对作业-第二阶段 |
结对同学的学号后四位 | 3204 3197 |
我在这个课程的目标是 | 在结对项目和多人团队项目中,更加系统地学习软件开发,培养工程化的思维 |
这个作业在哪个具体方面帮助我实现目标 | 参与到结对作业中,体会结对编程 |
结对编程感受
基于第一次结对编程的经验上,我们知道如果将代码分割成独立两个部分由两个人分别编码,会导致编程出现风格不一致以及难以协调的规范问题。所以我们这次编程依旧采取了由代码能力高的那位进行编码,这个过程中,另外一位同学考虑细节问题,并对编码进行复审和测试。
综合我们自己对于感受的交流,在第一阶段的基础上,第二阶段能更明显感受到结对编程的一些优势:
- 结对编程对于问题的思考有着更全面的考量。个人感觉这次作业,如果一个人来解决,很难做到方方面面考虑周全。
- 结对编程带来良好的代码规范,这次因为上次代码规范比较良好,所以无论是复审者还是写代码的人都可以很快的了解代码的逻辑
再回到个人感受。不得不说结对编程效率比较高,但是这周的作业无论是代码量还是理解难度都比较高,所以一周的时间大部分都花在这上面了,这个时候反而对结对编程感受得更多的是累了。另外一方面就是,这次作业歧义的地方实在太多,队友之间难免会产生争执,这种争执我认为是不应该在结对编程中体验的,有争执更多的应该是实现上方法的理解,对题目正确的理解,而不是对模棱两可的问题的争执,两边都有道理。
程序设计和实现思路
第二阶段的要求是在第一阶段实现的基于内存管理的文件系统上迭代开发,加入了用户系统的管理,并增加了一些关于文件系统的函数。对此我们总体上分为两个系统:文件系统(这里需要添加新的指令),用户系统(全新的一个系统)。文件系统主要涉及了软硬连接、文件拷贝移动的问题以及用户的绑定,用户系统则是涉及用户创建和管理等功能的实现,实现思路和改进如下:
总体设计:
- 因为涉及两个系统的交互功能,这里采用了创建一个类Manager,并通过单例模式去绑定对应的两个系统,manger作为一个中介,双向提供服务,实现两个系统的交互。
- MyUserSystem类(官方接口实现类):
- 一个currentUser管理当前用户
- 一个savedDir,用于由root用户切出去时保存的路径
- 两个HashMap,分别用来管理此系统中存在的用户与用户组
- 对应的设计两个类:User管理用户,Group管理用户组
- 对于每个官方的创建指令(如addUser,addGroup)指令,先要对命名的正确性进行判断
- User类:
- 用户的基本信息:名字,主用户组
- 一个HashMap管理与该用户关联的所有用户组
- 下属管理方法,实现用户组关联与取消关联等功能
- Group类:
- 用户组基本信息:名字
- 一个HashMap管理与该用户组关联的所有用户
- 下属管理方法,实现用户组关联与取消关联等功能
- SoftLink类(extend File类):
- 标志为软连接文件,存放target的绝对路径
- 重写getSize方法
- HardLink类(extend File类):
- 标志为硬链接文件,存放target的文件
- 重写对应的getSize,setContens等方法,实现硬链接对应的功能
- Exception类的扩充:从上次的单一Exception扩充到如今的user相关的存在,非法,权限非法等异常,以及文件系统相关的存在,非法,以及软连接失效的异常
- 因为加入了软硬连接,所以对原先指令,进行了一定的修改,主要体现在,遇到软连接的时候,先判链接失效问题,然后对应的就直接重定向到对应路径中;硬链接不存在失效问题,所以直接对targetFile的路径进行重定向(针对具体不需要重定向的指令不进行重定向相关的修改)
- info 的修改思路,加入了新的显示成员,重写了对应软硬连接的方法,以及用户信息的引入(主要通过Manager进行交互完成)
回到新增一个指令的实现思路:
- ln -s
- 根据指导书所说对srcpath以及dstpath的分类进行情况讨论。主要涉及了对路径的分析
- 新建软连接主要就是存放链接的路径
- ln
- 根据指导书所说对srcpath以及dstpath的分类进行情况讨论。这里主要就是确定硬链接只能连接到一个文件上。
- 新建硬连接主要就是存放对应链接文件的引用(File)
- mv
- 根据指导书所说对srcpath以及dstpath的分类进行情况讨论。这里主要就是思考好修改的成员问题,如需要给dstPath改名吗,需要修改dstPath的修改时间吗
- 如果移动一个目录的时候,需要递归的修改其下文件的路径(即文件树结构)
- cp
- 根据指导书所说对srcpath以及dstpath的分类进行情况讨论。cp不同于mv,我们要新创一个对象(mv可以直接引用原先的对象),且注意深浅拷贝的问题
- 如果拷贝一个目录的时候,需要递归的修改其下文件的路径(即文件树结构)
- readlink
- 该指令只限制于软连接
- 需要判断软连接是否有效
- su
- 判断用户权限,即只能在root下进行
- username不能为root
- 切换用户,且保存当前指令
- exit
- 判断用户权限,即不能在root下进行
- 退出当前用户,回到保存路径,如果回不去就回到根目录
- whoami
- 根据当前curren返回用户
- useradd
- 判断用户权限,即只能在root下进行
- username不能为root
- 判断用户是否存在以及名字合法性
- 添加用户,并根据有无主组创建与主组的关系
- usermod
- 判断用户权限,即只能在root下进行
- username,groupname不能为root
- 判断用户是否存在
- 判断组是否存在
- 将用户加入组内
- userdel
- 判断用户权限,即只能在root下进行
- username不能为root
- 判断用户是否存在
- 获取对应主组信息查看是否为空
- 删除用户并对于的接触与之相关的用户组关系
- groupadd
- 判断用户权限,即只能在root下进行
- groupname不能为root
- 判断用户组是否存在以及名字合法性
- 添加用户组
- groupdel
- 判断用户权限,即只能在root下进行
- groupname不能为root
- 判断用户组是否存在
PSP表格填写
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 10 |
.Estimate | 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | 1800 | 1690 |
.Analysis | 需求分析 (包括学习新技术) | 60 | 10 |
.Design Spec | 生成设计文档 | 90 | 60 |
.Design Review | 设计复审 (和同事审核设计文档) | 90 | 60 |
.Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
.Design | 具体设计 | 120 | 150 |
.Coding | 具体编码 | 720 | 760 |
.Code Review | 代码复审 | 90 | 120 |
.Test | 测试(自我测试,修改代码,提交修改) | 600 | 500 |
Reporting | 报告 | 110 | 85 |
.Test Report | 测试报告 | 60 | 60 |
.Size Measurement | 计算工作量 | 30 | 5 |
.Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | 20 |
合计 | 1920 | 1785 |