文章目录
oo第四单元暨课程总结
第四单元总结
本单元的主题是UML正向建模与开发,背景是一个图书管理系统,模拟书架、借还处、预约处等机构的行为,对用户的借书、还书、预约等请求作出响应。
正向建模与开发
在本单元中,我首次实践了“先用UML建模,再编写代码”的开发模式。在完成作业时,我先撰写文字建模,简单列举出各个类的设计;接着画UML图(类图、状态图、顺序图),在画类图的过程中初步理清楚各个类需要有哪些方法,以及类之间的层次关系;在画状态图、顺序图的过程中理清楚类之间的协作关系。最后,在UML建模的基础上编写代码,并继续完善建模图。
与前几个单元进行简单文字设计后就着手开始写代码的方式相比,完成正向建模后再写代码能够帮助我在编写代码之初就对类的职责以及类之间的协作关系有一个比较明确的认知,不致出现随着代码增加,耦合度也随之增加甚至需要大幅重构的情况。
本单元的架构设计
本单元最终的架构设计如下:
- 在顶层,
Library
类负责循环读入请求并解析,依照解析结果通过ask2*()
方法将不同类型的请求分派给各个类进行处理; AppointmentOffice
,BorrowAndReturnOffice
,Reader
分别模拟预约处、借还处、用户的行为,并根据需要进行交互;BookShelf
和BookDrift
模拟书架和图书漂流处,采用单例模式,使得其他类能够方便地获取它们所拥有的书的信息。
在代码设计和UML模型的追踪关系方面,最终的代码设计中类的设计与类之间的关联关系与UML类图之间保持了一致,类的协作关系与UML顺序图保持了一致,书的状态转移过程与UML状态图一致。
课程总结
架构设计思维的演进
第一单元——层次化设计
第一单元的主题是表达式解析,我主要采用了层次化和抽象化的架构设计思想。“层次化”体现在对表达式各个组成成分的解析,如表达式由项相加构成,项由因子相乘构成,自顶向下一层层解析,构建起类似“表达式树”的层次。“抽象化”体现在对表达式的求值过程,把表达式各层次都抽象成“多项式”这一统一的结构,用统一的方法toPoly()
完成求值,对顶层隐藏了底层的实现细节,实现了顶层的高度抽象。
第二单元——线程安全设计
第二单元的架构设计重心在于多个线程之间的协作关系,以及多线程场景下的线程安全问题。在本单元的架构设计中,我主要采用了**“生产者——消费者”模型。本单元的架构中,线程之间存在着多对生产者——消费者关系。InputThread
接受输入,产生请求,是生产者**;ScheduleThread
取出请求,准备下一步分配,是消费者;它们间的托盘是待分配的请求waitRequests
。ScheduleThread
将请求投放给电梯,是生产者;ElevatorThread
取出请求并完成执行,是消费者;它们间的托盘是分配给每部电梯的待执行请求队列elevAllocatedThread
。通过明确共享对象,可以很好地保证线程安全,不会出现同步控制块分散在各个类中而难以进行同步控制的情况。
第三单元——规格化设计
第三单元在宏观架构层面的设计自由度比较小,架构设计主要体现在微观实现层面,包括图模型的构建和算法的优化。我采取了**“计算与对象分离”**的策略,通过创建单独的Graph
类构建图模型,将Person
抽象为结点,Relation
抽象为(不带权)边,实现相关的计算和查询;Network
类只需调用Graph
类对象提供的接口即可,而不必带着Person
对象进行繁复的计算。这种设计在后续进行算法优化时也很方便。
第四单元——正向建模设计
在第四单元的架构设计中,我依然贯彻了层次化设计的思想,Library
类管理Appointment
类、BorrowAndReturnOffice
类和Reader
类对象,调用它们提供的方法响应相关请求,而不关心底层具体实现。经过一学期的设计与构造实践,在进行第四单元的架构设计时能够比较好地设计出层次化的架构,在后续的迭代中也表现出了比较好的扩展性。
测试思维的演进
本学期,我在完成第一、二、三单元的作业时开展了比较多的测试。第一、三单元采取的测试策略主要包括单元测试和压力测试,以及通过断点调试的方式观察部分关键方法中程序的行为并与预期进行比较。第二单元中,由于多线程下无法使用断点调试,我主要采用了构造特殊数据+输出关键信息的测试方式,观察程序的行为是否符合预期。
经过一学期包括oo、os在内的编写代码实践,我认为debug的关键在于洞察和灵感。通过测试发现bug后,要能够透过现象看本质,分析可能导致这个问题的原因;找到原因后修复bug只不过是顺理成章的事。而寻找原因的过程,需要对数据特点和程序运行的机理有深刻的认知,有时还需要一些灵感——bug可能埋藏在意想不到的地方。
课程收获
之前在拜读某位大佬的博客时,在他对oo课的总结中看到了这样一句话,大致意思是:不论结果如何,oo一定是6系学子印象最深刻的课程。的确,oo课有着自洽的课程逻辑,丰富的课程内容,高强度的课程训练;每一位经过oo课洗礼的6系学子,包括我在内,都一定在面向对象程序设计思维和实践能力上获得了大幅的提升。
回想起大一下专业分流前听专业讲座时,高小鹏院长讲述的6系学生在大二要经历的“三次涅槃”,现在我都已经经历过了;过程中有过失败,有过自我怀疑,但更多的是见证自己成长的成就和喜悦。经过oo课的训练,我对程序的架构设计有了更深层次的理解,这是比单纯的敲代码更重要也更难得的能力。我很感激oo课给了我一个培养这种能力的机会,让我能够以更优秀的能力和更自信的态度迎接未来的学习和工作。
最后,感谢所有为这门课辛勤付出的老师和助教们。oo能够让一届又一届的6系学子学有所获,离不开你们不懈的努力和坚持。