当前位置:   article > 正文

OO第四单元总结

OO第四单元总结

第四单元总结

第四单元是UML单元,看似没有引进新的东西,而是强化了过往使用到的UML图,并对其中的UML类图、UML状态图、UML顺序图进行了强化。

在本单元的学习后,OO课程也来到了尾声。在一学期的课程中,从一开始的用顺序思维写OO,到现在对多线程、JVM虚拟机等都产生了一定的认识与了解,OO带给我的成长是巨大的。

正向建模与开发

什么是正向建模?在我的认识中,正向建模就是在开始写代码前构建出大致的架构,在实际的代码编写中按照架构去完成。这样的好处是,在编写代码时,不会陷入“树叶与树林”的窘境中,始终有着大致的逻辑框架可以遵循,不会落入过多的细节中去。用OS中的术语,就是合理地规划软件层次,达到一个良好的软件编写方式。

在之前几个单元的作业中,实际上已经使用到了正向建模的思想。在每个单元的代码编写前,我都会在纸上写写画画,构思出大致的架构,在脑中将流程走一遍。也许粗糙,但也能在编码中提供巨大的帮助。

那么本单元的训练意义在哪里呢:一方面,使用图书馆这个具有细节的场景,强化了对正向建模的使用;另一方面,贴合企业生产实际,完成了对UML工具使用的训练。

研讨课上有个主题说的很好,如何看待系统架构设计与敏捷开发的关系。在我本单元作业中,实际上并没有在编写代码前就画出完整的UML图,这也是不显示的,在实际代码编写中会灵活地调整一些方法的实现。

在经过小组研讨后,我们一致总结出,系统的架构是关键的,类似于我们在纸面上发出大致的架构框架图。而具体的设计,其实不一定要在开发前全部完成,这几乎也是不可能的。在定义好整体的架构,模块的交互方式后,具体的实现与设计可以灵活调整,这就是敏捷开发了。

我最近在编写龙芯杯的乱序处理器代码,这比计组课程的处理器代码规模大得多。我们所采取的正向设计方法就是发出CPU架构设计图,定义好模块间的交互方式(总线、传递的信号、保证的约束),再由每个人完成自己负责的模块。我觉得这是一种合适的正向设计方式。

架构设计

在本单元中,我的架构设计遵循了一个较为简化的设计方式:

  • 图书馆本身的逻辑较为简单,可以在一个类内部封装完成绝大部分的操作
  • 我的时间不是很多,大作业有点多,考试有点难,有点偷懒了

在参考了往年学长学姐的博客后,我发现可以在图书馆一个类中完成绝大部分操作。虽然这是危险的,在最后一次作业结束后,我的图书馆类Library的代码行数来到了480行,是一个相当危险的长度。其中,大部分的操作没有进行封装,比如借阅不同种类的书籍,而是直接堆放在那里,是我写过的比较丑陋的代码之一。

在图书馆类的内部中,我用图书id代表图书,用HashMapArrayList完成了图书的管理,用其代表图书馆中的不同机构,实现了整体的架构安排。

这样设计的好坏都是鲜明的。好处在于类内部的方法较为灵活,没有太多的封装约束。坏处就是太过灵活导致没有安全约束,容易出现问题。此外代码较为臃肿,各种功能的方法挤在一起,没有很好的扩展性(再迭代一次就会超过500行)。

UML

架构设计的思维变化

说来惭愧,刚开始时反而是对架构设计最上心的时候。

在第一、第二单元中,每个单元开始前我都会抽出一个下午的时间,遍历往年博客,找到其中架构设计的共性优点,总结其中的一些不足之处,尝试汇集往年的架构设计之优,再结合自身的审美,对架构做出一些调整。

但是在JML单元,JML本身不太注重宏观的架构设计,只需要完成内部的实现方法设计,在架构上的调整是不多的。阅读博客后我使用了并查集这一设计思路,其余的实现就比较常规,没有太多的架构设计上的优点。

在UML单元,由于第四单元和考期以及各种大作业交付高度重合,课程组也有意放水了,我也没有画太多的时间进行架构设计,而是进行了完成任务就好的摆烂式设计。

在架构思维的转变上,我觉得对我影响最大的还是第一第二单元:

  • 层次化设计:非常大的提升。如果说pre课程还是用面向对象写过程化的程序,那么第一单元我理解到了什么是在对象中进行属性操作的封装,让类之间的有机结合完成各自的功能。通过合理的抽象和架构设计,在定义好类的接口后就可以使用面向接口编程
  • 多线程设计:很大的提升。多线程编程最重要的一点就在于安全性:如何合理掌控类的交互,不至于出现死锁问题。最重要的一点在于,面向对象需要封装,而安全性需要保证封装后类对安全性不应该要求其他类。如何合理地进行封装与多线程锁的操作,是面向对象多线程编写的方法。
  • 契约式设计:一点提升,领悟到了JML对于测试的帮助。每学期中唯一一次专门编写测试代码Junit,对测试的有了一定的新理解。
  • 正向设计:一点提升,对UML工具有了熟练的使用。但是在架构设计上,还是和之前的水平一样,我也觉得自己有一个还算不错的架构,在效果和花费的精力之间达到了一个平衡。

OO课程结束了,架构设计的思想却会一直延续下去。高内聚、低耦合封装等关键词是软件工程的核心,也是这个与这个世界进行交互的方式。在纷繁复杂的社会中,如何保持自身的属性不被外界侵染,做好自身的保护。

测试思维的演进

很惭愧,没有做很多的测试,大多都是自己捏数据点,评测机白嫖其他同学。

讲一讲如果没有白嫖到其他同学评测机的时候的测试思路吧,分为如下几个阶段:

  1. 完成代码,进行样例的运行

    这是最初级的测试,用于检测代码能否通过编译,是否有过于明显的错误

  2. 通过样例后,再一次阅读指导书,同时走查代码,进行白盒测试

    由于往往没有足够时间搭建评测机,这一步往往显得十分重要。百合测试的好处再与细致,对于代码的理解也比较深刻。但是弊端在于:一旦代码的规模较大,或者有着运行的不确定(多线程),抑或是本身对代码的理解有问题,那么走查出来的结果也会是错误的。

  3. 捏几组数据,进行手动测试。

    1. 强调方法正确性的代码,如电梯的反复上下客,强调代码的稳健性
    2. 强调边界情况的代码,进行一定的压力测试
  4. 再试图去白嫖一次评测机,看看能不能白嫖到,如果不行再走查代码一次

课程收获

随着课程的结束,很多同学都在朋友圈中发布了对OO课程的感想与感谢,也会问问自己,我收获了什么。我的收获也许不如那些同学那么多。在OO刚开始时,我还沉静在pre课程的喜悦中,幻想着OO神话,但显然是失败了。OO结束时也并没有很多的情绪波动,这门课确实教会了我很多的东西,但是也有限,我自己也并没投入那么多的时间,还没有搭过评测机,测试的时候代码也出过bug,一些时候精力也实在有限,只是完成了任务。

但如果这个学期再来一次,我可能还是会这样。在我心中,OO是一种思想,思想在刚开始时已经学的差不多了,后期学到了一些辅助更好完成思想实现的方法,如多线程、UML、JML、一些JVM等等,这些已经足够了。在后期的理论课上,在速通完PPT后,我都会自己学一些和OO相关的内容,这种感觉是奇妙的,学会了不少的东西,我很满足这部分的探索。

当我敲下这些文字时,这个学期的绝大部分事情都完成了交付,我也终于有时间做一些自己想做的事情。此刻,窗外的阳光正好,洒满了枝丫与邻近的书桌。我逐渐开始脱离自己的学生身份了,这种坐在象牙塔里,享受着自己今天又学到了一些知识的时间也越来越少。最后,还是感谢OO,期间我没有很破防,也没有很激动,而是就这样,最终还是来到了这里。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/967672?site
推荐阅读
相关标签
  

闽ICP备14008679号