架构设计思维演进

经过整个课程四个单元迭代式的学习演进,笔者在架构设计方面学到了很多,最重要的应该是分离式、模块化、层次化、安全性设计。现进行一定的记录:

第一单元 字符串解析的简单计算器实现

  • 递归下降法设计:递归下降法是将原对象分为多个层次,每个层次相互独立处理,将本层次划分为多个下一层次的元素,并进入下一个层次进行处理。在第一单元中表现为原式分为多项式、单项式、因子,按照+/-将多项式拆分为单项式,按照*将单项式分为因子,在因子层面,如果因子带有()则按照多项式处理(这就会出现多项式类继承因子类的行为)。
  • 分离式设计:分离式设计应该是面向对象设计思想中极为重要的一点。这种思想有多种含义,包括程序功能模块化设计(如本单元中字符串解析为各个元素与字符串中元素计算功能分离)、层次化设计(如本单元中分为多项式、单项式、因子,后面可能还有更多层次,各个层次相互分离)等。

第二单元 多线程对应的电梯系统实现

  • 线程控制安全:主要有两种方式,普通的锁synchronized和读写锁,区别主要在于读写锁可以支持多个读线程同时对临界资源进行访问而synchronized方法则不行,两者会带来一定程度上的性能区别。线程安全是多线程设计中最需要考虑的问题,对于临界资源的访问都应确保通过锁的使用是安全的。
  • 线程休眠唤醒:为保证在不进行任何动作时空余计算资源,在线程没有请求时进行休眠操作,并在出现请求时将其唤醒。具体操作主要是使用wait()notifyAll()函数(请注意,这两个函数都是对临界资源进行操作的,即当前线程休眠和共享临界资源的全部线程唤醒)。休眠唤醒中需要关注程序的结束问题,比如部分线程休眠后无法被唤醒(如部分线程休眠而进行中的线程结束)就会导致程序无法结束。
  • 临界资源共享:我们知道,进程包含资源和执行单元,而这种执行单元就是线程。也就是说线程只包含少量资源,通过函数调用执行操作,因此需要为其包含的资源提供共享的临界资源,并通过这些临界资源控制线程。这从本质上说也是一种分离式设计。

第三单元 JML架构对应的社交网络实现

  • 上层接口实现:在最上层类中建立多个函数接口,降低访问时间消耗与逻辑复杂度。
  • 特定属性动态维护:对于某些特定的属性,可以进行动态维护,降低访问时间消耗。
  • 规格和实现分离:本单元主要学习JML规格,将架构设计与代码实现分离,由架构设计师设计出程序架构,并书写JML架构语言,由程序员按照JML语言完成具体代码。

第四单元 自由设计的图书馆系统实现

  • 抽象思想的实现:在设计中,应注意方法的复用性。可以将程序中的部分对象进行进一步抽象,以提高程序复用性。如本单元设计中,将ShelfAppointBorrowCorner等具体的类继承Office类,在上层存储时存储为Office数组,在调用时按照序号进行使用。服务类也是如此,将其实现为Service接口,在上层存储时存储为Service数组,在调用时按照序号进行使用。
  • 对于信息的解析存储:对于一些对象的关键信息,应进行存储。如本单元的书籍对象,其含有借阅信息、预约信息、和捐赠信息等关键属性,需要建立关键类并存储这些信息以便后续使用。
  • 分离式设计与多层次设计:本单元中,分离式设计以及信息可见性是很关键的问题。将功能实现与查询接口相分离,将图书馆中不同部分的功能实现相分离,将SystemLibraryOfficeBookBuffer等层次分离,对于这些分离的模块设计接口,仅接口信息可见,保护信息的可见性和程序的安全性。

测试思维演进

四个单元中,对自身程序进行了多次测试,以满足程序正确性的要求。

  • 数据构造器:通过编写python程序,实现自动随机生成大量数据,并放入程序中进行验证。
  • 多情况全面评判:测试最核心的点在于数据的覆盖性,因此数据不在于数据量大,而是在于数据的覆盖面广。构造数据前,全面考虑可能出现的情况,并进行相应的特殊数据构造。
  • 强数据测试:程序除去正确性,还应注意运行时间等性能问题,不应出现大数据量时程序无法在限制时间内获得正确结果的情况。
  • JUnit单元测试:JUnit主要是对特定方法进行测试,通过书写测试程序,检查方法使用时是否会出现结果以及对象变化的问题。其主要是从特定的方法层面测试,而非全面的程序逻辑测试。同时也进行了参数化数据构造,实现自动化生成数据测试。
  • 多种测试方法并行:黑箱测试、白箱测试,单元测试、集成测试,功能测试,压力测试,回归测试等测试方法,对程序的整体功能实现和代码实现逻辑与限制进行了测试。详细部分已经在第三单元中阐释,不过多赘述。

课程收获

对比CO和OS课,OO课可以说是我最上心的课了,因为面向对象这种思想不论是在工程实践还是生活中都有极高的实用价值。包括说本学期在日常中自己写一些具体问题的程序,都在刻意的训练自己这种思考问题的方式,以期更能适应未来的生产生活。

现对自己在面向对象中学到的东西做一些总结:

  • 架构设计:面向对象课程中最大的收获应该就是架构设计了,在这之中学习到了许多构建架构的思想,如分离式模块化设计、分层式迭代设计、出于程序安全性考虑的特殊设计。总结下来就是一种低内聚高耦合的思想,设置多种闭合模块,再暴露出特定接口,以模块为单位实现元功能和组合成为更复杂的函数,提高了程序安全性、修改的简便性和函数的复用性。这种思想在各个领域都有表现,就像局域网等。同时,面向对象是对于类进行操作,而架构设计本身也是一种分类的过程,分成多层次或依赖或独立的各种类。分类标准也是一项大收获,过去更多按照从属关系分类,类中方法也更多以具体实现为导向;而现在也会通过一些接口实现和类继承,从业务角度出发,不仅以操作者分,还以相似动作分。
  • 性能优化:除去第四单元,前三个单元都对程序性能有具体要求。如第一单元中,对于计算式的展开、同类项的合并具有很高的要求;第二单元中,对于电梯调度(单个轿厢与多电梯调配)策略有很高要求(影子电梯或多目标规划);第三单元中,对于动态维护、大顶堆等排序方法、DPS/BPS等图论方法的实践。在整个学习中,既有架构设计等整体性学习,又有性能优化等局部性练习。
  • 工程开发流程:各单元的迭代练习比较有工程开发的味道,从前期架构设计到后期具体实现,都有很大难度的训练。整体学习中,对各部分都有所锻炼,相信在未来真正面对实际问题时,不会那么无头苍蝇乱撞,或者设计出需要不停重构的架构了。
  • 程序测试:在几个单元中,学习并使用了多种测试方法。通过黑白箱测试,实现数据测试和逻辑测试的双重验证;通过单元测试、集成测试,实现局部与整体的双重验证;通过构造极限数据点的压力测试,实现对于程序的边界测试。这些测试方法,或者说测试思想,对于未来书写代码具有重要意义。

还有很多更加细节的知识点,如多线程的设计与并行控制、JML构造语言的阅读书写、UML图的阅读绘制,等等等等。甚至可以说,这些思想也可以应用到生活中的做人做事中,比方说遇到各种事情时都可以将其划分为层次鲜明、互相独立的小问题,通过实现小功能去组合解决大问题。

那么,依旧是致谢环节。感谢各位风趣幽默又不缺乏细节的讲解架构设计和功能实现的老师,感谢每一位帮助我找出bug共度难关的学长学姐和同学,也感谢那个虽不完美但仍对一切充满信心充满热情的自己。衷心希望OO课程未来更进一步,祝好!