2021软件工程结对作业——第一阶段
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 2021-春 软件工程(罗杰 任健) |
这个作业的GitLab项目地址 | 2021年软工结对作业-第一阶段 |
结对同学的学号后四位 | 3204 3197 |
我在这个课程的目标是 | 在结对项目和多人团队项目中,更加系统地学习软件开发,培养工程化的思维 |
这个作业在哪个具体方面帮助我实现目标 | 参与到结对作业中,体会结对编程 |
结对编程感受
经过这几天的结对编程,对只在书上得到的结对编程的概念有了更进一步的体会。本次作业的要求是结对完成一个文件系统。从工作量来说,本次作业的工作量并不大,采用结对编程不像之前组队做数据库大作业那样每一个人都要去编写一部分的代码,反而结对编程的代码水平取决于两个人之间代码水平比较高的那位。总体来说,结对编程的感受有好有坏。
首先,不得不提到结对编程带来的良好体验:
- 效率提高。本次作业理论上是可以在规定时间内单人完成的,但是因为结对编程,提高了本次作业的完成效率,主要体现在:代码设计上,由两个人一起设计,对题目有各自的理解,在结对的时候可以交流意见;代码复审时的体现,一个人在写完代码之后由另外一个人进行复审,可以提高代码的正确性;单元测试覆盖更广,两个人一起设计单元测试,相比一个人设计,可以有更广的思考空间,可以覆盖更多的代码内容;结对编程的时候两个人互相监督,这个时候两个人都会处于精神集中的状态,做事效率提高。
- 代码规范。结对编程的代码不仅仅是要给编写的人看的,也要给复审的人看,所以结对编程订正了自己比较不成熟的代码命名习惯,以及高耦合的函数编写习惯。
- 促进交流。这个时候需要锻炼自己的表达能力,在与队友进行交流的时候,能够清楚表达自己的疑问,能清楚的解答一个问题。同时这个过程中也加深了队友之间的友谊。
其次,结对编程也有需要克服的不良体验。
- 结对编程需要调和两个人的时间。结对的时候,比较忌讳自己单干,所以整个项目大多时间两个人是在一起的,而两个人总有自己的事情需要做,所以共同时间需要提前商定好。
- 两个人进行磨合。这个时候需要两个人性格接近,双方要能够接受对方,需要一定的时间去磨合。所幸自己和队友磨合的不错,所花的时间比较少。
总体来说,结对编程锻炼了我们两个人多种能力,不单单是写代码的能力,还有协作交流能力,这些都是未来在就业中所不可或缺的(没有人能够独自完成一个大项目,需要学会与他人合作)。
程序设计和实现思路
本次的作业目标实现一个基于内存的文件系统。第一阶段的作业要求可以分为两个类一个是文件夹一个是文件,对此我们总体的设计上就是创建了文件类(File)和文件夹类(Directory)。
总体设计:
- MyFileSystem类(官方接口实现类):
- 一个根目录rootDir
- 一个currentDir管理当前路径
- 一个currentTime管理指令序号
- 实现每一个官方要求的方法,同时因为有些指令,如cd,mkdir可以复用,所以封装了一个新的方法来操作。对于官方的操作,每次调用官方方法都会将cureentTime++,而自己封装的方法就不需要修改currentTime
- 设计上,采用模拟实现的方法,我们会自己模拟一些行为,例如cd到某个目录中,并修改当前路径currentDir,所以每条指令开始前会保留开始时的路径并在出现异常或者正常返回的时候进行回退。
- 接上述设计,因为是模拟一些行为,所以会封装了cd,mkdir,enterFatherDir(用于进入到最后一个路径前的父路径之中,对创建文件和对文件的操作等都会用到这个思路)
- 对于每个官方指令,先要对路径的正确性进行判断(主要判断长度)
- File类:
- 文件的基本信息:内容、创建时间、修改时间、绝对路径、名字
- 下属管理方法,info——展示该文件的对应信息;appendContents——追加内容;catContents——输出内容。
- Directory类:
- 文件夹基本信息:创建时间、修改时间、绝对路径、名字
- 一个fatherDir父目录
- 下属两个Hashmap管理文件下下拥有的子目录、文件
- 一个isRoot用于判断是否为根目录。
- 下属方法:isValidName——判断文件夹名是否合法,ls——对应文件夹下展示所有文件,lookup——寻找对应的文件,info——展示文件夹的相关信息,createFile、reviseFile、removeSonFile——操作管理的文件
以上就是整体的设计思路,思路上秉承高内聚低耦合的实现只在对应的类下做对应的操作,从而方便debug以及迭代开发。
回到每一个指令的实现思路:
- cd
- 调用自己封装的函数cd
- 从path中拆分出每一个子目录,并确定开始的路径,修改currentDir开始进行模拟
- 不断在当前路径所含的子目录中进行查找,如果不存在抛出异常,遇到特殊字符"."、"..",模拟对应的行为
- mkdir
- 调用自己封装的函数mkdir
- 执行enterFathrtDir模拟行为,到最后一个路径前的一个路径,以此为父路径,新建新的文件夹,在此过程中捕获非法行为
- mkdir -p
- 先遍历路径,找出非法路径,这里考虑回退。
- 一旦存在为创建的路径,开始创建。
- rm -r
- 调用封装的cd函数,模拟行为,得到对应标准的路径,此时已进入到需要删除的路径中
- 判断该路径是否为根目录,是,无法删除抛出异常
- 判断是否尝试删除上机目录
- 将当前路径从其父路径的下属子目录中异常
- info
- 根据路径,模拟行为,进入到最文件夹的上级目录之中
- 在该目录中查寻其下是否存在该文件夹
- 调用对应的info函数,输出对应的信息
- ls
- 根据路径,模拟行为,进入到需要list的最终目录中
- 调用该目录的list方法,输出所有的路径
- touch
- 根据路径,模拟行为,进入到最终文件的上级目录之中
- 在上级目录中调用其createFile,检查重复性,新建文件加入到目录中。
- rm
- 根据路径,模拟行为,进入到最终文件的上级目录之中
- 在上级目录中调用其removeSonFile,检查重复性和存在性,删除该文件。
- cat
- 根据路径,模拟行为,进入到最终文件的上级目录之中
- 在上级目录中查找对应文件,检查重复性和存在性,调用该文件的cat函数。
- fwrite "
" - 根据路径,模拟行为,进入到最终文件的上级目录之中
- 在上级目录中查找对应文件,检查重复性和存在性,新建一个以content为内容的新文件。
- fappend "
" - 根据路径,模拟行为,进入到最终文件的上级目录之中
- 在上级目录中查找对应文件,检查重复性和存在性,找到对应文件,调用append函数。
- info
- 根据路径,模拟行为,进入到最终文件的上级目录之中
- 在上级目录中查找对应文件,检查重复性和存在性,找到对应文件,调用info函数。
PSP表格填写
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
.Estimate | 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 1380 | 1110 |
.Analysis | 需求分析 (包括学习新技术) | 60 | 30 |
.Design Spec | 生成设计文档 | 120 | 60 |
.Design Review | 设计复审 (和同事审核设计文档) | 30 | 120 |
.Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 30 |
.Design | 具体设计 | 60 | 60 |
.Coding | 具体编码 | 480 | 600 |
.Code Review | 代码复审 | 90 | 30 |
.Test | 测试(自我测试,修改代码,提交修改) | 480 | 180 |
Reporting | 报告 | 110 | 55 |
.Test Report | 测试报告 | 60 | 30 |
.Size Measurement | 计算工作量 | 30 | 5 |
.Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | 20 |
合计 | 1520 | 1195 |