BUAA_OO_第二单元作业总结

程序设计策略

第一次作业

第一次作业实现的是FAFS式傻瓜调度电梯,由于是第一次接触多线程,难度不是很大。在我的设计里,我借鉴了生产者消费者模式,设计了一个输入线程和一个电梯线程,控制器的设计使用了单例模式,维护了一个请求队列,作为托盘使用。在运行时,输入线程负责向请求队列提供请求,电梯线程负责拿取请求,并运行到指定楼层。这次作业的缺点是,我设计的控制器较为鸡肋,其实质只是一个存储调度指令的队列,我将具体的运行逻辑全写在了电梯里面。由于电梯是傻瓜式调度,这样的设计在正确性上没有出现问题,但是导致了扩展性很差,使得我在做第二次作业时不得不重写了电梯运行的逻辑和控制器的绝大部分内容。

第二次作业

这一次作业要求实现一个可稍带的ALS电梯。由于上述第一次设计的缺陷,我重构了控制器和电梯逻辑。调度策略方面采用了近似look的策略。线程个数保持不变,输入线程保持不变,电梯线程进行了较大的改动,我将所有的运行逻辑全部剥离,电梯只负责进行上人、下人、开门、关门、沿运动方向移动一层的原子操作,而控制器负责维护一个请求队列,负责所有的请求处理。即电梯每次上行或者下行一层都要向控制器发送自身状态,控制器获取状态后,遍历整个请求队列,选出同方向捎带的进入请求和到达请求给予电梯,同时控制器修改队列里的请求状态,将到站的请求删除。电梯获取请求后根据请求内容决定是否执行上人、下人、开门、关门、沿运动方向移动一层,到了下一层再获取新的请求。
为了实现以上逻辑,我电梯里新增了几个电梯状态参数:最远到达楼层、电梯运行方向、空闲位。每次电梯运送同方向的人时修改最远到达楼层。如果到了一次运行的最远到达楼层且没有同方向的可稍带请求,那么就将空闲位置位。控制器发现有空闲电梯时,就会使电梯向目前的请求队列的第一个请求移动。若当前请求队列为空,则使电梯静止空等。
这一次作业我认为设计的保证了正确性,实现了不同模块之间的独立性。性能上有待改进的是空闲时,可以让电梯运行,而非空等。

第三次作业

这一次作业要求多部多线程智能(SS)电梯的实现。有了第二次作业的架构设计,这一次作业的主要任务就是进行了限定人数、楼层、运行速度等新增要求的扩展,还有多线程运行时的线程安全问题。为了满足人数、楼层的要求,我又在电梯类里新增了电梯的楼层、当前人员序列,传给控制器获取请求时也增加了这两个成员。为了应对请求需要拆分成多部电梯的情况,我将人员请求设计成了一个类,每个请求在读入时,按照周转楼层最少的原则进行拆分,每个人员内部建立一个请求队列,人员再组成一个大的请求队列。控制器逻辑加入了楼层判断、人满判断,其余同上一次大致相同。同时在设计时还注意了从请求队列里遍历时,只能判断每个人员内部队列的第一个请求,这是保证人员必须完成第一个请求才能换乘电梯,防止出现时序问题。
这一次作业可优化的地方有不少,例如把根据电梯实际运行情况实时切分请求、根据电梯负载分配新请求等等。

程序度量分析

第一次作业

类图

1644090-20190424204626025-1831016299.png

类复杂度

1644090-20190424203921544-1657846474.png

方法复杂度

1644090-20190424203940981-568064036.png

时序图

1644090-20190424203958827-1629689924.png

SOLID设计原则评价:

SOLID原则分析

  • SRP:几乎所有的调度逻辑全部丢给了电梯类,控制器几乎无作用。
  • OCP:由于电梯类包含了太多的运行逻辑,可扩展性较差,分配逻辑扩展起来很困难。
  • LSP:没有使用继承
  • ISP:未实现接口类
  • DIP:由于采用生产者消费者模式,输入和输出模块互不依赖。

第二次作业

类图

1644090-20190424205402179-277812705.png

类复杂度

1644090-20190424205419359-2073668493.png

方法复杂度

1644090-20190424205411698-858335698.png

时序图

1644090-20190424205426260-1841740810.png

1644090-20190424205434369-1137726169.png

SOLID设计原则评价:

SOLID原则分析

  • SRP:调度器仅负责调度,电梯仅运行进行运行的原子操作,职责划分明确。
  • OCP:由于将所有运行控制部分从电梯里抽离,所以新增功能时可以轻松地扩展属性、增添调度逻辑
  • LSP:没有使用继承
  • ISP:未实现接口类
  • DIP:输入和输出模块互不依赖,但控制器调度需要获取电梯属性,依赖电梯的具体状态。

第三次作业

类图

1644090-20190424211225726-1049736765.png

类复杂度

1644090-20190424211247780-596360745.png

方法复杂度

1644090-20190424211238362-573455448.png

时序图

1644090-20190424211301559-1246989443.png

1644090-20190424211304687-883765956.png

SOLID设计原则评价:

SOLID原则分析

  • SRP:调度器仅负责调度,各个电梯仅运行运行的原子操作,职责划分明确,互不影响。
  • OCP:由于电梯参数在构造方法时传入,所以支持新增电梯或者属性的扩展。
  • LSP:没有使用继承
  • ISP:未实现接口类
  • DIP:输入和输出模块互不依赖,各个电梯互相不知道彼此存在,调度器通过一个消息类抽象与电梯通信。

bug相关

个人bug

在这个单元作业中,由于前两次的调度策略较简单,也没有较大的线程安全问题,我前两次作业都没有出现正确性问题。但第三次作业中,我在强测时出现了线程安全问题。举例说明我的问题:处理请求999-FROM-3-TO-2时,先拆分成999-FROM-3-TO-1以及999-FROM-1-TO-2。由于存在同步问题,可能导致在1楼换乘时,先输出IN-999-1-B再输出OUT-999-1-C的错误。这说明问题在于输出和修改人员状态的不同步。在原来的设计中,我实现的方法是在调度器修改人员状态(在哪部电梯上),同时将进电梯和出电梯的人员以列表形式传给电梯,由电梯进行输出In和out信息。这就可能导致在一个线程对一个人员状态进行修改后还未来得及输出,另一个线程就进行了下一次操作。
修改措施是增加了修改状态的判断,控制器在修改人员状态时,会判断人员是否在电梯内。若人员已不在电梯内,则证明已经输出了out,可以修改状态;否则不修改。

hack相关

第一次作业较简单,同组都是满分,没有正确性问题。第二次作业开始,除了随机生成数据以外,我hack别人时采用的策略主要来自于个人写程序时出现的问题,有以下几点:1.一层重复开关门问题,这类问题往往是判断是否转向运行时容易出现的,因此构造1-2-1这样的反复转向数据。2.开关门的间隔上人问题,这类问题主要出现在可能设计出了开关门的0.4秒不能上人的问题,针对这一点可以构造【0.0】n条请求,【0.4】n条请求这类数据,若没有在边界时间带人,很容易就会超时。但由于取消了T_max限制 ,hack他人时,基本也没出现正确性问题,倒是随机生成的简单至[0.0]1-FROM-1-TO--1这样的数据hack到了人。
第三次作业则是hack的重灾区,不幸中的万幸是我没有被hack出来强测的错误,这可能是由于相关样例不好构造的缘故。由于这次作业完成的时间紧张,我主要时随机生成数据,生成结果后再交给检查程序检查。在查看他人代码时,我发现电梯调度策略多种多样,问题也出现的各种各样,理清一个人的思路已实属不易,找出程序运行的逻辑更是难,所以我只着重查看了两个方面,一个是调度队列的同步问题,另一个是TimableOutput线程不安全问题。

这一单元与第一单元的测试策略相比,着重点从边界数据转移到了线程安全问题上,构造一些针对线程安全的数据(例如请求拆分、队列加锁、输出安全等)更容易得分。

总结

这一单元的重点是多线程相关问题,包括线程安全、线程同步设计等。重中之重就是线程安全的确保,在这一单元自己写出的bug无一不是线程安全导致的时序同步问题。相比第一单元,算法部分减少了,但多线程并发的问题更加棘手。另外的难点是调试部分,一行行print输出确实很考验人的耐心。电梯控制逻辑嵌套也很多,把所有情况分析全面很困难。总之,这一单元充满了挑战,也让我收获不少。希望在之后的面向对象课程学习里,我能继续努力,考虑更加全面,保证程序的正确性。

转载于:https://www.cnblogs.com/codearning/p/10760479.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux的常用操作——静态库

1.静态库的制作 1.1静态库的命名 \qquad静态库一律使用lib打头,静态库名为:lib静态库的名字.a。比如:libmylibrary.a,这里面lib和.a是必须要有的。使用nm命令可以查看静态库。 nm 静态库名1.2静态库的制作步骤 \qquad第一步&…

蓝桥杯 回文日期

模拟 n int(input())def check(x):m int(x[:2])d int(x[2:4])x int(x)if 1<m<12:if m 2:if (x%40 and x%100!0) or x%4000:if d<29:return Trueelse:return Falseelse: if d<28:return Trueelse:return Falseif m in [1,3,5,7,8,10,12]:if d<31:return Tr…

因果推断研究获2021诺贝尔经济学奖

来源&#xff1a;集智俱乐部 北京时间2021 年 10 月 11 日 17 时许&#xff0c;2021 年诺贝尔经济学奖&#xff0c;授予了三位经济学家——David Card因为对“对劳动经济学的实证研究贡献”而获得一半奖金&#xff0c;Joshua D. Angrist和Guido W. Imbens因“对因果关系分析的方…

Leetcode 82. Remove Duplicates from Sorted List II

利用一个虚拟头节点,和维护一个前置节点. # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val x # self.next Noneclass Solution:def deleteDuplicates(self, head: ListNode) -> ListNode:if not head o…

【计算机网络复习】1.1.1 概念、组成、功能和分类

概念、组成、功能和分类二、功能三、组成四、分类计算机网络&#xff1a;是一个将分散的、具有独立功能的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。 计算机网络是互连的、自治的计算机集合。 互连 — 互…

linux的常用操作——共享库

1.共享库的命名规则 \qquad共享库&#xff0c;即动态库。库名&#xff1a; lib库名.so 2.共享库的制作 2.1生成与位置无关的.o文件 gcc -fpic -c filename.c -I 头文件路径2.2生成共享库 gcc -shared -o 共享库名 要打包的.o文件 -I 头文件路径2.3生成可执行文件 gcc file…

因果表征学习最新综述:连接因果科学和机器学习的桥梁

来源&#xff1a;集智俱乐部作者&#xff1a;蔡心宇审校&#xff1a;龚鹤扬、陆超超编辑&#xff1a;邓一雪论文题目&#xff1a;Towards Causal Representation Learning论文地址&#xff1a;https://arxiv.org/abs/2102.11107这篇名为Towards Causal Representation Learning…

【计算机网络复习】1.1.2 标准化工作及相关组织

标准化工作及相关组织一、标准化工作二、标准化工作的相关组织一、标准化工作 标准 法定标准&#xff1a;由权威机构指定的正式的、合法的标准&#xff08;如OSI&#xff09;事实标准&#xff1a;某些公司的产品在竞争中占据了主流&#xff0c;时间长了&#xff0c;这些产品中…

推荐几个练习听力不错的国外网站

http://www.uptoten.com/ 是美国针对学前教育&#xff08;0到10岁&#xff09;的听力网站&#xff0c;主题非常丰富&#xff0c;拥有大量英文歌曲、卡通片、绘画、游戏等栏目&#xff0c;启发儿童在艺术、健康、语言、社会、科学多元思维能力&#xff0c;在好玩又有趣的氛围下&…

linux的常用操作——程序调试gdb

1.如何在linux下调试程序&#xff1f; \qquad在进行程序编译时&#xff0c;如果需要调试&#xff0c;那么需要加入调试指令。 gcc filename.c -o 可执行文件名 -g\qquad对程序进行调试 gdb 可执行文件名2.调试的基础操作 \qquad在gdb的界面下的操作&#xff1a;查看 l #默认…

这种记忆技术在弯曲时更好?

A new kind of flexible phase change memory is tested while bent around a 4-millimeter-diameter rod. A.I. KHAN AND A. DAUS来源&#xff1a;IEEE电气电子工程师新的相变存储器需要更少的能量&#xff0c;部分原因是它是建立在塑料上的&#xff1f;要想让粘贴式显示器、…

【计算机网络复习】1.1.3 速率相关的性能指标

速率相关的性能指标一、速率二、带宽三、吞吐量一、速率 速率即数据率或称数据传输率或比特率。 比特 &#xff1a; 1/0 位 连接在计算机网络上的主机在数字信道上传送数据位数的速率。 单位是b/s&#xff0c;kb/s&#xff0c;Mb/s&#xff0c;Gb/s&#xff0c;Tb/s 速率 …

linux的常用操作——makefile

1.makefile是什么&#xff1f; \qquadmakefile是linux下的一个代码管理工具。 2.makefile文件的命名 \qquadmakefile的命名&#xff1a;首字母大写即&#xff1a;Makefile&#xff1b;或者全部小写&#xff1a;makefile。 3.makefile文件的规则 \qquad规则三要素&#xff1a;…

接口与内部类

1.什么是接口(B) 接口是一种引用数据类型&#xff0c;用interface声明&#xff1b;当出现interface便可判断为接口。 形式&#xff1a;【修饰符】 interface 接口名称(public interface Pepar{ }) 接口可声明属性&#xff0c;且属性都默认为static final 1 public interface Pa…

深度学习为何泛化的那么好?秘密或许隐藏在内核机中

来源&#xff1a;AI科技评论编译&#xff1a;杏花编辑 &#xff1a;青暮在机器学习领域&#xff0c;人工神经网络逐年扩大规模&#xff0c;并取得了巨大成功&#xff0c;但同时它也制造了一个概念性难题。当一个名为 AlexNet网络在2012年赢得年度图像识别比赛时&#xff0c;大约…

linux的常用操作——压缩和解压缩

1.gzip和bzip2 \qquadgzip和bzip2的处理解压和压缩的功能并不强大&#xff0c;一是&#xff1a;不能处理打包压缩&#xff1b;二是&#xff1a;gzip压缩不保留原文件&#xff0c;bzip2 -k 要压缩的文件可以保留原文件&#xff1b;三是&#xff1a;只能压缩文件&#xff0c;不能…

【计算机网络复习】1.1.4 时延、时延带宽积、RRT和利用率

时延、时延带宽积、RRT和利用率一、时延二、时延带宽积三、往返时延RTT一、时延 传输时延&#xff08;发送时延&#xff09;&#xff1a;数据从结点发送到链路上的时间 传输时延 数据长度/网络带宽&#xff0c;由网络带宽、数据长度决定 传播时延&#xff1a;信号从链路的一端…

华为汪涛:无线网络未来十年十大趋势

来源&#xff1a;通信产业网2021全球移动宽带论坛&#xff08;Global MBB Forum&#xff09;期间&#xff0c;华为常务董事、ICT基础设施业务管理委员会主任汪涛发表了题为“走向智能世界2030&#xff0c;无线网络未来十年十大趋势”的主题演讲。华为常务董事、ICT基础设施业务…

mount 挂载光盘

1 查看光盘情况 ls_l /dev|grep cdrom 2 创建光盘挂载点 3 执行mount 命令 mount -t iso9660 /dev/sr2 /media 转载于:https://www.cnblogs.com/CandiceW/p/10773865.html