组内成员博客链接:https://blog.csdn.net/weixin_41709195/article/details/86515191
核心代码仓库链接:https://github.com/Archie7777/Arithmetic-Problems
图形界面程序代码仓库链接:https://github.com/Archie7777/Shitty-Game
一、用时记录
PSP | Personal Software Process Stages | 计划用时(min) | 实际用时(min) |
---|---|---|---|
PLANNING | 计划 | - | - |
----estimate | 估计这个任务需要多长时间 | 10 | 10 |
DEVELOPMENT | 开发 | - | - |
----analysis | 需求分析(包括学习新技术) | 120 | 200 |
----design spec | 生成设计文档 | 60 | 80 |
----design review | 设计复审(和同事审核设计文档) | 30 | 20 |
----coding standard | 代码规范(为目前的开发制定合适的规范) | 10 | 10 |
----design | 具体设计 | 20 | 60 |
----coding | 具体编码 | 600 | 600 |
----code review | 代码复审 | 300 | 300 |
----test | 测试(自我测试,修改代码,提交修改) | 120 | 200 |
REPORTING | 报告 | ||
test report | 测试报告 | 20 | 60 |
size measurement | 计算工作量 | 10 | 10 |
postmortem & process improvement plan | 事后总结,并提出过程改进计划 | 180 | 100 |
合计 | 1480 | 1650 |
二、开发环境
IDE:Visual Studio 2017
语言:C#
操作系统: windows10
三、组内分工&开发过程
我设计及编码基础的数据结构以及图形界面部分。
另一个成员实现表达式生成部分。
开发过程
- 我们共同制定了一个代码标准,为方便队员读懂他人代码。
- 我们进行了详细的需求分析,并进行了概要设计。
- 组内分工,并进行详细设计。
- 编码并整合。
- 编写图形界面。
四、设计思路概要
因为要生成表达式,所以最好的先生成一颗表达式树,通过这颗表达式树,可以完成对表达式的求值,以及中序表达式的生成。
因为涉及到真分数和整数的运算,所以我设计了一个Number类,统一进行数字的运算。
然后,通过一个Expression类将所有表达式操作封装。
最后,通过一个ArgumentParser类分析cmd参数,进行控制。
总的生成过程为:随机生成一棵树,树的叶节点随机生成Number类,非叶节点随机生成Expression类。
用户输入答案判定对错部分,只需比较用户输入的String和已经保存的答案(一个Number实例)的String是否相等即可。
项目所有的类(不包括GUI部分):
-
Number(数字及数字运算)——我
-
Operator(运算符)——我
-
Expression(生成表达式)——我&队友
-
ArgumentParser(分析参数)——队友
-
Program(入口类)——队友
五、详细设计思路(不包括队友分工部分)
4.1 Number类
Number类的想法是,通过将整数看作分母为一的分数,来统一真分数和整数的运算。
当数字的分母为1时,则只输出分子,这样在外部看来,整数还是整数,分数还是分数。但实际上整数与整数之间运算还是需要通分之类的分数操作的。
同时,将Number与Number之间的运算进行了运算符重载,并将防止除零的代码封装进Number类中。
还有Number类的格式化打印等操作也被统一封装。
4.2 Operator类
Operator类很简单,一个实例保存一种运算符,可以进行格式化打印输出等操作。目的是保存随机生成的运算符。
4.3 Problem类
在完成Expression类之前,我写了一个简单的生成表达式的版本,Problem类。这个类通过随机生成一颗极限深度为3的树来生成表达式。
因为是简单版本,所以代码混乱,功能不齐全,主要是提供思路,后经过组内另一个成员的代码重构,形成了现在的Expression类的版本,新版本代码思路清晰,功能更加齐全,封装更加完善。
4.4 GUI
GUI很简单,通过C#的所见即所得编程模式和网络上的查阅资料很容易就写出了图形界面。
GUI中新增加的历史纪录功能并没有利用数据库,而是求简单,在本地创建了文件。
六、项目心得
首先,这是我第一次与别人通过代码托管共同完成一个小项目,我熟悉了软件开发设计的过程,深刻理解了软件设计、代码质量的重要性。一个好的项目,需要有好的软件设计思路作为基础,以及好的代码规范作为工具。
同样,我明白了小组分工合理的重要性,组内成员的配合很大程度上影响了项目的开发进度,以及软件质量。