301
社区成员
发帖
与我相关
我的任务
分享本单元的学习任务是了解学习并掌握UML类图、顺序图以及状态图,作业主要是实现一个图书管理系统。在第一次作业的时候,需要我们先根据作业要求完成UML类图,然后根据UML类图来编写代码,实现作业要求。
在第一次作业的时候,我也根据作业要求以及功能的划分,设计了UML类图的大致草图:有大致五个类:Library作为整个图书馆的控制中心、returnPlace用来表示借还处、reservePlace用来表示预约处、reader用来表示借书者以及bookInReserve用来表示位于预约处的书本。然后对于每个类,都划分了各自独立的功能。比如:returnPlace主要是完成借书和还书的功能,所以里面需要一个HashMap的容器来存储书本。
然后,根据这个大致的草图来完成具体代码的实现。在实现的过程中,由于最初设计UML类图的时候并未完全将作业的要求考虑清楚,所以会有一些需要修改的地方。在这个过程中,我会根据具体代码的实现,再不断地完善优化UML类图。
总体来说,正向建模与开发对于大项目的开发来对是至关重要的。在前期开发前需要有一个好的系统架构设计,分清楚各个模块、保证每一个模块不互相干涉,同时模块内部又紧密联系,实现高内聚低耦合的原则。在后面的迭代更新中,由于前期有着良好的架构设计,可拓展性极高,可以高效地实现迭代过程。同时,各个模块的功能相互独立,在修改和增加新模块的时候也不会相互干扰。但对于我们的作业来说,优势并未十分明显。
经过三次作业迭代,最终的UML类图如下

例如在main类里面识别出来是borrow的操作,在library里面就执行borrowed()方法,通过调用reader的canBorrow以及library自身的canBorrow来判断是否能够借书。如果可以借书,reader就通过相关方法保存书本。
最终代码设计和UML类图之间是同步对应的。
在最开始接触第一单元的时候,学习了递归下降的思想,对于复杂的多项式,把他一步一步化简成最简单的单项式之后进行分析,这个思想贯彻着整个第一单元的作业。在解析多项式之后便是对多项式进行计算,我当时采用最简单朴素的后缀表达式的形式进行计算,并利用基本项的思想进行合并。在实现的过程中,对于计算合并的功能并未做到很好的架构设计。虽然最后也完成了作业要求,但是代码的可拓展性较差,并且代码冗余。
在第二单元中,主要考察的是多线程相关内容,其中最主要的就是如何保证线程安全以及避免死锁问题。在这单元中,也尽可能去实现面向对象的编程,通过多层次的结构,一层一层地将输入解析处理。其次,在保证线程安全的过程中,从最初的仅仅使用synchronized中,一次一次地去理解为何会出现线程不安全的情况,为何会出现死锁问题,逐渐理解了synchronized的用处,以及各个线程之间的联系。
而在度过了第二单元之后,就来到了较为轻松,但也需要认真对待的JML。这一单元主要的目的是让我们学习并尝试使用JML规格语言,同时也对于一些功能的优化和维护提出了要求。由于代码框架均由课程组给出,所以这一单元的架构设计较为简单,只需要在实现具体方法,满足JML规格的时候,采用最合理的方法即可。在这一单元,我也深刻体会到了JML规格的优点:明确代码需要实现的功能,具有严格的功能实现规范。但是对于具体的实现过程并未过多要求,需要我们去寻找尽可能最佳的方法。这就涉及到了黑箱测试以及白箱测试等。总而言之,JML虽然看起来较为繁琐,但是实际的用处确实利大于弊。
在本单元也就是第四单元,我们接触到了另一个语言:UML语言。我们学习并绘制了UML类图、顺序图以及状态图。我们需要在完成具体代码前,先进行整体代码架构的设计(UML类图设计),这需要我们合理思考一下我们需要如何进行分工,分配好每一个类具体的功能。然后,在实现具体代码的过程中,再去不断地优化我们的架构设计,实现相辅相成。
在前两个单元中,我们的测评对于性能分有一定程度上的要求,同时也对正确性提出了较高的要求。所以在测试的过程中,我们除了一般情况下的测试,我们还应该注重压力测试以及边界测试。在第一单元中,在正确性方面,我们需要考虑许多边界测试以及一些较为特殊的样例,增加代码的鲁棒性。同时,为了避免出现TLE的情况,我们也需要对于一些数据点强度较大的进行测试。
而在第二单元中,同样需要考虑一些特殊情况,判断是否会出现线程不安全的情况或者死锁的情况。然后就是互测中,不知道hack了多少人的压力测试(在最后的时间里上了一堆人)。
在后面两个单元中,对性能的并未过多要求。但是在第三单元中,需要我们对一些变量或者数据进行维护,否则在压力测试下较难通过,可能会出现TLE的情况。在第四单元中,我们更多地是需要考虑功能是否实现完全,在这个功能中,我们是否将所有情况都考虑清楚。这就需要我们进行较为全面的思考和测试。
首先和oopre相比,较为明显的进步则是面向对象的思想在代码中体现地更加明显了。其次,在本学期面向对象设计与构造的学习中,学习了递归下降的思路、多线程相关知识、JML语言以及UML语言。这些都很好地帮助我在接下来的设计构造中有着较好架构设计。最后,这个课程也在一定程度上提高了我在写代码过程的中思维以及应对各种各样问题的经验和解决措施。
最后感谢课程组、老师和助教以及同届大佬的帮助!!!