301
社区成员
发帖
与我相关
我的任务
分享在设计领域中,正向设计是从概念、模型,产生实物的过程。与正向设计相反的是逆向设计,是先有实物,通过对实物的观察(扫描、获取三维坐标点)获取实物的模型,然后对模型进行再次创新。
软件工程中,正向建模是一种自顶而下的软件设计过程。从高层次的总体功能出发,对每个层次的功能进行分解和细化,逐步达到对底层细节的设计,以实现对整个系统的全面把握。
正向建模有清晰的层次结构和元素关系,可以考虑到系统中的各个角色和各种业务场景,可以达到更全面的系统分析和设计。
本单元围绕图书管理系统,模拟图书馆中包括借书、还书、预约、取书、捐赠、信用积分等多个复杂功能和场景。通过UML类图绘制,我先明确了各个情况下的书籍位置状态转移图,并依此完成了图书馆各个部门的功能设计。
在类的划分上,以hw13为例:
类的划分主要关注书被谁持有着:只可能是书架、预约处、借还处和用户
借书时,书沿着“书架->借还处->用户”移动,书的位置状态发生改变
书架与借还处只需要管理某本书是否能离开
以图书的持有人状态为基础,分别建立书架类、预约处类、借还处类和用户类
自主查询机的功能由书架实现即可
预约时需要记录预约日期、图书编号、是否满足等信息,需要另外建立数据结构进行存储
完成设计的时候,必须要明确类间的协作关系。
协作关系不仅仅是类图中的关联,依赖关系等,更重要的是顺序图中能体现出的交互方式
类之间需要传递怎样的信号达成握手
一个类如何调动另一个类并又如何接收到其他类的反馈
在大致梳理清流程后还可以进一步思考
如何提高类的内聚降低类间的耦合
如何将代码模块化提高可拓展性
基于类间协作关系的思考方式是比较普适的
之前的表达式化简、电梯还是现在的图书馆均是如此
想清楚类之间需要传递什么信息来协作时,面向对象层次的问题已经大体解决,剩下的就是类内部的程序设计
数据:
书籍:物理意义上的书籍,包括编号、截止日期、捐赠人编号、是否预期、借阅次数等;
预约记录:记录借阅信息,包括借阅者编号、借阅图书编号、失效日期、是否到达等;
设施:
图书馆:管理时钟,并且判定开馆,闭馆等,拥有书架、借还处、预约处等对象;
借还处、预约处:拥有图书缓冲区、判断准入准出等;
书架与漂流书柜其实是一样的:出库、入库、查询余本等。
以hw15为例,UML类图如下:

现在再看,其实BookShelf、BorrowReturnOffice和AppointmentOffice的功能与操作大差不差,可以用继承的方法把重复代码提炼出来,提高内聚。
第一单元
第一单元是我真正意义上第一次采用面向对象的思想去解决问题(OOPre的作业主要还是熟悉java语法),面对复杂的表达式,面向过程的编程思想显得无从下手。这因为如此,我才更深刻地体会到面向对象分析解决问题的优势,将复杂的表达式层层解析为一个个对象,使用递归下降的方法对其进行解析和处理,最终迎刃而解。但是现在再回头去看第一单元的代码,相比于第四单元还是有很明显的“面向过程”的影子,这也导致部分模块的处理显得尤为臃肿,方法复杂度也非常高。
第二单元
第二单元主要学习多线程编程以及设计模式的应用,这也是我第一次学习使用多线程的方法编写代码,对线程同步互斥的理解还非常浅,导致处理线程同步和线程安全的问题上花费了大量的时间和精力。但同样的,这个单元的作业给我带来的进步也格外显著,不光是熟悉了多线程的使用方法,更重要的是学习到生产者消费者模型和流水线模型,通过在作业中设计这两种模型也加深了对面向对象编程的理解,将调度器、托盘、需求、电梯等设计为对象,分别思考他们的功能,最终作为一个个模块组合为项目,这也让我体会到面向对象编程“分而治之”的特点。
第三单元
第三单元的核心是学习JML规格化语言,没有太多需要自己设计架构的地方。此外也借此复习了图论的相关算法,并了解到各个基础算法的优化方式。不过这一单元课程组提供的代码架构也确实让我学习到不少经验,这在我第四单元的架构设计中其实也有一定体现。把person、relation分别看做图的节点和无向边,构建起来网络模型,并针对这个网络进行一些功能拓展(如标签,发送信息等)。
第四单元
第四单元的架构设计相已经在前面详细论述了,我认为我的架构相较第一单元还是有了不小的进步。像是在第一次作业中就模仿实际图书馆把所有工作人员类都放在一个图书馆类中,这样就让第二次作业的迭代比较容易。
因为在OOPre课程中强测曾经得过33分和0分,所以我在本学期的OO课程中比较重视对自己代码的测试,每个单元都与同学合作完成了评测机帮助debug,同时也使用了别人的评测机进行测试。
最开始是无规则的数据对拍,后来逐步学习测试方法,学会了:
将上次强测拷下来跑做回归测试
增加不规则输入和超越课程组数据规模的数据测试
单元测试
回头看,大部分测试好像都是基于黑箱测试来进行的,虽然也尝试了白盒测试、单元测试的方法,但是还是用的不熟练。通过OO学习,我的测试思维将从简单的功能验证向更全面、自动化和持续的测试转变。这种测试思维的演进将帮助我构建更可靠、稳定和高质量的软件系统。
首先本学期OO课程带来的最大收获就是学习到面向对象的思想,不光是在作业上,包括后面几次的评测机编写,其实都或多或少体会到面向对象的优势。另外也学到很多知识,包括git的使用,单例、生产者消费者等设计模式,markdown的使用,jml语言和uml图等。
另外,一次次作业的迭代开发也让我意识到设计和架构的重要性,一个好的架构能够帮助程序员更加方便和顺利地维护项目、拓展功能,尽量减少各个模块之间的耦合度,防止修改或增加一个功能,会导致其他模块的功能受到影响,最终导致迭代难度过高而重构。
当然还有代码风格的变化,一学期的作业都要求我们按照一定的代码规划进行编写,我也切实感受到经过OO课程的实践,自己代码风格的规范化。比如在OS挑战性任务中会习惯性地增加空格,不至于看上去那么紧凑;也会自主地使用规定的方法对变量和方法进行命名,增加代码的可读性。
OO的旅途就到这里,再见了!
亲爱的旅人 没有一条路无风无浪
会有孤独 会有悲伤 也会有无尽的希望
亲爱的旅人 这一程会短暂却又漫长
而一切终将 汇聚成最充盈的景象
就此告别吧 水上的列车就快到站
开往未来的路上 没有人会再回返
说声再见吧 就算留恋也不要回头看
在那大海的彼端 一定有空濛的彼岸