OO第二单元单元总结

总述

  OO的第二单元主题是电梯调度,与第一单元注重对数据的输入输出的处理、性能的优化不同,第二单元的重心更多的是在线程安全与线程通信上。这此次单元实验之前,我并未对线程有过了解,更谈不上“使用经验”,整体上第二单元三个实验也做的较为吃力。三次实验,也算是对线程的一步步入门吧,以及由于对于线程不是很熟悉,所以我总是下意识的把程序分割,尽量减少通信量。

第一次实验

  基本需求:单电梯、无捎带要求、基本无性能要求。

  基本实现:一个主线程或者一个主线程与一个电梯线程

  我采用的方法是使用一个主线程,因为实际上,对于第一个实验唯一让人认为要使用线程的地方可能就是模拟电梯上下层所需要的时间了,但是事实上我们可以通过让主线程sleep的方式来完成此功能。以下是相关类图....

  总结:第一次实验是入门的铺垫,对于线程相关要求很低,对于我而言,可以说是给予了一定的缓存时间来完成两个之间单元的切换。

第二次实验

  基本需求:单电梯、傻瓜式捎带。

  基本实现:多线程

  第二次实验与第一次实验最大的不同在于,由于存在捎带也就有了一定的性能要求,故而很难去用一个主线程去做。事实上,我认为如果牺牲性能,就第二单元的电梯调度而言,是可以用一个主线程去模拟的。一个显而易见的做法就是一次只乘一个人。不过这又是另外的事情了。话说回来,第二次实验我采用的方法是,一个主线程负责接收请求,一个电梯线程负责模拟电梯的运行以及内部自行调度

  说到调度,由于电梯运行是一个在线问题,关于调度的优化算法很难去证明是否有效(严格证明优化算法的期望性能是一件很难的事情),即使做出了期望性能优秀的算法,还有可能会因为数据的边界性而表现糟糕。总的而言,就是很难优化,优化了之后也不见得有什么用。基于以上思想,对于调度算法,我的实现并不复杂,基本是按照指导书的傻瓜式捎带而写成的。

  这里值得一提的是,采用贪心可能有一定效果,不过最终还是看脸,至于其他的许多算法感觉都是在面向个例优化(这里只是个人感觉,无其他任何意思)。以下是第二次电梯的相关类图

  总结:从日常交流来看,第二次实验有许多大佬花了很多时间在做相关调度优化。而我由于实力有限,把重心主要放在了对线程的安全、线程的通信控制上面,我的理念是降低耦合,降低结构复杂度,能不锁就不锁,能自己分析清楚的,就不交给安全机制来写。

第三次实验

  基本需求:多电梯多楼层、捎带换乘,有一定性能的要求。

  基本实现:多线程

  第三次实验在第二次的基础上,增加了电梯的数量,并且每一个电梯有了自己的容量、区间、运行时间等等信息。并且在这种情况下,对程序的性能提出了要求。我采用的方法与第二次实验类似使用一个主线程处理请求,另外设置一个电梯线程来负责调度。之所以这样做,一方面是自己懒惰了,另一方面也是过于相信自己的码力了,到最后才发现自己驾驭不了。以下是第三次实验的类图。

  总结:第三次实验我的强测分没有及格,究其原因一方面是没有进行有效的对拍测试,一方面是过于注重对于线程安全方面的考量而忽略了程序本身的业务逻辑。不过这也是由于缺乏信心,多线程还是接触的少了,总是担心会出现各种线程安全的问题。

Bug分析及相关测试策略

  三次实验我都没有去测试其他同学,主要是因为多线程本身的不确定性,以及对于多线程很难去对拍测试实现自动化,又不想用其他人的。所以最后结果就是自己被测爆了。不过私下交流主流的测试策略应该都是实现自动化,然后随机数据跑,判断结果的正确性就按照指导书的正确性判断思路。

  在第三次实验,我在强测中出现了bug,在互测中也被同学发现了bug,具体bug原因是因为我的调度逻辑考虑的不周全,具体情况是,在某些情况下,一个电梯可能会在同一个楼层反复接一个人,这虽然只是影响性能,但是由于我的设计中压根没有想到有这种情况发生,所以导致了我的电梯会出现连续arrive同一层的错误输出。修改起来还是挺方便的,对于arrive的输出判断一下就行了。

心得体会:

  线程安全总是会纠结“加不加锁”、“加几个锁”,“加多了结构复杂怎么办”等等问题,我在三次实验中对于线程安全的处理总原则就是,能不加就不加,能不写锁就不写锁,能降耦合就降耦合。

  这样做的好处就是程序的结构不会看起来特别的复杂、零乱,坏处就是对于一些隐式的线程安全问题的分析,需要考虑全面,否则容易造成死锁等等。

有得有失吧,其实有时候程序的结构复杂一点,也只是编码上繁琐 一点吧,实现上还是挺方便的,这一点仁者见仁,智者见智吧。

原文地址:https://www.cnblogs.com/backkom-buaa/p/10753315.html

时间: 2024-08-01 04:38:22

OO第二单元单元总结的相关文章

规格化设计——OO第三单元总结

规格化设计--OO第三单元总结 一.JML语言理论基础.应用工具链 1.1 JML语言 ? JML(java modeling language)是一种描述代码行为的语言,包括前置条件.副作用等等.JML是一种行为接口规格语言 (Behavior Interface Speci?cation Language,BISL),基于Larch方法构建. ? 通过使用JML,我们可以忽略一个类.一个方法内部的具体实现,专注于描述方法的预期功能,从而把过程性的思考延迟到方法设计中,扩展了面向对象设计的原则

OO第三单元总结 JML

OO第三单元总结 JML JML语言的理论基础.应用工具链情况 JML是一种形式化的,面向JAVA的行为接口规格语言,它结合了Eiffel的契约方法和Larch方法,以及细化演算的一些元素,有着坚实的理论基础. JML最主要的语法有前置条件,后置条件,不变式,通过这些语法对输入和输出进行约束,也就是达成了一种契约.当模块实现后,只要输入输出满足这些约束表达式就满足了规格的要求.JML主要使用java的语法,除此之外还有自己的一些语法,比如/forall,/exist等等,来实现对输入输出的约束.

Class撑起了OOP世界的天。Class类是OO的基本单元,OO的世界都是通过一个一个的类协作完成的,提高软件的重用性、灵活性和扩展性(转)

引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的“社会”关系,从而让我们抛弃书上的那些死记硬背的概念,快速理解他们的区别与联系? 如果大家觉得还有必要把这块更新的更好,还请多多反馈. 如果觉的对您有用还请点击 “推荐”下,我会持续更新更多新的内容. 古老的传说 相传盘古开天劈地后,女娲一天在黄河边梳头时,突发奇想以泥土仿照自己抟土造人,创造并构建人类社会.后来又替人类立下了婚姻制度,经过一代又一

OO第三单元总结(规格设计)

OO第三单元总结 一.关于JML Java Modeling Language,即JML是一种规格化表示语言,主要用于对Java程序的各种方法功能的规范描述.这样做既可以给程序设计人员明确清晰的功能要求,又可以充分全面地验证已有的代码实现保证其满足规格描述的要求. 1.语法梳理 JML的语法清晰直观地描述了一个Java的各种特征.它的语法主要由以下三个部分组成. (1)表达式: 诸如 \result \old等有具体确定意义的固定关键词称为表达式.通过不同的搭配组合可以表示不同的含义,比如(\f

网易云课堂_C++程序设计入门(下)_第11单元:工欲善其事必先利其器 - STL简介_第11单元 - 单元作业1:OJ编程 - vector 与 sort

第11单元 - 单元作业1:OJ编程 - vector 与 sort 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 本次作业练习使用 vector 容器以及 sort 算法,对输入的数据进行排序 依照学术诚信条款,我保证此作业是本人独立完成的. 1 本次作业练习使用 vector 容器以及 sort 算法,对输入的数据进行排序(5分) 题目的具体内容参见 [第

网易云课堂_C++程序设计入门(下)_第10单元:月映千江未减明 – 模板_第10单元 - 单元作业:OJ编程 - 创建数组类模板

第10单元 - 单元作业:OJ编程 - 创建数组类模板 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 本单元作业练习创建模板类.单元作业会涉及冒泡排序.线性查找等算法.如果对排序.查找不熟悉,可以自行baidu或者google 依照学术诚信条款,我保证此作业是本人独立完成的. 1 编写一个数组类模板 Array,能够存储不同类型的数组元素.对数组元素进行查找.

OO第四单元总结~~

紧张刺激的一学期OO课程结束了,咸鱼们留下了悲喜交加的泪水.在说这整个学期的OO感想之前,先总结一下第四单元学到的知识. 一.第四单元总结 这一单元我们学习了UML有关的内容. 首先是理论课学习了什么是类图,类与类之间都有什么关系,怎样在类图中进行体现.实验课学习了如何使用StarUML绘制UML图. 第一次作业只有关于UML类图的查询,但是这一部分我认为实现的难度还是很大的.主要是第一次接触这样的作业,对于UmlElement解析出来的各个元素里所包含的各个内容都不是很了解,所以这两次的作业都

OO第三单元总结

JML语言理论基础 Java建模语言(Java Modeling Language,JML)是一种进行详细设计的符号语言,他鼓励你用一种全新的方式来看待Java的类和方法.JML是一种行为接口规格语言 (Behavior Interface Speci?cation Language,BISL),基于Larch方法构建.BISL提供了对方法和类型的规格定义手段.所谓接口即一个方法或类型外部可见的内容.通过在Java代码中增加了一些符号,这些符号用来标识一个方法是干什么的,却并不关心它的实现.使用

OO第三单元总结-规格化设计

OO规格化编程体验小结 1. JML语言的理论基础.应用工具链情况 JML 理论基础: JML建立契约式编程的基础上,是一种实现契约式编程的规格化语言.顾名思义,契约式编程,是供求双方建立在一定的契约上进行软件的开发和应用.类似于在共同完成这一个工程的时候我们对于每个方法都以一个供求双方都统一并且详细知晓的合同,在这个合同上,供应方要不多不少完成合同上的所有要求,需求方的可提出的需求范围只限于合同上的明确条文.这样同时明确了双方的权利和义务.而产生契约式编程的背景是很多工程的开发过程权责混乱,导