一,第四单元架构设计

  第一次作业:只有类图

        1,重置MyClass,MyOperation等类,为使里面只有必要数据(name,id,visibility等)、或方便组织数据(如MyClass作为其底下所有operation、attribute等数据的管理容器)

        2,MyUmlInteraction 用来管理所有数据和方法

        3,输入处理:由于所有的元素传入的顺序不定,所以可能出现operation的parameter先出现等类似情况,所以所有不同类数据之间的联系都以各自的id值作为代表,而形成的“一棵棵树”,UmlInteraction中另设HashMap管理每个id对应的实际对象

        4,在所有数据被传入完之后,将每个class元素进行一次“寻找顶级父类”的操作,并在逐级递归的过程更新每个子类的“顶级父类”、“重复的attribute名字”、“所有attribute的名字”、“所有关联的类\接口的名字”,到时候遇到指令“attribute数量”、“关联的类\接口名字”等时能直接进入到相应class中获取。

        5,一点可能不必要的设计:为适应命令“是否违背信息隐藏原则”,将所有非private的attribute元素的名字和其所在的类的名字组合,放入class中的一个ArrayList中,在“寻找顶级父类”时,更新,从而最后能直接输出

        主要的实现可以见下图:

        *  attribute和interface没有重置相应的类,因为attribute只要记录它在哪个class中,名字、id、visibility,所以完全可以以“幽灵”存在,即将其名字、id、visibility按需组合,存入相应的MyUmlInteraction类中或Myclass类中的某个hashmap中就行了,而interface只要记录它的“father”有哪些、在实现了其的相应的Myclass类中记录其id/name就行了

         attribute主要存在

         interface的“father”以HashMap<String id ,HashSet<String id>>在MyUmlInteraction类中被记录,当然MyUmlInteraction类中会专有HashMap<String id,String name>来记录各个id对应的interface的name,而且在传入所有元素后会将所有interface遍历一遍,使其得到所有的“祖父”、“曾祖父”、“曾曾祖父”……

        (1)Myclass类中:

          a,对attribute:

            自己定义或父类继承来的attributeHashMap<String name,String id>

            

            从association_end得来的attribute的name,boolean chongfule(“重复了”)是用来判断其是否自己定义的attribute中有重复的——这样与上面的repeated_attribute的作用有一点重复,属失误

            

          b,对operation:

            

            下面是专门统计各类“有参数方法”、“有返回值方法”等的数量,而非像上面一样用hashMap专门存储,算一点简化

            

          c,继承自父类的:

            所有的父类的id、所有的association的name、所有实现的接口的name:

            

        (2)MyUmlInteraction类中

            对class:

            

            对association:

              *下面的两个是在传入所有的元素后进行的association和class之间的“连线”,将其按class管理起来

            

            对interface:

              同class类似,但没那么仔细(因为涉及的数据种类不多)

            

            对operation的管理

            

            对class和interface的parent_id的管理

            

        

    第二次作业:

        1,数据的管理:

            相比第一次,平行增加对时序图、状态图的数据和方法的管理,比对类图的管理要简单一些

            一点注意:(1),状态图的元素传入时,对起始状态和终止状态的处理,以及对终止状态的“incoming message”的处理,不过最后没有相关命令,也可不处理

                 (2),所有元素传入完毕后,将每个状态递归处理,找到其所有的后继状态,存好

            对状态图:

            

            对时序图:

            

        2,关于r001/r002/r003三个法则的处理:

            (1)r001:在每个class中添加HashMap存储其所有end端的attribute的名字,最后将所有class元素遍历一遍,看是否有重名的

            (2)r002:先对class元素遍历“寻找顶级父类”,并用临时的全局hashMap容器存储经过了的class元素id,当当前的“father的id”在容器中出现过时,将当前容器中的所有元素“一锅端”

                  再对interface元素遍历,深度优先算法,也是“一锅端”

            (3)r003:我用了讨论区里的方法,将所有的class元素和interface元素结合看成同一类节点,使用DP算法,遍历所有class元素和interface元素

            使用到的容器:

            r001:

            与association相关的容器联合使用

            

            r002:

            

            r003:

            

        总之这一单元的架构设计主要是:

            元素“抽象后存储”,如Myclass类中只存operation的id;

            元素“集中管理”,如MyUmlInteraction类中集中存储所有id对应的class/operation/interface等元素的实际的类的数据;

            元素的“传入后完善”,如Myclass类中的“所有attribute”会在所有元素传入后、在进行一次“寻找顶级父类”操作中被完全地完善(得到父类的attribute);

            方法的“深度优先”,如对r003法则的实现。

        *很遗憾,没有将类图、时序图、状态图分开到不同类中进行管理,因在这次作业中这三者几乎无关;另外,由于我处理传入的元素的方法很繁杂,所以应将对数据的处理另放入一个类统一管理,然后MyUmlGeneralInteraction类中应主要应对功能的实现。总之,类中代码超了500行……

      一点数据:

             *下面红色的getspeopnum是get_specific_operation_number(得到特定类型的operation的数量)的方法

           

             *下面的红色的“checkcf”(check_chongfu(重复))方法是用了递归,是用来检测是否有循环继承的类的方法

           

            *下面的红色的“chulijiekou(处理接口)”方法是使所有接口得到其所有的父类id(包括父类的父类……)

                   “copygettop”是递归找到所有类的顶级父类,并在过程中更新各个子类的“attribute"、"association_list”等容器中的数据

                   "getTopParent"与“copygettop”方法几乎相同,不过其是根据class_name 而非 class_id来进行查找的,在执行时实际将是直接得到"top_father",并不会有递归之类的,属失误

           

            *下面红色的“qingli(清理)”方法是在传入所有元素之后,检测r001,r002,r003并同时完整所有数据及其管理的数据的方法(比如使所有class得到了其父、曾祖父、曾…祖父的attribute_name)

           

            *下面红色的“addop”方法是“add_operation”方法,是class加入其所有的operation的方法

           

二,四个单元中的架构设计

   

  

    第一单元:主要元素的区分

   

    第二单元:主要元素的区分和分工

   

    第三单元:最合适的容器、方法的选择

   

    

    第四单元:主要元素的区分、最合适的方法的选择

        *CLorin类是“Class or Interface”类,作为对class和interface的抽象后统一的类

    

三,测试理解与实践的演进

    第一单元的理解:判断WF的疏漏、求导过程的不完善

    第一单元的测试:看代码+分解其判断WF的“if…else”语句和求导过程的部分,定点轰炸。结果:疏漏很多,而且自己没有能力能判断出其处理有bug

    第二单元的理解:看代码+无脑测试

    第三、第四单元:按照自己思考时出的错误定点轰炸,结果:收获良好(因为自己也很菜)

  

四,课程收获

    1,能更好地划分各种元素:如第一单元中对“常数”、“三角函数”、“带x的乘数”的区分,第二单元中对“电梯”、“中央管理器”、“需求输入器”的区分,第四单元中对类图中各类元素、时序图中各类元素、状态图中各类元素的区分

    2,能更好地明确和区分各种元素之间的关系:如第一单元中对“项”之间的关系的区,第二单元中“电梯”和“中央管理器”的关系和各自的分工、第四单元中类图的“class”和“attribute”的关系

    3,模块化的自我测试:在将功能进行划分后,按模块进行编写代码,写完一块测一块

    4,更能注意程序的易错点

五,三个建议

    1,实验课可以简单一点?虽然写完代码后回顾感觉当时题目的确是比较基础,但在当时做的时候有几次会感觉信息量有点多,另外可以循序渐进地专门训练我们的归纳分析元素的能力?这样在那道出租车题前就不会有些手忙脚乱了

    2,bug修复界面在“预览”时能不算“提交”?不过这样评测机的压力会很重……所以能否降低“预览”而未“提交”情况的等待时间?

    3,bug修复在情况:有2个bug,但在十几个测试集中,都同时包含了涉及这两个bug的命令,若只修复一个则还会只是“无效修复”,只能当做几十个bug一起修复……也许考虑了这种情况并已经降低了bug的占分比,但……我也不知道咋改了(弱是原罪orz,dbq)

      

OO终章的更多相关文章

  1. OO终章--总结博客

    一.测试与正确性论证的比较 从方法上看,测试是使用大量测试样例来覆盖测试代码,从而能够检测代码的实现是否正确,功能是否完善.而正确性论证是使用代码的规格和逻辑进行严密的推论和证明,从而验证代码的实现正 ...

  2. BUAA-OO-第四单元总结——终章

    面向对象第四单元博客总结--终章 第四单元作业设计 第13次作业设计 类和对应方法属性设计 类设计如下图所示 本次作业主要涉及六个类,其中包括主类 Main ,通用Map类 UmlElementIdM ...

  3. C#使用Xamarin开发可移植移动应用终章(11.获取设备信息与常用组件,开源一个可开发模版.)

    前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 本系列,终 ...

  4. 史上最简单的 SpringCloud 教程 | 终章

    https://blog.csdn.net/forezp/article/details/70148833转载请标明出处:http://blog.csdn.net/forezp/article/det ...

  5. BugPhobia终章篇章:学霸在线系统Beta阶段展示

    0x00 :序言 1 universe, 9 planets, 204 countries,809 islands, 7 seas, and i had the privilege to meet y ...

  6. SpringBoot非官方教程 | 终章:文章汇总

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot-all/ 本文出自方志朋的博客 SpringBo ...

  7. JDBC终章- 使用 DBUtils实现增删查改- C3P0Utils数据源/QueryRunner runner连接数据源并执行sql

    JDBC终章- 使用 DBUtils实现增删查改 1.数据库结构 Create Table CREATE TABLE `user` ( `id` ) NOT NULL AUTO_INCREMENT, ...

  8. SpringCloud 教程 | 终章

    错过了这一篇,你可能再也学不会 Spring Cloud 了!Spring Boot做为下一代 web 框架,Spring Cloud 作为最新最火的微服务的翘楚,你还有什么理由拒绝.赶快上船吧,老船 ...

  9. OO第二章总结

    OO第二章总结 电梯作业终于结束了!!! 这三周作业用多线程模拟搭建电梯的运行,我从开始对多线程的一无所知到结束时的能够完成一些多线程任务的水平,进步还是蛮大的,尽管过程有点艰难. 一.复杂度与UML ...

随机推荐

  1. JavaWeb:Cookie处理和Session跟踪

    JavaWeb:Cookie处理和Session跟踪 Cookie处理 什么是Cookie Cookie 是存储在客户端计算机上的文本文件,保留了各种跟踪信息.因为HTTP协议是无状态的,即服务器不知 ...

  2. Java 异常处理基本规则,Java异常处理的基本规范

    看了团队中原来代码中的异常处理,心碎了一地,稍微对照阿里巴巴的异常处理规范整理了一遍,准备分享一下,Java的异常处理规范&约束. 一.运行异常的扑捉 不要捕获 Java 类库中定义的继承自  ...

  3. JAVA之反射(一)

    反射(一) ** 注:博主的这篇文章是在学习反射的时间写的如有问题请及时联系博主进行修改 ** 何为反射  这里也不说一些很官方的语言了,官方的说明看着头痛,总之一句话,就是在JAVA的运行状态的时候 ...

  4. Idea提示没有符号类错误解决

    将提示没有符号类的文件打开,右键单独编译一次,再重新打包即可解决

  5. HDU1863-畅通工程

    题目链接:点击打开链接 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即 ...

  6. jquery——动画

    1.通过animate方法可以设置元素某属性值上的动画 <!DOCTYPE html> <html lang="en"> <head> < ...

  7. @async 方法上添加该注解实现异步调用的原理

    在我们使用spring框架的过程中,在很多时候我们会使用@async注解来异步执行某一些方法,提高系统的执行效率.今天我们来探讨下 spring 是如何完成这个功能的. spring 在扫描bean的 ...

  8. SpringBoot | 第十五章:基于Postman的RESTful接口测试

    前言 从上一章节开始,接下来的几个章节会讲解一些开发过程中配套工具的使用.俗话说的好,工欲善其事,必先利其器.对于开发人员而言,有个好用的工具,也是一件事半功倍的事,而且开发起来也很爽,效率也会提升很 ...

  9. SpringBoot | 第零章:前言

    缘起 前段时间公司领导叫编写一两课关于springboot的基础知识培训课程,说实话,也是今年年初才开始接触了SpringBoot这个脚手架,使用了之后才发现打开了一个新世界.再之后也没有一些系统的学 ...

  10. 记ubuntu下安装Anaconda

    晚上尝试在ubuntu 16.04版本下安装python的Anaconda3发行版. 从清华源下载的Anaconda3-Linux 64位版本安装包,然后顺利的下一步,下一步.....一切顺利!结果到 ...