oo_unit4总结&课程总结(代码片段)

MOC8 MOC8     2022-12-01     469

关键词:

OO_Unit4总结&课程总结

本单元的作业是UML图的解析,作业的目的一是进一步强化架构设计能力,学会如何一步步将一个复杂的图结构进行多层解析。二是学习UML这一种强大的形式化语言,熟练掌握并应用到今后的程序设计与软件开发中。从难度上讲,本单元的难度相较于第三单元又有所回升,不过对时间复杂度的要求有降低。难度接近第一单元,但由于三次作业之间相互牵扯并不严重,因此一般情况下不需要进行代码重构。


1、本单元的架构设计

第一次作业

第一次作业的UML类图如下:

image

本次作业中,基本把UML类图的组件分成三层

  • ClassInterface
  • Operation
  • Parameter

在调用主类的方法时想找到相应的查询元素,再逐层下降,从而调用低级类中的同名方法,查询到需要的结果。

这样的架构有一个潜在的问题是低级类无法查询高级类的属性(一般是表),因此设置了一个静态类,作为“总表”,一般装入id等索引,供低级类进行查询操作。

第二次作业

第二次作业的UML类图如下:

image

第二次作业针对顺序图和状态图,同样进行分层。

顺序图:

  • Interaction
  • Lifeline
  • Message

状态图:

  • StateMachine
  • State
  • Transition

同样是上层类不断查询到下层类去调用方法,下层类通过总表查询上层类的属性。

在本次作业中出现了一个类中方法过多导致超过500行的问题,因此强行拆类,将三个图的方法放在三个分别实现了相关接口的类中,并将这三个实例对象作为主类的属性,主类在调用方法时只需调用这几个分类的方法即可,节省了单个类的行数。

第三次作业

第三次作业的UML类图如下:

image

第三次作业加入了模型检验。由于我在前两次作业中,关于继承,实现等关系全部都在END_OF_MODEL后预处理完成,所有的查询指令只需直接查表。所以在这次作业中,我的这种写法需要改动的幅度就相对较少。只有R002需要额外新添方法,其余只需在已有的方法中进行判断并将错误类移入表内即可完成。

此次作业中错误信号的传递方向是由下层到上层的逆向传递,因此全部采用总表实现,模型检验类只需从总表中拉取数据即可。


2、四个单元中架构设计和OO理解方法演进

第一单元

在进行第一单元的时候,由于此前没有经历过这么大代码量的编程(计组个人觉得称不上编程),因此整个人完全没有架构意识和面向对象意识,还是处于一种写一行是一行的状态,整个三次作业下来的过程十分艰难。

第一单元对我来说最大的特色就是“重构,重构,再重构”。由于在编写代码时对增量开发考虑的不够多,因此每一次作业的架构都完全无法支撑下一次作业。当时一度对OO这门课感到绝望

第二单元

第二单元着眼于多线程,是一个难度很高的单元,但我为了尽快培养自己的架构能力,于是顶着多线程的学习压力,不断思考自己应该进行怎么样的架构设计。相比于第一单元,第二单元的“面向对象”感更为强烈,各个线程之间的工作之间也更需要体现一个条理性,以及对线程安全的思考。

第二单元出现了一次史诗级大爆炸,强测中四个死锁让人猝不及防,最终还是采取暴力方式进行debug的。

我们至今仍未知道那天电梯死锁的原因。

第三单元

第三单元是JML约束编程,由于每个需要实现的方法都已经给予了限定的规格,因此这个单元可以说是在强行纠正学生的架构设计习惯,在本单元中,面向对象的思想体现的十分明显,每一个类调用其自身的方法协作工作,共同完成一个网络图的构建。

第四单元

第四单元也是类似图论的设计,这个单元虽然没有了那么严格的规格,但是我在写代码的过程中可以明显的感受到,前一单元中面向规格编程培养了我写代码的好习惯,无论多复杂的结构,我都可以进行很有条理的分层建构,规划实现。直到这时,我才感觉自己算是开始把握到OO这门课的脉络,开始理解一个面向对象的大型程序设计应该做成什么样。可以说,在这四个单元的不断学习中,我的架构设计能力与面向对象思维在不断的进步,这门课为我今后进行程序设计打下了不可替代的基础。


3、测试理解与实践

不同于计组全程在讨论区白嫖测评机和测试数据,在OO课中我在每一次作业都进行了测评机的搭建与测试数据的编写。由于高工的学习压力比较大,对于像我这样的程序小白来说,一个人折腾出一整套具有完整体系的评测机较为困难,因此,我们建了一个“小圈子”,几个同学在一起互相分工,搭建具有完整功能的测评机。

image

测评机主要分为三个部分,即驱动,数据以及评测。整个驱动部分基本完全由室友dl完成,从自动编译到运行,以及可能出现的多进程并发与TLE程序杀除,一条龙服务。只要把项目文件放在对应的文件夹中之后,其余工作都可以全自动的完成。(他还写了个邮件系统)

FJHNB!

数据生成在四个单元中略有不同。

第一单元的数据主要运用正则表达式进行生成,其中涉及到递归下降原理,第一次接触时可能较为困难,但理解之后会发现数据生成的代码量并不大。

第二单元的数据基本全随机实现即可(当然也可以针对性的构造较强数据),写起来较为简单。

第三单元的数据理论上也可以全随机(当然这会导致疯狂异常,整个数据下来没有几行有效的就是了)。另外一种方式就是在数据生成器中也构建网络图,这样可以地毯式排查所有可能的错误项。第三单元的数据基本全部由我完成,1400行的生成器化作死神的镰刀,只需要一个测试点便能将一个程序除性能问题以外的所有错误全部暴露。

第四单元的数据在实现原理上与第三单元类似,但相对更加复杂,不过如果不追求用一个测试点将有bug的代码hack的体无完肤(也很难吧应该),实现起来也不会特别困难,只要测试的测试点够多,一般的错误也可以被查出来,只是可能有点晚而已。

image

评测部分是对运行结果的检验。也许是巧合,前两个单元每个人的输出可能不一样,无法对拍,但直接检验结果正确性的程序相对简单。后两个单元若想直接检验结果,不亚于重新写一遍OO(还得保证不错),但由于每个人输出相同,通过对拍即可。

第一单元的正确性检验采用的是python中的sympy库,可以帮助实现求导。

第二单元的正确性检验采用的是状态机原理,针对电梯构建状态机,若落入异常状态则说明程序错误。

除了测评机搭建之外,还构造了相对极端的手动数据进行测试,也找到了一些bug。


4、课程收获

毫不夸张的说,OO是我上大学以来,我认为学过的所有课中最有用的一门,没有之一。

首先,这门课让我第一次接触较大型的程序设计,之前学习C语言和数据结构时,基本都是针对某一种算法写一个小的代码,这也是OO一开始感觉自己架构设计比较差的原因。但经过这门课之后,我今后再拿到一个较大的程序项目会知道从哪里入手,怎么去进行设计,这可以说是一个计算机系的学生质的飞跃。

其次,这门课让我学会了如何去对程序进行测试。搭建测评机即能帮助找到自己程序的bug,也能进一步的锻炼自己的代码能力。这种能力在今后的软件开发中也十分重要。

再者,OO课锻炼了我的协作能力,在整个课程的学习中,没有同学们的互相帮助,我们不可能在每次作业中都进行很好的测试。


5、三个改进建议

  1. 在pre中可以新增一些内容,让同学们提前接触到多线程(最起码是了解)的内容,否则在第一单元结束后进入第二单元会非常,非常,非常痛苦。有必要的话开设前导课程。
  2. 增开查看实验成绩的渠道。OO每次课上实验的内容都十分的有代表性,能增进我们的设计能力和对理论知识的理解,如果在进行完实验后能得知成绩的话,会得到更好的反馈效果。
  3. 指导书在编写的时候可以更加注意一些语言上的细节,让同学们能够顺利理解,不产生歧义,这样也能减少讨论区中因为指导书文字问题而产生的过量时间消耗。

在这篇博客完成后,OO课程也就告一段落了。

12次作业,4篇博客,8次课上实验,1次研讨

我曾因为一个本地似乎永远也测不出,却连中测都过不了的bug寝食难安,用到了最后一次无代价提交机会才将测试通过。

我曾因为强测中突如其来的死锁而猝不及防,将自己的整个程序来回翻阅,去寻找可能的疑点。

我曾因为研讨课上因为一个不严谨的叙述被同学毫不留情的当面指出,万分尴尬。

我曾因为写代码时的疏忽,让提交的代码中出现了个人信息,幸好提前发现,万分焦急的去找助教解释才得以解决。

这门课给了我太多太多打击,让我摔了无数个跟头。

但我清楚地记得,每一次强测拿到满分时,内心的无比喜悦。

但我清楚地记得,每一次在找出自己的一个bug时,那种紧张和庆幸。

但我清楚地记得,在自己理解需求原理后,给身边同学讲解时的自豪。

我时常在想,这门课带给我的是什么?

学习一种新的语言?代码练习?还是更高的分数?

或许,更多的是一种跨越,让我从一个只会埋头写代码的小白,到一个能敢于去挑战软件设计的程序员的跨越。

“OO”,这两个圆圈,就好像一副望远镜,让我的视野更加宽阔,能看到更多从原来学习的课程中看不到的东西。

而这些东西,正是成为一个合格的程序开发者所必须的,或是基本能力,或是核心素养,或是在面对一些事物时展现出的心态。

或许在多年以后,我不再记得清楚这门课的内容,不再能说出我在作业中究竟写了些什么。

但我相信,这门课对我的改变,对我的塑造,是永远无法被抹去的,它会贯穿我的整个人生,并时时刻刻,默默发挥着作用。

那些曾在清晨,在傍晚,在宿舍,在图书馆,在课间,在课上完成的代码。

那些曾为了完成作业熬下的每一夜。

我们,

就此别过。

image

第九周课程总结&实验报告(代码片段)

第九周课程总结&实验报告(七)实验任务详情:要求:(1)总票数1000张;(2)10个窗口同时开始卖票;(3)卖票过程延时1秒钟;(4)不能出现一票多卖或卖出负数号票的情况。实验代码:packageproject7;classMyThreadimplementsRunna... 查看详情

oo第四单元uml&课程总结(代码片段)

oo第四单元UML&课程总结一、总结本单元作业的架构设计​ 本单元的作业是写一个UML图的解析器,而具体的将UML图解析成一个个的UmlElement元素的过程已经在官方包中给出,我们需要做的就是对UmlElement中的元素进行组织与数据... 查看详情

第八周课程总结&实验报告(代码片段)

实验六Java异常一、实验目的理解异常的基本概念;掌握异常处理方法及熟悉常见异常的捕获方法。二、实验要求练习捕获异常、声明异常、抛出异常的方法、熟悉try和catch子句的使用。掌握自定义异常类的方法。三、实验内容1... 查看详情

第九周课程总结&实验报告(代码片段)

JavaioIO流用来处理设备之间的数据传输,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行的。java.io包下提供了各种“流”类的接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。流的分类1.按照... 查看详情

12-1课程总结(代码片段)

....网络编程篇2.数据库篇3.Web框架篇4.系统设计篇5.面试经验总结二、Python基础高频考点Python语言基础考察点1.Python特性:装饰器、生成器与协程、异常处理2.常用内 查看详情

第九周课程总结&实验报告(代码片段)

实验内容:源代码:主类:packageexercise;publicclassTrainStationTicketSalesimplementsRunnableprivateintticket=1000;publicvoidrun()for(inti=0;i<1000;i++)this.sale();ticket--;publicsynchronizedvoidsale()if(ticket>=0)tryThread.sleep(100);catch(InterruptedExceptione)e.printStackTrace();... 查看详情

第七周课程总结&实验报告(代码片段)

第七周课程总结一、接口的实际应用接口在实际中更多的作用是用来制定标准的。抽象类和接口的的关系No.区别点抽象类接口1定义包含一个抽象方法的类抽象方法和全局常量的集合2组成构造方法、抽象方法、普通方法、常量、... 查看详情

课程学习总结报告(代码片段)

课程学习总结报告目录课程学习总结报告一.准备二.学习过程ILinux内核II进程管理1进程的数据结构分析2进程创建3进程调度4数据结构:栈5进程的生命周期可以通过如下的图进行一个总结:III存储器管理IV文件系统V设备驱动程序三... 查看详情

课程总结(代码片段)

java部分知识点:1.&和&&的区别&:逻辑与(and),运算符两边的表达式均为true时,整个结果才为true。&&:短路与,如果第一个表达式为false时,第二个表达式就不会计算了。2.重载和重写的区别重载(Overload):函... 查看详情

课程总结(代码片段)

java部分知识点1.&和&&的区别&:逻辑与(and),运算符两边的表达式均为true时,整个结果才为true。&&:短路与,如果第一个表达式为false时,第二个表达式就不会计算了。2.重载和重写的区别重载(Overload):函数... 查看详情

第九周课程总结&实验报告(代码片段)

课程总结1、继承Thread类创建线程:Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法... 查看详情

第七周课程总结&实验报告(代码片段)

课程总结主要学习了抽象类与接口的应用1.抽象类的成员可以具有访问级别接口的成员全部public级别2.抽象类可以包含字段接口不可以3.抽象类可以继承接口接口不能继承抽象类4.抽象类的成员可以具有具体实现接口不行5.抽象的... 查看详情

第八周课程总结&实验报告(代码片段)

第八周课程总结&实验报告(六)一、实验目的(1)理解异常的基本概念;(2)掌握异常处理方法及熟悉常见异常的捕获方法。二、实验要求(1)练习捕获异常、声明异常、抛出异常的方法、熟悉try和catch子句的使用(2)掌... 查看详情

课程设计第三次实验总结(代码片段)

1.实验项目名称空战游戏2.实验项目功能描述利用数组进一步该井空战游戏,实现多台敌机,发射散弹等效果;3.项目模块介绍//清屏功能voidHideCuresor()CONSOLE_CURSOR_INFOcursor_info=1,0;SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info... 查看详情

第八周课程总结&实验报告(代码片段)

实验报告六编写一个类,在其main()方法中创建一个一维数组,在try字句中访问数组元素,使其产生ArrayIndexOutOfBoundsException异常。在catch子句里捕获此异常对象,并且打印“数组越界”信息,加一个finally子句,打印一条信息以证明... 查看详情

课程总结(代码片段)

一、课程总结第二周课程总结第三周课程总结第四周课程总结第五周课程总结第六周课程总结第七周课程总结第八周课程总结第九周课程总结第十周课程总结第十一周课程总结第十二周课程总结第十三周课程总结第十四周课程总... 查看详情

第七周课程总结&实验报告(代码片段)

第七周课程总结&实验报告(五)实验四类的继承实验目的理解抽象类与接口的使用;了解包的作用,掌握包的设计方法。实验要求掌握使用抽象类的方法。掌握使用系统接口的技术和创建自定义接口的方法。了解Java系统包的... 查看详情

第八周课程总结&实验报告(代码片段)

第八周课程总结&实验报告(六)实验六 Java异常实验目的理解异常的基本概念;掌握异常处理方法及熟悉常见异常的捕获方法。实验要求练习捕获异常、声明异常、抛出异常的方法、熟悉try和catch子句的使用。掌握自定义... 查看详情