BUAA_OO_Unit4总结

目录

本单元所实践的正向建模与开发

正向建模与开发是一种自上而下、从抽象到具体的设计方法,其核心思想是从需求出发,通过一系列步骤,最终形成可执行的系统或软件。在本单元三次作业中,我采取了正向建模的开发方式,即,先绘制UML类图,设计好程序的整体架构,然后再用代码实现,并在写代码的过程中不断反思、修改架构设计的细节,最终高效地完成了任务。通过正向建模与开发,实现代码过程中架构混乱、反复修改的情况得以有效减少。

本单元作业的架构设计

三次作业完成后,代码的UML类图如下:
在这里插入图片描述

代码中设计实现了如下几个类:

  1. Main:程序入口;
  2. LibraryManager:既是管理类,也是业务类。读入各类指令,并通过协调管理BookShelf、AppointOffice等来处理指令。同时,也负责开闭馆后的整理工作;
  3. BookShelf、BookDrift、AppointOffice、BorrowAndReturn:分别对应书架、漂流角、预约处、借还处,向LibraryManager提供了执行相应功能的接口;
  4. User:顾客,对外提供了查询顾客ID、借书日期、借书期限等信息的接口;
  5. ReservePair:把书、书送到预约处的日期、预约者包装到一起,便于判断取书是否逾期等。

通过对比可以看出,最终的代码设计和UML模型设计有着紧密的对应关系。

四个单元中架构设计思维的演进

第一单元:层次化结构化设计,递归下降
第一单元涉及到了语法分析、词法分析,具体则对应到代码中的表达式解析、项解析、因子解析这三层结构。第一单元涉及到了大量递归调用,例如,因子包含了"(表示式)"这种形式,因此,这种层次化的设计对于简化问题十分重要。层次化设计,递归下降、逐层调用的设计思想给了我很大启发,受益匪浅。

第二单元:多线程编程,互斥与同步
第二单元的主题是多线程。许多崭新的、陌生的概念出现在我眼前,带给了我很多疑问,什么是线程?什么是锁?什么是互斥访问?…通过这一单元的学习,我领会到了多线程编程中的一些基本思想:首先要明确哪些数据是共享数据,以及这些共享数据对哪些线程开放,然后,再通过对不同线程中访问了这些共享数据的语句块上锁的方式来实现安全访问。进一步地,我们也可以考虑将共享数据与线程行为分离,即,将共享数据单独提出来作为一个类,对访问该共享数据类的线程提供线程安全的访问方法。

第三单元:JML规格化设计
第三单元要求我们对照JML规格实现相应的类,代码的整体架构已经通过JML限制好了。JML的出现是为了严谨地描述一个类的属性和行为,因此,对照着JML写代码就好比照着设计图搭积木,符合要求是第一目标。这个单元的主要挑战是:在整体架构不变的前提下,既要满足规范约束,又要尽量减少时间复杂度。因此,选择什么容器、什么算法是至关重要的。

第四单元:正向设计,UML建模
在第四单元中,我真正采用了先画UML草图、再实现代码的开发方式。“建筑师在建房以前,已经在自己头脑中把它建成了”——在我的理解中,正向设计正是指这样一个从概念设计到实践的过程,UML类图正是“概念设计”的载体。

四个单元中测试思维的演进

第一单元主要采取了黑箱测试、压力测试,以及手动捏造特殊数据等方法进行测试,当出现错误时,再根据错误数据对照代码逐步分析;
第二单元依然通过随机生成大量数据等方法进行测试。值得注意的是,由于多线程的不稳定性,debug时可以采取延长线程sleep时间等方式复现错误结果,放大程序中的bug;
第三单元则是根据JML规格编写Junit测试方法,对于各类方法的测试更全面细致;
第四单元的测试手段和一、二单元基本一致,基本思路依然是先捏造大量数据,找到导致错误的数据,对照运行结果查看问题所在。

我的课程收获

  • 编写代码前要考虑好整体结构,画出草图,这样在具体实现时才能事半功倍;
  • 层次化、模块化、结构化对于提高编程效率、提升代码质量至关重要。我们要努力培养结构明了、精简优雅的代码风格;
  • 数据测试十分重要,没有经过大量测试的程序不可靠,面向数据编程才能利于“不败之地”;
  • 要善于利用不同工具debug,保持耐心、追根溯源,一定能“水落石出”;
  • 程序设计能力、编程能力明显增强。先有坎坷,才有进步。
  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值