本项目为SJTU CS3331软件工程的课程期末作业。
代码及相关功能、使用说明已公开发布于Github中:https://github.com/Luyu-Han/Tkinter-GUI-Application-for-Exchanging-Items
最初尝试
最初实现时,由于老师已明确提出相关功能要求,且我的编程习惯不是很好,便直接尝试对各个子功能进行实现。沿用了版本1中的物品增删改查等功能,并添加了用户的登录与注册功能(此时还未考虑管理员与普通用户的差异)。也对用户登录等功能进行了细化,比如密码位数与格式、用户名长度、再次输入确认密码等等。之后,分别对各个子系统进行了测试。
但在后期添加GUI与设计接口时出现了较大的问题。由于从未接触过数据库,最初均使用文本文档读取并存储数据的方式,涉及了较多的全局变量且信息较难通过接口在不同py文件中传递。此外,python的tkinter库有特定的用户指令与函数响应方式,了解之后才发现并非前期所想的“功能设计好后将界面设计插入”那么简单。为保证代码的模块化与模块独立性,很多功能需要打散后重新实现。
重新设计
初次尝试过程已经花费了七八小时左右,但此时陷入了较大困境,甚至一度以为无法实现预期功能。为了避免更多时间精力的浪费,选择从头开始整理面向对象的设计思路。
首先,绘制了初版的用例图与针对各个用例的顺序图。之后,因为缺乏软件工程实战经验,先对github中公开的软件进行了学习,明确了其中实体类、边界类、控制类分别的组织与实现方式。最后,确定了具体要划分几个文件进行逻辑清晰的实现,每个文件中包含哪几个类以及每类的属性与方法。
此时,对比初次尝试时的走一步算一步,思路已经清晰了很多,也更有了一些信心。
软件实现
考虑到文本文档读写的不便与后考虑GUI存在的问题,决定完全重构软件,而不再维护、拓展前期代码。
首先调研了一下python数据库和GUI常用库,最终选用tkinter、sqlite3实现。之后,搭建了登录与注册、用户主界面与系统主界面,设计函数接口、先填写在GUI指令响应位置。单元与子系统测试时,涉及到了存根程序的使用。最后,逐步实现各项功能,过程中深刻体会到了之前文件管理系统操作级别低所带来的额外工作量,虽是初学sqlite3管理数据库,但也感到使用非常便捷。
其中有很多细节。比如在登录、注册的每个环节设计返回上一步、退出按钮;为用户的不同操作错误设计针对性弹窗提示,并使用弹窗实现删除、添加等的最终确认;为添加物品、添加类别等均设置相应的信息列表展示功能,每一处有列表的界面又设置单条信息删除权限……这些内容上课时均有所涉及,但只有自己实现后再回想,才能感受到这些经验总结的正确性以及软件工程不断实践的必要性。
实现完成后又重新修改文档中的用例图、类图等等。这时发现很多分散实现的子功能都包含列表、删除等基本功能,各个数据库也存在共同操作。因此,又调整代码,设计抽象类与继承关系。
在功能展示前一天,我提前对各项功能进行了测试,但正式汇报时还是出现了一些问题。印象比较深的由两点。第一处是前一天漏检查的一项,是某个主要功能下的附带删除功能,未发现接口设计错误。究其原因,是未对测试的整个过程进行文档记录和复查。第二处是某处操作成功的提示仅限“一次性成功”:先成功一次、第二次添加出错时,提示信息完全对应;先出错再成功时,虽功能正确实现但提示仍报错。而前一天测试结果刚好正确。这也体现出了多角度设计测试用例的重要性,要考虑到各个功能间的组合作用。
总结
本次作业过程其实挺痛苦的,最终结果也不尽如人意,但回看时确实所获颇丰。“纸上得来终觉浅,绝知此事要躬行。”这次实践为未来再次进行软件开发或系统学习其它领域知识积累了宝贵的经验教训。
标签:功能,实现,GUI,添加,设计,我助,软件,final From: https://www.cnblogs.com/H-Luyu/p/17015161.html