• 电梯作业总结


    一、电梯作业的设计策略

    自己的设计基于 blockqueue 框架。且三次作业都是同一个设计策略。

    核心数据结构是一个阻塞队列,用于保存请求队列,其他模块主要是与该队列交互。

    请求生成器:用于获得请求,并将请求加入请求队列。

    请求调度器:用于将请求派给不同的电梯。

    电梯:用于处理被分配的请求。

    在第二次作业时,只是修改了电梯对于执行请求的策略,增加了捎带功能。

    在第三次作业时,只是复制了两部电梯,其行为模式完全相同,但是请求调度器给其分配的请求种类有差别。另外,乘客在下电梯时,若其没到最终目的地,则由电梯修改其出发地后将请求加入队列。请求调度器无法区分由电梯加入的请求和请求生成器加入的请求。

    二、代码分析

    1、类图

    由上可以看出,Customline 扮演着核心数据结构的角色,其他类主要都是与其交互。另外,ElevatroSimulation 扮演着启动其他线程以及最后关闭线程的角色。ElevatroManager 主要与电梯互动。

    2、静态分析

    Unutilized Abstraction: This smell arises when an abstraction is left unused(either not directly used or not reachable).

    Cyclic-Dependent Modularization: This smell arises when a cycle appears in  the model dependent graph.

    自己目前对这些设计方面存在的问题还不能很好的理解,对于其导致的问题还没有经验。

    Long Parameter List:  将关系密切的参数打包为类。

    Complex Method: 识别出方法中逻辑集中的块区,将其封装为函数。

    Empty catch clause: 不偷懒就可以解决。

    Long Statement: 语句分拆解决。

    Complex Conditional: 这能通过将条件封装为函数或者拆分条件解决。

    Magic Number: 这能通过定义常量或者枚举类型解决。

    NOF: Number of Fields, 其中 Elevator 的域明显有点多,可以考虑拆分。

    NOPF: Number of Public Fields。

    NOM: Number of Methods,可以看出自己实现功能的核心类是 Elevator, Customer.

    NOPM: Number of Public Methods, 其中Customer占据了大部分,其提供的功能由其全体对象共享。

    LOC: Lines of Code, 其中 Elevator 的长度超过其他类两倍,说明自己这一部分对于函数功能没有清晰划分,致使函数过长。

    WMC: Weighed Methods per Class, 依然可以看出,自己的 Elevator 类提供了绝大多少功能,是核心类。

    SOLID原则分析

    • Single responsibility principle:每个类的分工都相对合理明确。
    • Open closed principle:自己比较充分的考虑到了这一点。
    • Liskov substitution principle:本次作业没有类的继承。
    • Interface segregation principle:本次作业没有接口。
    • Dependency Inversion principle:本次作业对于模块的依赖性考虑不够充分,层次性不够,出现了循环依赖的情形。

    三、bug 分析

    自己的 bug 的问题是:电梯每到新到一层楼后,应该先下后上,而我没有注意到这一点。

    四、测试策略

    通过随机多组数据,进行大规模测试。这样可以发现一些 bug。另外,如果阅读源码发现其有死锁或竞争条件,而测试运行正确,可以在相应位置加入 yield() 语句来促使错误情况发生来验证。

    五、心得体会

    1、线程安全

    对于线程安全,核心是数据安全。如何保证数据安全,目前知道两种方法,一是由自己加锁,二是使用阻塞队列。综合自己和别人的使用经验,后者提供了一个简单而又强大的模型。在操作系统的学习中,线程同步中也有两种方法,其一是信号量,其二是管程,正好与 java 提供的两种方法对应。

    2、设计原则

    好的设计能够事倍功半。在这次的电梯作业中,由于第一次的架构设计合理,使得后面两次能够很好的重用,节省了大量的时间,且在已经验证过的代码上继续开发,也少了很多 bug。这其中,设计原则发挥了很大作用。比如我第一次作业时由于考虑到了对扩展开放、对修改封闭的开闭原则,使得之后的编码比较轻松。

  • 相关阅读:
    【C++ 系列笔记】03 C++ 面向对象进阶
    【C++ 系列笔记】02 C++ 面向对象基础
    【C++ 系列笔记】01 C++ 与 C
    【JavaScript】简单取随机数 ~~(Math.random() * number)
    英语测试
    Linux指令入门
    RE-攻防世界 T3 insanity
    PWN-攻防世界 level0
    ISCC不会的理论题
    kali linux配置ssh
  • 原文地址:https://www.cnblogs.com/yorkyer/p/10764987.html
Copyright © 2020-2023  润新知