全文共3012字,推荐阅读时间10~15分钟。

文章共分五个部分:

作业分析

Unit4要求我们实现UML解析器,迭代过程主要是增加对不同类型UML图的解析功能。本单元的作业分析有独特的地方——因为三次作业都采用了一致的架构,因此以第三次作业的UML图为例即可了解整个单元迭代开发的过程。

从UML图可以很直接地看出来整个系统的模拟思路:通过分包策略,让各种UML图的解析和交互类分离,可以达到在增加新的UML图时,只增加一个包和在交互接口中增加相应方法即可。

第一次作业

第一次作业要求我们实现UML类图解析器

UML图如下

  • 代码结构

结构大致可以分为两层:交互->解析。在交互层不需要考虑解析出的元素是如何存放的,只需要处理好从解析层抛出的异常即可。

  • 复杂度分析

从反馈结果可以看出,因为增加了缓存机制,在getSpOpCnt这个方法中调用了很多子函数,造成了三个复杂度都很高的情况,进而还影响到了类图的交互器。目前还没有找到比过滤方法更好的办法实现对特定要求方法的数量查找,如果有同学有更好的思路,欢迎交流。

第二次作业

第二次作业要求我们增加对顺序图和状态图的解析功能

UML图如下

  • 代码结构

代码架构基本延续了第一次的设计风格,只是增加了一个总交互类和两个子交互类以及相应的解析类。

  • 复杂度分析


从反馈结果可以看出,复杂度和第一次区别不大,原因主要在于类图的解析元素相比于顺序图和状态图都更多,所以复杂度也会更高。

第三次作业

第三次作业要求我们进一步实现UML规格检查。

UML图如下

  • 代码结构

代码架构和第二次相同,采用了检测和构造并行的思路,因此并没有单独构造一个检查类。

  • 复杂度分析


从反馈结果可以看到,复杂度依然来自于类图解析器。如果可以的话,请对于类图解析有独到的见解的同学不吝赐教。

烘烤OO的精华

小节标题来自于O'REILLY出版社的“口头禅”,选择它作为标题的原因很简单:和咱们这门课的主题相呼应。课程组的老师们在一学期的课程中反复向我们强调:OO不是Java程序设计,而是面向对象的程序设计方法课程。

现在回望起来,发现自己对这句话的理解也是随着课程的进展逐渐变化的:

  • 第一单元我愿意把它叫做C-Java时期,因为这个时候自己的脑海里面向过程编程的思想还很牢固——什么事只要一个主函数就搞定了。这也直接造成了遇到稍显复杂的工程就难以下手的情况,比如第三次作业,最后自己硬套上了面向过程的表达式树,虽然可以实现功能,但是一旦想要改动一点点东西,比如增加一种求导函数,确实就会捉襟见肘。

    后来单元研讨的时候才发现如果采用OO的想法,把”分而治之“贯彻到极致,是可以实现一个非常灵活的架构的。这个时候我发现了一个影响我后来开发过程的小技巧:分包。(如果想可以看看之前的博客,会发现后来几乎每次作业我都会分包)

  • 第二单元我们接触了现代开发的基本功:多线程。

    这一单与我的评测机制产生了巨大变化,具体会在下一小节提到,这里就不再展开了。

  • 第三单元我想要把它看成”团队开发“的先导训练。为什么这么说呢?世界代码千千万,一人不可能写得完,就比如Windows的那几千万行代码,一定是团队开发的。团队里也要有分工:有人擅长架构,有人擅长编码,那么JML就是这两者之间最好的桥梁之一。因此第三单元的体验非常开心,原因就在于课程组为我们当了一个技艺高超的架构师,让我们只要照方抓药就好。

    值得一提的就是最后的复杂度分析:不比不知道,一比吓一跳。第三单元的架构复杂度是最低的,这也让我对规格化编程愈发重视。

  • 第四单元我们走进了UML的世界。之前听学长提起UML的时候说:

    UML需要有代码经验的产品经理画才有威力,要不然就是在圈地自萌。

    当时并不明白这是为什么,现在我大概有了一点感觉:UML绝不等于画图,这种模型化的语言和JML一样,是蕴含着丰富的逻辑的——一个类下面的”树“可能枝繁叶茂也可能冷冷清清。如果只是画一些方块和线条连接起来,那只能叫做建模草稿,绝不是成熟的模型描述。

综合看来,OO课程用了五个月,让我们体验了从Code Man到PR的整个历程,这个时间控制得是非常精准的,每个部分都让大家收获满满,却也意犹未尽。

现在如果让我解决一个生活问题,我很可能会先拿出纸笔,画出整个系统的架构,就像当初设计CPU一样,把高内聚低耦合的思想融合进去,最后才会是写代码的工作。后面几次作业我都采用了这样的方法,发现其实如果架构建立起来了,写代码只是一个收尾工作而已,并不是占用时间最多的环节。

评测相关

评测机架构

首先是一组数据:

  • 这一学期共12次作业,我一共用了12次评测机。
  • 这一学期共4个单元,我一共搭了4次评测机。

也许你会很奇怪为什么第四个数不是12,原因就在开发第二单元的评测机的时候,我一鼓作气把Java里OO想法用到了Python里,虽然有些地方受限于语法等因素不能完全一致。但是后来每次作业,我都不需要再搭一次评测机,相反,只需要增加一些评测逻辑即可。(这有点像把评测机当作了一个大对象)

具体的文件树如下

── center
│   ├── auto_test.py
│   └── tempCodeRunnerFile.py
├── data
├── download_data
├── factory
│   ├── arrangement_data.py
│   ├── class_extractor.py
│   ├── class-info-extractor.jar
│   ├── collaboration_data.py
│   ├── collaboration-info-extractor.jar
│   ├── gene_data.py
│   ├── name_data.py
│   ├── single_data.py
│   ├── state_data.py
│   ├── state-info-extractor.jar
│   ├── traverse_data.py
│   └── uml-homework.jar
├── lib
│   ├── jar-one
│   │   └── xxx.jar
│   ├── jar-two
│   │   └── xxx.jar
│   └── jar-three
│   └── xxx.jar
├── output
│   ├── new-asso
│   ├── new-asso-and-imp
│   └── other-com
├── result
│   ├── new-asso
│   │   └── result.txt
│   ├── new-asso-and-imp
│   │   └── result.txt
│   └── other-com
│   └── result.txt
├── ruler
│   ├── spj.py
│   ├── std
│   │   └── xxx.jar
│   └── tempCodeRunnerFile.py
├── server
│   ├── get_graph.py
│   ├── get_output.py
│   ├── get_result.py
│   ├── get_sub_result.py
│   └── time_holder.py
├── summary
│   ├── digit
│   │   └── spj_result.txt
│   └── graph
│   ├── line.png
│   ├── mvp_bar.png
│   └── stats_bar.png
└── template
  • center:存放评测的核心控制代码,用于组织编译->运行->反馈功能
  • data:存放自动生成的数据
  • download_data:存放测试中出现问题的数据,可以用于回归测试。
  • factory:存放数据生成代码
  • lib:存放JAR
  • output:存放各个测试代码的输出
  • result:存放各个测试代码的结果
  • ruler:存放标程或评测逻辑(即spj的逻辑判断代码)
  • server:用于适配服务器端的调用代码
  • summary:用于存放反馈整合后的结果

评测机演示

  • 使用前将待测试JAR包放在lib文件夹下
  • 运行center文件夹中的auto-test.py文件
  • 从summary文件夹中得到反馈结果(文字+可视化)

关于可视化,在第二单元体现的尤其明显,可以看这篇博客,有非常详细的展示和注释。

评测机开发

目前可扩展架构的评测机均已经在Github上开源

如果有任何疑问,请联系silencejiang12138@gmail.com,或者直接在Github上@SilenceX12138.

课程体验感受

一学期的OO课程让我体验颇深,从第一单元的最后总结时的不甘(想知道为啥的话可以去看看第一单元的博客),到现在依然愿意和大家一起讨论、互帮互助。OO教会我的不仅是面向对象的思维方式,更是待人接物的道理和心态。

如果能对二月的自己说一句话,我会告诉他:好好享受接下来的五个月,你会发现自己会有更多的可能性。

如果能对未来的自己说一句话,我会提醒他:别忘记了OO那年的春夏,你会永远为了当初无畏的少年自豪。

一些小小的建议

  • OO课程绝对能够称得上学院里体系非常成熟和完善的一门课,对于课程设置并没有什么建议或者意见。这里想引用一句话:大学生还不够格说那些课有用还是无用的,最需要的是认真对待每一门课。
  • 第三单元的指导书修改的次数稍微有些多了,虽然不影响主干逻辑,但是一些细节对于同学们也是非常重要的。这个问题不能光归咎于课程组,JML工具链的不完善也是一个不能忽视的问题,所以希望来年通过一些办法(比如开发课程专用的JML检查工具),为学弟学妹提供更好的体验。
  • 实验课的时间可以适当提前,留给同学们更加充足的准备时间。现在都是前一天晚上或者当天早上进行内容发布,难免出现时间紧张的情况。

最后,再次向OO课程组的所有老师、助教以及讨论区中的同学们表示最诚挚的感谢!

Good Luck And Have Fun!

Unit4-窝窝之昆崚的更多相关文章

  1. 复星昆仲杨光:VR行业四大痛点

    2016年,可是说是VR产业的爆发之年,从公司层面到资本层面都对VR产业给予了厚望,期望其能够在移动互联网之后带来革命性的突破,掀起新一轮技术主导的商业革命.而创业者们已经跃跃欲试,期望在资本的支持下 ...

  2. Unit4中的Annotation

    Unit4中的Annotation(注解.注释) JUnit4 使用 Java 5 中的注解(annotation),以下是JUnit4 常用的几个annotation介绍@Before:初始化方法@ ...

  3. 智能机器人“小昆”的实现(五)MainActivty的实现及项目结束

    好了,一切准备工作都完成了,下面我们就可以真正的编写MainActivity了.在MainActivity中,我们要为ListView设定适配器,并为发送按钮设定点击事件.我们的逻辑就是点击发送按钮, ...

  4. 最新昆石VOS2009/VOS3000手机号段导入文件(手机归属地)

    使用2017年4月最新版手机号段归属地制作,支持所有版本的VOS 共360569条记录,兼容所有版本的昆石VOS,包括VOS2009.vos3000.vos5000 导入比较简单.下载后解压到桌面在V ...

  5. Unit4:碎片

    基本使用 动态调用 碎片和活动 碎片周期

  6. OO Unit4总结 & 结课总结

    OO Unit4总结 & 结课总结 OO课Unit4 UML解析应用技术回顾 BUAA.1823.邓新宇 2020/6/19 总结本单元三次作业的架构设计 本单元的架构设计主要是两方面. 一方 ...

  7. OO unit4 summary

    Unit4 一.第四单元作业的架构设计 第四单元个人认为主要是考察对于层次结构的理解,即如何理解并处理好UML图的树状结构组织,在理好层次之间以及层次内部的相互关系之后,就只剩下代码实现的问题了.但是 ...

  8. 20155335俞昆 《java程序设计》第八周总结

    2016-2017-2 <Java程序设计>第X周学习总结 ##认识NIO 在java中,输入与输出,基本上是以字节为单位进行的低层次处理,实际上多半是对字节数组中整个区块进行处理,对于d ...

  9. level 6 - unit4 - 强调句

    强调句 强调实义动词 范围: 一般现在时/一般过去式:肯定句 方法:v.前面加do/does/did 例子: i love you --> i do love you i loved you - ...

随机推荐

  1. springboot连接数据源,配置数据库

    Spring官方DriverManagerDataSource的配置 修改yml #配置数据源的属性 spring: datasource: driver-class-name: com.mysql. ...

  2. springboot的springMVC配置,源码

    1,前端控制器自动管理 DispatcherServletAutoConfiguration 中 此方法创建了前端控制器 注册了前端控制器 其中标黄色一行最后的  .getPath()方法点进去 St ...

  3. indetityserver4-implicit-grant-types-请求流程叙述-下篇

    上一篇将请求流程描述一遍,这篇将描述一下相关的源码. 1 访问客户端受保护的资源 GET /Home/Secure HTTP/1.1HTTP/1.1 302 Found Date: Tue, 23 O ...

  4. [工具-006] C#如何模拟发包登录

    最近接到一个任务,就是模拟某个贴吧的登录发帖功能,我的思路是通过IE浏览器的工具对登陆操作进行抓包,记录登录时候请求的URL,请求方式,请求正文等信息进行模拟的发包. 1.首先我们要到登陆页面,以摇篮 ...

  5. Java和NodeJS解析XML对比

    Java解析XML 1.接收xml文件或者字符串,转为InputStream 2.使用DocumentBuilderFactory对象将InputStream转为document对象 Document ...

  6. 关于如何提高SRAM存储器的新方法

    SRAM是当今处理器上最普遍的内存.当芯片制造商宣布他们已经成功地将更多的电路封装到芯片上时,通常是较小的晶体管引起了人们的注意.但是连接晶体管形成电路的互连也必须收缩.IMEC的研究人员提出了一个方 ...

  7. 收藏!如何有效实施devops?

    当今IT行业的竞争日益激烈,各家公司都在寻找优化软件研发过程的方法,因为交付比对手更具竞争力的产品已经越发成为一件成本高昂的事情.这也是DevOps发挥作用的地方,因为它可以在工程管理的各个方面提供帮 ...

  8. 【Storm】与Hadoop的区别

    1)Storm用于实时计算,Hadoop用于离线计算. 2)Storm处理的数据保存在内存中,源源不断:Hadoop处理的数据保存在文件系统中,一批一批处 理. 3)Storm的数据通过网络传输进来: ...

  9. 初学者对Git的使用安装教程,以及对unknown key type -rsa的解决办法

    第一次使用Git,诚惶诚恐. Git在每个电脑上第一次使用必须要配置环境,才能通过SSH秘钥的方式安全稳定的拉取代码! 此文适合对Git一无所知的小白观看,大神勿扰.下面我将讲解一个傻瓜式的Git安装 ...

  10. Java实现 LeetCode 785 判断二分图(分析题)

    785. 判断二分图 给定一个无向图graph,当这个图为二分图时返回true. 如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我 ...