作者:飘零-遗忘_106 | 来源:互联网 | 2023-07-28 10:55
这几天我与范章木同学结对制作了一个简易的数学题目生成系统项目,以下是结对与协作的过程中我收获的感触。此次结对编程项目虽然基于个人项目,但经过几天的修改,最后成品几乎与个人项目无关,
这几天我与范章木同学结对制作了一个简易的数学题目生成系统项目,以下是结对与协作的过程中我收获的感触。
此次结对编程项目虽然基于个人项目,但经过几天的修改,最后成品几乎与个人项目无关,只保留了一点逻辑框架。
在此次结对编程项目中,为了满足项目需求,我重写了【题目生成模块】,给项目并加入了【短信发送模块】和【答题模块】。因为个人项目所作的UI过于小气,不易扩展更多功能,我与范章木同学一同又重写了所有的【UI界面】。
最终的项目可简单分为:用户管理模块,题目生成模块,短信发送模块,UI界面模块,数据库管理模块,分别由User、Question、SmsControl、UI、DBControl几个类负责。
题目生成模块
在个人项目中我简单实现了在可算约束下的题目随机生成,生成效果符合需要但方法不对,最后需求答案时很难计算,于是我直接重写了题目生成模块。
新的题目生成模块中将每个计算单独作为一个对象使用,每个符号运算对应着一个类,这些符号运算类都有一个共同父类Calculate,其规定了必须实现的多态方法。
每个符号运算类必须实现getValue()和getString()两种方法,在实际实现中,每个类内部有相应数量个Calculate成员变量指向其他符号运算。
当需要得到答案值或者式子,便从最表层开始从外向内递归调用相应函数,在每个对象内部组合传出,最终得到具体的式子。每个符号运算类都有着自己独有的实现方式,但他们的接口总是相同的,可扩展性很高。
最开始编写的过程不是十分顺利,很多需要额外规定的细节都需要被先行考虑。我又重回到设计上,定下各种细节,最终实现了模块。
因此编写一个大的内容之前需要确定的:
1、使用的体系结构
2、各种细节约定
短信发送模块
为调用短信发送模块的API,需要安装平台的SDK。但麻烦的是平台给出的可下载的SDK存在各种依赖问题,在多次尝试未果后,我决定将整个项目移到Maven,再学习Maven的使用。
Maven通过 POM.html 文件控制依赖的安装,让SDK的安装变得较为容易,最后数据库的依赖jar也通过pom文件解决。
答题模块
答题模块在完成题目生成模块之后只需要实现相应的逻辑和UI。在这里实现了三个大步骤:答题,答题确认和答题结果。
答题需要通过元素对象的传递来实现面板和内部内容的更新,swing的这些麻烦点这让我体会到了网页html、js、css配合的优越性。
答题确认和答题结果界面基本相同,不同点是需要通过不同元素的提示来提醒一些操作。
UI界面
在写完答题模块后,我动刀重写了主界面的UI。主界面功能较多,但看起来必须整齐整洁不乱。
重写后出现了一个比较严重的问题,虽然重写后的新版界面虽然美观大方,但配合其他界面显得格格不入,风格上有极大不同,其他地方的界面急需翻新,最终我们将所有界面都重写更换成了统一的风格。
但最后回过头看,其实我们UI界面在编写上是很有问题的:
1、我们把所有的界面都放在了UI类中,使得UI类作为单独一个类而言十分庞大,虽然各个界面基本没有耦合,但代码整体排布确实不是那么清晰。
2、没有将复用的代码用类或者类方法的方式合并。在UI类中,代码重复率高得惊人,但整体复用程度不高,有些惯用面板、属性原本可以直接包装以便复用。最终使得UI代码虽然逻辑很清晰方便修改,但过于冗长,光是一个类就达到了2000+行。而且这最终导致实现UI中的部分刷新十分困难。
更多细节
后期又编码加上了更多细节。
例如:鼠标在可用元素上出现的元素变化(提示),鼠标在可用元素上按下的提示,面板大小调整等等。这些细节确实使得整体体验提升了不少。
沟通和注释
在结对编程项目中,我意识到沟通对于一个项目顺利高效率实现的重要性,总结了以下经验:
1、一开始就沟通交流明确各个接口的用途、要实现的具体功能及其具体流程。
2、一定要编写低耦合高内聚的代码。
3、要给行为较为怪异的代码段编写注释防止误解。