【OO】第四单元总结

正向建模与开发

根据指导书给出的需求:

  1. 首先肯定需要有一个图书馆,图书馆承担着处理请求的任务,并需要记录所有图书、用户的信息。
  2. 图书馆里要有书架、借还处、预定处、用户以及之后作业引入的漂流角这些对象
    • 书籍就在这些对象之间流动,所以这些对象里需要一个装着书籍信息的容器。
    • 需要接收图书、移除图书的动作。参考实验课的提示,我让书架、借还处、预定处、漂流角都通过与图书馆通信来完成,而不直接互相通信,这样每个地方都抽象出来接收图书、移除图书的两个动作,可扩展性强。
  3. 由于预约处要保留预约信息,所以我额外设计了一个类,该类的每个对象存储一条预约信息

架构设计

第一次作业

  • 图书馆类下管理着一个书架、借还处、预定处以及所有书本、用户,对于每种请求都有对应的一个方法去处理
  • 书架、借还处、预定处、用户类中有一个管理图书的容器,并有相应的增删图书的方法。第一次作业我用的HashMap存储图书及其数量,也就是说每种图书的所有副本共用一个对象,value来记录副本数量,这样扩展性较差,后续作业有所修改
  • 不同位置不直接通信,而是通过图书馆来移动图书
  • 图书对象的一致性问题:由于每次读入的请求中的图书都是一个新的对象,但在书架、借还处、预定处、用户间流动的图书应该是图书馆里管理的图书,所以我用了一个checkBookId的方法,返回图书馆里的图书对象的引用。

1

第二次作业

根据新增加的需求:

  1. 增加了漂流角类,属性和方法与书架、借还处、预定处这些类似
  2. 图书馆里增加新请求类型的处理方法和整理图书的方法
  3. 新增加了图书借阅期限,所以官方包里的LibraryBookId无法满足需求,于是新建了一个继承自LibraryBookId的Book类,记录每本书的借还时间
  4. 图书管理容器的修改:由于第二次作业,每个图书副本可能会具有不同的属性,例如借阅次数、借阅日期、归还日期,所以原本的HashMap容器不能满足副本之间的差异管理,于是改用ArrayList,每个副本都对应一个图书对象。

2

第三次作业

第三次作业的需求较为简单,几乎不需要怎么动架构,只需要在用户类(即Student)里增加积分属性和相应的调整动作即可,然后根据指导书添加处理方法,在恰当的时候调整用户的积分即可,不过还是有一些细节需要注意:

  1. 积分有上限,这意味着不同的增、减顺序会导致积分结果不一样,最开始我忽略了这一点,不过改正也很简单,只要保证先减后增就行了
  2. 积分为负才不能借阅、预约,而不是非正,也是刚开始没注意的点

3

总结

架构设计思维的演进

第一单元表达式的架构设计是让我对面向过程和面向对象的两者区别有最深体会的时候,表达式处理所涉及到的递归下降和c语言里的递归函数很像,实验课给了一个很好的架构参考,让我对“递归”在面向对象里的应用有了具象化的认识。

第二单元电梯的设计学习到了多线程的相关知识,与同步进行的OS很多知识相呼应,让我对线程间通信、生产者-消费者这样的问题有了更深的印象,也帮助了我第四单元的架构设计。

第三单元的JML和第四单元的UML主要是对设计方面的训练,JML让我了解了规格化设计的过程,它很好的避免了二义性,并且给测试提供了思路。UML虽然作为一个单独的单元,但其实一直贯穿整个课程,每次作业之前都会画个粗略的类图帮助我理清思路,不过之前不太清楚每种元素的作用,连线比较随意,这个单元就更规范化了,并且还学习了状态图、顺序图,相信这些知识都会在未来帮助我更好地规范设计。

总的来说,随着课程的深入,我对面向对象有了更清晰的认知,在了解了SOLID原则后,每次我的架构设计都尽可能往这上面靠,虽然可能并不完美,但是比学期初的我一定是有很大不同的。

测试思维的演进

我的测试思维演进应该说是一个从手动构造数据,到自动化评测,再到发现两者缺一不可的过程。首先,这学期我学会了自动化测试,在上学期的OOpre课程我只会手动构造数据,但这学期的作业仅靠手动构造数据是肯定不够的。

第一单元我实现了一个比较完整的评测机,数据生成器部分比较难写,正确性的检验倒是挺好实现的。而到第二单元的时候就是数据生成器部分容易实现,而正确性检验比较难了,由于本人能力有限再加上时间不够,所以基本都是靠大佬的评测机活过来的(超级感谢)。第三单元又学会了Junit单元测试,上学期的OOpre课程已经有涉及,但当时我不能理解其妙义,这学期发现它和JML结合一起倒是非常好用。第四单元相对重视架构设计,所以在测试方面没有其他的变化。

在这门课程中,我测试思维上最大的收获就是一定要格外重视高并发的情况,也是这个点让我觉得手动构造数据和自动化随机生成数据二者缺一不可。在第二单元,我发现仅靠评测机的随机数据是不行的,必须考虑一些高并发的极端情况,尤其是到了第三单元,这种现象也很明显,这让我意识到手动构造一些极端情况的数据也是十分有必要的。这两个单元都让我对高并发有了深刻的认识,想起之前老师在课上提到的12306,此刻对这个例子有了具象化的认知,以前的我只会觉得12306挺难用的,但现在从设计者的角度再看,不禁感叹12306要承担起节假日、春运时海量的访问还不崩,真的太不容易了。所以高并发在实际项目、工程中也是关键点,在以后的设计中,我也会把这点牢记在心,把极端情况考虑在内。

课程收获

  1. 锻炼了我写代码、调试的能力。多线程单元debug的时候虽然痛苦,但收获颇丰。
  2. 掌握了Java这门面向对象的语言。不仅学习了多线程、递归下降等知识,还学习到了很多设计方法、设计原则。
  3. 每个单元迭代式的开发,让我学会了先设计再实现的开发方式。好的架构设计确实能提高效率,在实际应用中也能提高项目扩展性,方便增加需求。
  4. 学会了自动化测试、单元测试等测试方法,对高并发的处理有了深刻认识。
  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值