zoukankan      html  css  js  c++  java
  • 第二单元博客总结

    第一次作业

    (1)设计策略

              设计策略,是几乎没有大的策略,模仿着ALS的调度方法,大致弄了个样子出来。

              第一次作业的主要目的是熟悉单生产者,单个消费者的生产模式,熟悉共享对象的读写同步等操作。

              电梯调度方面,实现了简单的捎带,调度判断等等策略,总的来说就是同楼层同方向的捎带,弱化版的ALS电梯

    (2)可拓展性

             如同前文所言,是弱化版的ALS,大部分时间集中在处理共享对象读取写入,进程的控制上面,忽略了电梯的调度,

             使得运行时间非常长,可拓展之处在于优化电梯的策略,实现更快的调度

    (3)度量分析

             

        

         总体来说,并不复杂,最复杂的在于电梯run方法,以及共享对象里面对于存取的判断等,总而言之,第一次作业整体架构比较简单。

        由于设计实在是太过于简单,只是单纯的生产者,消费者模型,共享对象只有增加,删除两个功能。

        在SOLID原则上,单一职责并没有违背,里氏替换没有违背,接口隔离没有违背

        主要违背的地方在于DIP原则,电梯和输入类,都直接依靠着共享对象类,而不是“依赖着抽象接口,在让共享对象类去实现这个接口"这种方式,

        以及这种方式所导致的,开放封闭原则受到了影响。

        但是总的来看,根据程序的总体设计,电梯的共享对象并不会出现巨大变化。

        而且难以出现一个程序里面,不同电梯的共享对象的种类还要出现变化的情况,因为共享对象更类似于加了一些新方法的容器。

        除此之外,严格来说,这个共享对象,算不上一个低级模块,只是充当容器的作用。

        所以就没有设计接口,而是直接依赖实现。 

    (4)自己bug与别人bug

        最大的bug来自于时间问题,运行的太慢了,导致rtle,这个问题改正方法就是重新写调度策略。

        别人的bug并没找到,hack超时并没有成功

        除此之外,提交之前最大的bug来自于电梯无法停下来,电梯线程无法结束,导致课下一直超时。

        最终改变了一些种植条件,成功完成。

    第二次作业

    (1)设计策略

         第二次作业,改动异常的少,甚至相比于第一次作业几乎没有任何变动

         第二次的多部电梯,完全就是多个第一次的电梯共享一个队列,来回争取,没有任何调度策略。

         但是实际测试中,没有策略的效果比一些调度策略甚至还好或者差不太多。

         主要问题还是电梯跑的太慢了,拉了后腿。

         总体就是,多个电梯,共享一个队列,然后互相抢夺

    (2)可拓展性

         由于电梯数目不确定,很难做针对性的调度策略,调度策略方面拓展性感觉比较小。

          但是多个电梯,对于同一个队列的处理,有很高的拓展性。

          比如3个从一楼去往3楼的人那边,一个电梯就够了,我却派出了三个电梯,导致运行的时候,电梯资源的浪费。

          另外就是电梯还是比较慢,可以改进。

    (3)度量分析

         可以发现,和第一次作业相比,几乎没有任何变化,因为这次就是第一次基础上,加了多个电梯,共享一个队列而已。

        同样的,因为设计的结构没改变,SOLID原则也和第一次一样,主要违背了DIP原则,顶层并不是面向共享对象的接口,而是直接依赖着共享对象的具体实现

        同样的,由于违反DIP原则,导致在开闭原则上面也受到了若干影响。

        前两次作业,违反原则主要原因是,我把共享对象当作了一个包含着新方法的容器类,具体实现上,共享对象也确实作为容器,按照容器的方式去实现了一些功能。

        这样子的低级模块,就没有特意的去设计接口,而且严格来说,它也算不上是低级模块。

        本着如无必要,勿增实体的想法,没有去迎合DIP原则的设计

    (4)自己bug与别人bug

        我自己和别人的主要bug,主要是两个System.in的缓冲区不共享,导致电梯会吃掉前面的人的情况。

        主要原因是,主函数类里面,用一个输入读取总数,输入类里面,用一个输入读取人的信息,主函数输入没及时关闭,导致人的信息进入主函数缓冲区,主函数结束,信息也丢失。

        改正方法就是及时关闭或者公用一个输入。

        自己是在课下提交阶段找到的bug,hack别人的时候,没有hack成功,但是和同学讨论hack思路之后,他们hack成功

    第三次作业

    (1)设计策略

         在第二次的基础之上,增加了特定层数可以停靠,也就代表着需要换程。

         分析发现,所有楼层,最多一次换乘就可以达到,所以每个人进入之后,先交给调度器,规定好他的换乘楼层是哪里。

         如果不用换乘,就直接把换乘楼层标记为目的地。

         然后选择合适的电梯,加入电梯队列。

         电梯只是负责把人送到他们的换乘地点,然后判断如果这个人换乘地点是目的地,就不用管他,

         如果这个人换乘不是目的地,就塞回给调度器重新分配。

    (2)可拓展性

        主要是选择合适的换乘楼层和电梯。这次作业实现的时候,并没有仔细思考换乘策略,而是找到能换乘的站,就换乘。

        这就导致了换乘有时候绕了一大圈远路,十分麻烦。

        换乘策略上面有很大的拓展性。

    (3)度量分析

     

        总的来说,最核心的复杂度,在于选择合适的电梯换乘,以及选择合适的换乘站,这两个地方。

        其中,选择合适的换乘站几乎占了复杂度的全部。

        其他地方几乎还是和以前一样。

        本次设计依然违背了DIP原则,没有对着接口设计,以及因此导致的开闭原则受到影响。

        这次的类的设计上面很混乱,类与类的包含关系也十分混乱,有很大的重新架构,减少耦合的空间。

        除此之外,单一原则也没有实现好,因为加新电梯的任务,也交给了调度器。

        由于没有自己设计接口,接口分离原则无法实现或者没实现。

    (4)自己bug与别人bug

        这次最大的bug在于中止判断。三个电梯,必须等待所有人运完才可以停止,因为如果电梯有人需要换乘,但是其他电梯以及关闭的话,就会出bug。

        本人在课下被这个bug卡住,也想去hack其他人,但是失败了。

        除此之外,针对新增电梯的hack,也没成功。

    总结与感悟

       经过第二单元学习,对于多线程,线程同步,线程信息交换等概念都有了一定程度的掌握,多线程是一个重要的技术,但是也带来各种各样意想不到的问题,不单单是程序本身逻辑问题,各种不确定性也会带来各种问题。这一单元的学习中,学了各种手段来对抗不确定性,最大程度的发扬多线程的优势,减少他的问题。

  • 相关阅读:
    呵呵,今天偶然看到了我最早期的商业网站作品
    轻量级的Ajax解决方案——DynAjax:直接在客户端调用C#类的方法
    RegexDesigner.NET 正则表达式开源工具
    Asp.net页面的生命周期之通俗理解
    我设计的公司网站主页 截图
    没想到裴勇俊留了一头长发。
    一个very好的Javascript ajax库,jQuery!
    JQuery资源收集
    收藏:悟透JavaScript
    VS2008 F5不能调试情况一例
  • 原文地址:https://www.cnblogs.com/pekopekopeko/p/12696698.html
Copyright © 2011-2022 走看看