BUAA OO 课程总结

0000。。 学生 2024-06-14 13:10:16

BUAAOO第四单元总结

正向建模与开发

本单元聚焦于UML正向建模与设计。我对正向建模的理解是程序员首先根据需求画出UML图,画出主要的类与方法,然后再根据UML图完成代码。在完成代码的过程中,代码和UML图提供了程序的具体实现和抽象的对照,为程序员增添模块,增添功能以及debug提供便利。

具体而言,对于类图,我们主要需要确定程序中需要哪些类,类中有什么属性以及类与类之间的关系。对于状态图,我们关注的是图书状态(即位置)的转换。对于顺序图,我们关注的是信息的传递和处理,也即图书馆中的某一模块何时需要处理图书,如何处理图书。

在本次作业中,我先是根据要求大概画出类图(只包含类名,一些必要的属性以及类与类的关系)并把输入的框架搭好,然后再根据作业的需求实现具体的函数。有了UML图的对照,我对程序的架构认识也更加清晰,写起来也更加顺利。

架构设计

第一次作业架构

img

第二次作业架构

img

第三次作业架构与第二次作业的基本一致。

其具体功能分别是:

  • MainClass类接收输入并分发给MyLibrary

    • while (true) {
                  LibraryCommand command = SCANNER.nextCommand();
                  if (command == null) {
                      break;
                  }
                  date = command.getDate();
                  if (command.getCmd().equals("OPEN")) {
                      myLibrary.open(command.getDate());
                      myLibrary.arrangeBook(false);
                  } else if (command.getCmd().equals("CLOSE")) {
                      myLibrary.arrangeBook(true);
                  } else if (command instanceof LibraryQcsCmd) {
                      myLibrary.queryCredits((LibraryQcsCmd)command);
                  } else {
                      myLibrary.parseRequest((LibraryReqCmd) command);
                  }
              }
      
  • MyLibrary类里根据指令类型分发给对应的处理函数

    • public void parseRequest(LibraryReqCmd cmd) {
              LibraryRequest.Type requestType = cmd.getType();
              switch (requestType) {
                  case QUERIED:
                      parseQuery(cmd);
                      break;
                  case BORROWED:
                      parseBorrow(cmd);
                      break;
                  case ORDERED:
                      parseOrder(cmd);
                      break;
                  //...
                  //...
      
  • 为书本可以存在的位置(书架、预约处、借还处、用户)建立对应的类以及处理逻辑

  • 由于我们需要知道用户是什么时候借的书,所以对于用户手上的书需要使用包含借书时间的MyUserBookId将原来的LibraryBookId封装一下

  • 同样,预约处的预约要包含时间信息,BookId和User。所以使用Appointment封装。

类图不算繁琐,架构比较清晰,也比较好拓展。写完后我才发现,其实从UML图上就可以大致判断这个程序的可拓展性如何。从UML图中可以看出图书馆与其模块是has-a的关系,对于新增模块只需要把新模块需要的信息与BookId封装好,再写上新模块所需要的逻辑就行。不过需要注意的是,封装与拆分应该尽量在类里面完成,这样才能做到高内聚,避免不同类型的封装在"图书馆"里流转。

架构设计思维演进

  • 在开始学习OO之前,我对面向对象的理解实际上只停留在图书管理系统这种水平。因为它清晰的拥有各个模块,又是日常生活中常见而容易理解的,那时候我以为这就是面向对象的全部。在一开始面对U1第一次作业时,我实际上并没有太理解其中蕴含的面向对象的思想,架构设计也几乎照搬实验课以及博客代码。但逐渐深入后我才发现,在面对类似表达式解析这种有着递归,层次化特征的问题时,面向对象的思想有着很大的优势。可以说第一单元让我对面向对象这一概念的理解不再停留在图书管理系统这种层次。
  • 电梯作业中,我开始提前思考架构以求尽量避免对架构的大改动,也体会到了将运行与策略分离的便捷。此外,对多线程的控制以及架构设计也是一种全新的体验。
  • 第三单元架构思路主要依据JML语言实现,重点是读懂课程组所给的JML需求。
  • 第四单元便是之前提到的正向建模与开发,先根据整体的功能大致画出类图,再在类图的帮助下搭建好整体的模块以及类之间的交互,然后再逐条根据要求实现具体代码。

测试思维的演进

我的测试主要分为四个阶段

  • U1通过手动构造数据尽量覆盖各种情况,通过肉眼或者sympy进行测试
  • U2中开始有意地完成功能后,对各个特定的功能进行测试。并且通过数据生成为电梯性能进行测试。
  • U3中通过数据生成器生成极端数据判断时间复杂度是否满足要求,同时为部分方法编写了junit测试。此外还通过与同学对拍进行测试
  • U4的测试思路与前几单元类似。

课程收获

对我来说OO课程的收获主要有两点。

一是在研讨课及交流群中讨论题目思路、分享架构、讨论bug的过程中认识了许多非常热心非常乐意解答问题的同学,而与人交流。同时也了解了不同同学解决思路的不同,从中认识到自己做的好和不好的地方。如果以后的课程也有类似设置就好了

二是在一次次作业中感受到架构设计以及代码实现能力有了一些提升。从一开始的手足无措完全无从下手到能较为顺利的完成作业的大致框架,这离不开一次又一次作业的锻炼。

OO是一门非常完备的课程。从弱测、中测、强测再到研讨课,能够感受到老师和助教都付出了极大的心血和努力。感谢所有老师、助教和同学们的帮助!

...全文
75 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

301

社区成员

发帖
与我相关
我的任务
社区描述
2023年北航面向对象设计与构造
学习 高校
社区管理员
  • YannaZhang
  • CajZella
  • C_ecelia
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧