301
社区成员
发帖
与我相关
我的任务
分享正向建模与开发指的是在软件系统开发的早期阶段,基于需求和设计文档等资料,使用建模工具进行系统的设计和建模。通过这一方法,我们能够更加清晰地了解所需开发的软件系统的具体功能,并且一个优秀的建模设计能够在很大程度上减轻后续软件开发与迭代的难度,同时也可以有效地提升软件开发的速率。
对于本单元的开发,需要完成的是一个简单的图书馆管理系统。总体而言,开发难度并不大,因此我们主要将重点集中在正向的建模设计。
对于类图的设计:
Book类进行统一管理。对于每一个存放书籍处,创建一个BookGroup来对书籍群进行管理。Controller类对BookShelf,BorrowAndReturn,Appointment,CLient进行书籍移动的管理。 对于状态图的设计:
Trigger.Book)的状态转变流程,减少设计过程中的逻辑漏洞。对于顺序图的设计:
本单元的核心需要时围绕BookShelf,BookDrift,BorrowAndReturn,Appointment,Client,Controller这几类进行展开。代码的类图如下:

Controller作为图书系统的管理者,负责管理书籍的整理以及书籍的流动。BookShelf,BookDrift,BorrowAndReturn,Appointment作为书籍存放处,拥有各自对应的功能。Client作为用户,可以进行预约和捐赠。Book和BookGroup是书籍以及其对应容器的抽象。本单元的任务是完成多项式的化简,其主要采用的思想是递归下降。通过对表达式进行格式化处理,将其分解成一个一个的对象再借助面向对象设计的思想进行解析处理,就能够使得原本复杂问题变得清晰明了。本单元的主要设计难点就在于如何将复杂的表达式抽象成设计所需要的对象,一旦这一步能够顺利完成,那么程序整体的框架问题就能够迎刃而解。剩余的难点就是尽可能避免逻辑错误,以及如何完成化简上的优化。
第二单元涉及到了多线程编程以及其设计应用,本单元代码的开发与迭代可以说是困难重重。首次接触多线程开发,难免对于线程的安全与互斥理解出现偏差。但是通过这一个周期的学习,我也是收获良多——如何使用生产者-消费者模式,以及如何在一个比较复杂的框架下保证各个线程的安全。“分而治之”的思想在这次的作业中也是很好地反映出来,针对电梯(单轿厢,双轿厢)和调度器,分别进行线程管理,最后进行组合就能够实现本次作业的功能。
本单元主要聚焦于JML规格化设计,因此本单元就实现难度而言其实并不算高。但是理解大段大段的JML语言背后的逻辑还是花费一些时间的。此外,还需要注意的就是实现JML对应方法时要小心时间复杂度。本单元的作业进行逻辑抽象后,实际上就是对一个无向图进行查询和修改。因此,需要采用恰当的图算法来避免过高的时间复杂度。总体而言,本单元需要重点理解的就是契约式编程设计,以及如何在最大程度上保证代码运行的正确性。
设计思路在前文已经提到过,此处就不再赘述。本单元的重点就在于正向化的设计,即先进行框架设计,再以此为基础完成后续的程序开发。
在第一单元的时候还会搭建自己的评测机,但是随着后续作业难度的提升以及数据生成复杂度的提升,主要的测试方式还是借助他人的评测机或者是根据自己的代码手搓出相应的数据进行测试。总体上来说,对于代码的测试还是以黑箱测试为主,通过大量数据对代码进行碾压,在最大程度上避免出现功能性错误,然后白箱测试为辅(毕竟手搓数据想要找出逻辑漏洞还是难度不小),对较极端的数据进行特殊测试。这样就能够大大减少出现bug的几率。
经过一个学期的学习,虽然遇到了不少的困难,但是总的来说也收获颇丰。
首先就是对面向对象设计思想的理解更加深入,通过四次作业的开发迭代,我认识到封装、多态、继承等特点所带来程序设计上的优势,以及一个优秀的架构是如何影响后续作业功能的拓展。一个好的架构不仅能够帮助程序员更加轻松的完成软件的开发,同时高内聚、低耦合性也能够在很大程度上保证后续所增加功能的正确性。
再者就是自动化测试,在程序开发的过程中出现bug是难以避免,因此需要通过高强度的测试来检查程序中出现的漏洞。在整个OO课程中,虽然本人没有实现每一次作业的评测机,但是我也深刻意识到黑箱测试对于程序正确性的重要意义。
OO课程至此算是全部结束了,希望OO课程组能够想出更多好的idea,让更多人感受到面向对象设计的魅力。