【面向对象】学期总结

【面向对象】学期总结

第四单元作业架构设计

第一次作业

  • 架构设计:

    ​ uml 类图提供了一个描述类及其关系的视图。 顶层为 UMLClassUMLInterfaceUMLAssociationUMLGeneralization
    UMLInterfaceRealization 。下一层为UMLAttributeUMLOperation, UMLParameterUMLAssociationEnd

    ​ 根据uml类图的层次结构,将模型抽象为MyAssociation , MyClass , MyInterface 几个类 。MyUmlInteraction 作为外部方法接口类,将不同的指令都分放到具体的类中去查询处理。

    • 类图:
      1615421-20190623002441819-218537671.png

第二次作业

  • 架构设计:

    ​ 除了顺序图之外,第二次作业加入了对uml顺序图和状态图的模型处理。顺序图描述了基于消息机制的对象协作关系,具有明确的协作主题。
    顶层为协作对象UMLAttribute和交互模型UMLInteraction 。下一层为UMLLifelineUMLMessageUMLCombinedFragment

    ​ 由顺序图的层次结构,设计了MyUmlInteraction类来管理单个模型的图层建立及指令查询处理。在MyUmlInteraction中,

        private UmlInteraction interaction;
        private ArrayList<UmlLifeline> lifelines =  new ArrayList<UmlLifeline>();
        private HashMap<String, UmlLifeline> name2Lifeline = new 
                HashMap<String, UmlLifeline>();
        private HashMap<String, Integer> same2Lifeline = 
                new HashMap<String, Integer>();
        private ArrayList<UmlMessage> messages = new ArrayList<UmlMessage>();
        private HashMap<String, Integer> target2SourceNum = 
                new HashMap<String, Integer>();

    建立了name2Lifeline , same2Lifeline , target2SourceNum 映射名字和对象,消息传递的发送方和接收方关系的映射。

    ​ 设计MyUmlInteractionContainer 类来管理状态图,作为状态图的指令查询接口。

    ​ uml状态图描述了状态及其关系,一般用来描述一个特定类/组件的行
    为。顶层结构为UMLStateMachineUMLRegion 。 下一层为UMLState , UMLTransition, UMLEvent , UMLOpaqueBehavior

    ​ 根据状态图的层次结构,我设计了 MyStateMachine 作为状态图的 “ 画布 ”。

        private UmlStateMachine stateMachine;
        private HashMap<String, UmlState> name2state = 
                new HashMap<String, UmlState>();
        private HashMap<String, Integer> sameName2state = 
                new HashMap<String, Integer>();
        private UmlRegion region;
        private HashSet<String> idHashSet = new HashSet<String>();
        private HashMap<String, ArrayList<String>> source2target = 
                new HashMap<String, ArrayList<String>>();

    MyStateMachine中设计了 name2state , sameName2state , source2target 几个映射关系,便于根据名字查询状态和前继状态及后继状态的关系。

    ​ 设计MyStateMacheContainer类来管理顺序图,作为顺序图查询指令的接口。

    ​ 建立了MyUmlStandardPreCheck 类进行三条规则的预检查。设定三个不符合规则的集合来抛异常。

        private Set<AttributeClassInformation> ruleTwo = new HashSet();
        private Set<UmlClassOrInterface> ruleEight = new HashSet();
        private Set<UmlClassOrInterface> ruleNine = new HashSet();

    类图:
    1615421-20190623002530963-2089939025.png

    作业架构设计及OO方法理解的演进

作业架构设计

  • 第一单元

    从纯c选手走向java小白,前两次作业都是按照c的方式,面向过程来写。到了第三次作业,渐渐的有了一些java的基本思想,学了用基本的面向对象的方式抽象类,使得层次架构更清晰。

    • 第一次作业

      1615421-20190624004913223-1080583724.png

    • 第二次作业

      1615421-20190624005034664-961059471.png

    • 第三次作业

      1615421-20190624005125976-303929774.png

  • 第二单元

    参考了生产者和消费者的交互模型,使用Tray类来进行电梯和请求队列的数据交互,也使得我后续一直在纠结所谓的调度器到底是用来干什么的。第二次作业增加了一些需求,考虑到人员id的唯一性,我使用了一个队列来确定人员的进出情况,作为确认人员是否进出的标准,和第一次作业差别不大。

    相比前两次作业,第三次作业更让人头疼,也是我思考程序设计最长的一次作业,基本ddl前一晚上才开始写。将需求一再简化,我使用了初始时就已经确认换乘路线的方式,直接复制了三个电梯类来模拟三部电梯的运行情况。更好的设计应当是抽象出一个统一的电梯类来继承,扩展性更好。

    • 第一次作业

      1615421-20190624005200468-1659448083.png

    • 第二次作业

      1615421-20190624005255663-2111101999.png

    • 第三次作业

      1615421-20190624005437710-2029927520.png

  • 第三单元

    这一单元主要是对规格的理解,按照jml注释写代码。难点在于图的数据结构算法的考察,如何才能不TLE是我最头疼的问题(第一次作业用了死亡for循环直接爆炸)。前两次作业都抽象出了具体的类来模拟图,还有容器类来进行对图的管理。最后一次作业就比较乱,由于我所有的查询处理方法都放在了图中,导致代码行数严重超标,不得不提一个类来存放这些方法,扩展性较差。

    • 第一次作业

      1615421-20190624005535268-839399129.png

    • 第二次作业

      1615421-20190624005609192-387326810.png

    • 第三次作业

      1615421-20190624005702647-744356597.png

  • 第四单元

    前文已介绍。

    OO方法理解

​ 经历了数次作业的(折磨)历练,我终于对于面向对象的思想有了一定的理解。面向对象的三大特性是封装,继承,多态。

  • 封装: 一个类封装了数据以及操作数据的代码逻辑体。定义了数据的可访问属性(私有、公有)。
  • 继承 : 可以让一个类型获取另外一个类型的属性的方式。分为实现继承和接口继承。
  • 多态 :类实例的一个方法在不同情形下有不同的表现形式,即不同的外在行为。使具有不同的内部结构的对象可以共享相同的外部接口。

    之前的博客也分析过面向对象的SOLID五大基本原则,即

  • 单一责任原则 : 每个类型(包括接口和抽象)功能要求单一,只负责一件事情。
  • 开放封闭原则:一个软件实体应该对扩展开发,对修改关闭。可扩展但是不可更改。用抽象构建框架,用实现类实现扩展。
  • 里氏替换原则 :子类能够替换父类,出现在父类能够出现的任何地方。当使用继承时,尽量遵循历史替换原则,尽量不要去重写或者重载父类的方法,以免破坏整个继承体系的 。因为父类在定义或者实现某些方法时,规定了必须遵守的规则和契约。
  • 依赖倒置原则:具体依赖抽象,上层依赖下层。核心思想是面向接口编程。两个模块之间依赖的应该是抽象(接口或抽象类)而不是细节。细节(实现类)依赖于抽象。
  • 接口分离原则:模块间要通过具体接口分离开,而不是通过类强耦合。

​ 我们在设计程序的架构的时候应该尽可能的遵循面向对象设计的基本原则,使得程序尽可能的低耦合,高内聚。同一个模块内的各个元素之间的联系高度紧密,降低各个模块之间的相互依存度。

测试理解与实践的演进

  • 第一单元——论求导的终极方式
    测试主要分为WRONG FORMAT 数据格式判断和计算正确性两大部分。通过构建尽可能的覆盖性的测试数据,检查程序的正确性。由于时间有限,不可能完全读完所有同学的代码,通过看代码查找bug。我基本是将自己用到的测试数据集对同组所有代码进行测试,随缘hack。
  • 第二单元——电梯有自己的想法
    如题,多线程测试最大的难点在于测试的不可复现性。对于线程不安全的程序,只有经过大量的重复性测试才能复现偶然出现的bug。debug也很难,由于bug难以复现从而不确定是否改正。
  • 第三单元——图之TLE警告
    到了这个单元,我们拥有了最大的神器,jml语言!“只要完全按照jml注释写,你就不会有bug。”
    这一单元,介绍了新的测试方式——junit单元测试。利用junit,可以轻易的对代码段进行覆盖性的测试,更加直观和便捷。
  • 第四单元——uml模型构建
    这一单元主要是构建不同指令对应的测试模型,进行针对性测试。

课程收获

​ “OO居然出了假期预习作业!”当时听到这个消息的我只觉得好不容易盼来的假期莫得了。当然我还是完全没有好好预习窝窝,买了本java的教材看了几页就抛之脑后,开学前几天恶补了点基础知识,草草的交了假期作业。就这样,开始了从零开始的OO与OS生活。
回顾过去的作业,我开始写代码的时间越来越晚,思考程序的架构设计和实现算法比起写代码的时间要多的多。不知不觉,我已经可以短时间内手撸近千行代码,比起之前的我至少码力提升了很多,也掌握了java 的基本思想,学会了面向对象的思维,掌握了测试代码的方法,为学习更深层次的知识打下基础。
这一学期,窝窝占据了我很大一部分时间,也带给了我不少的精神压力。比起往届,这届窝窝体验更好一些,尽管有些不足,但确实让我受益良多,祝窝窝越办越好!

改进建议

  • 提高中测强度。中测的测试强度和强测差距过大,中测一次过,强测火葬场的情况时有发生。(建议增加弱测环节保证有效作业。)
  • 实验课课程安排略着急。理论课教完后立即上机,导致上机难度增大。
  • 指导书更明确一些会更好。当然很多细节的东西可能助教也没想到,导致后续需求的改变。

转载于:https://www.cnblogs.com/MHKING/p/11071131.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值