目录

前言

一、第四单元两次架构设计

二、架构设计及OO方法理解的演进

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

四、课程收获

五、改进建议

前言

  持续了17周的OO终于走向了尾声,想想寒假的时候连类都不知道是什么,到现在一学期下来收获真的是挺大的。

  前排感谢mole群的群友们!

  一开始还有很多同学喷oo,或许是由于刚开学的压力,由于往届传来的oo口碑。但可以看到,在老师和助教的努力下,这学期有了诸多重大的改进,随着课程的进展,好评越来越多。就我个人而言,这学期强测+互测屋的制度让我觉得基本消除了公平性问题,并且游戏感强,很能激发学oo的兴趣,与这学期的另一门课程形成了鲜明的对比;讨论区很活跃,但废话又很少,与这学期的另一门课程形成了鲜明的对比。总之,感谢老师和助教们的辛勤付出,总体上看,这学期是一次彻底转变口评的改革。

一、第四单元两次架构设计

(1)为了尽量让代码逻辑清晰,且方便调试,本次作业我单独开设了AttributeManager, OperationManger, AssociationManager, MyInterfaceManager几个类,其实例作为自定义类MyClass的成员变量来分别管理属性、操作、关联与接口。MyClassManager在更高层次对MyClass进行统一化管理,由于对于接口相关的需求相对类来说是独立的,同样设一个InterfaceManager类对接口之间的继承关系进行统一化管理。

为了降低函数之间的耦合,对于每一个种类的UMLElement设置一个专门的函数负责它的初始化,如下图所示。

(2)为了尽量满足open-close原则,第二次作业我基本没有改动第一次作业的代码,只是将其打在一个包里。对于新扩展的功能,即解析时序图,解析状态图与合法性检测,分别打包来管理。这次作业除了理解指导书意图外的唯一的难点在于合法性检查中的R003,也就是对重复继承的precheck。我最后的方法核心思路是这样:在第一次作业中初始化过后每个自定义类都保存了它继承的所有类和实现的所有接口,如果存在多继承,那么它实现的接口至少有一个有至少两个被继承或实现关系。

二、架构设计及OO方法理解的演进

(1)第一单元的前两次作业基本完全面向过程,在面对第三次作业这样复杂的需求时,只能完全重构,不过因此我也第一次尝试了继承,多态(接口和抽象类)的使用,发现架构真的是清晰很多,多态的运用也简化了编码的难度。

(2)第二单元的作业体现的主要是架构的设计,而关键的架构设计主要在第二次作业,因为第三次作业基本可以完全沿用第二次作业的架构。最重要的问题就是电梯和调度器之间的职责划分和他们之间的协作关系。这一单元我感受到了设计对于编码的重要性,尤其是多线程问题。

(3)第三单元作业的主体架构是官方提供好的,再之后粗浅的了解了一些设计模式后,发现可以用策略模式来比较不同最短路径算法的性能,这样统一化的管理不但满足开闭原则,为了各个策略接口统一,也可能避免一些潜在的错误。

(4)第四单元我第一次尝试了打包管理各个类,感觉确实会清新很多,这次第一次作业的设计我也刻意遵守了单一职责原则,关联,继承,属性,操作等交给特定的类去管理;在第二次作业的功能扩展中我也刻意遵守了开放封闭原则,尽量在不修改第一次作业代码的基础上扩展功能,尽管牺牲了一些性能。

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

(1)从测试模式角度:

  第一单元:

    数据生成器:利用python的Xeger包

    正确性检查:由于不同人的输出格式很可能不同,因此只能接触单独的正确性检测脚本来实现,这里选用了matlab脚本

    WF检查:与好友对拍

  第二单元:

    数据生成器:这一单元的数据生成器是最好写的,指令与指令间没有逻辑,也不需要外部引用其它包

    正确性检查:这一单元的正确性检查脚本是最难写的,因为没有现成的工具可以利用,只能手写。

  第三、四单元:

    这两单元的正确输出都一样,因此只需要对拍即可,难点在于数据生成器。

(2)从写评测机角度:

  写评测机是学OO一大乐趣,第一个单元写出来的评测脚本基本半自动半手动,由于用的都是绝对路径因此没有可移植性,经过了几周的不断修改,到第二单元最后已经实现了这些功能:

  1. 兼容windows与linux,因为第二单元的测评等的时间太长了就挂服务器上跑了
  2. 不依赖于路径,放在哪都能跑
  3. 实现了弹夹的自动装配,弹夹的增删不影响评测机的代码
  4. 实现了玩家的自动注册,玩家的增添不影响评测机的代码
  5. 实现了正确性检查脚本的可替换,不同的作业只需要改动checker类的方法即可
  6. 实现了自动编译代码
  7. 因此第三四单元的作业没有改动过评测机的代码,每次测试要做的就是装配弹夹

四、课程收获

  相比其它课程而言,OO显然是这学期收获最大的一门课,主要体现在以下几点:

(1)编码能力的提升:

  这点对所有认真写完11次编程作业的同学都是毋庸置疑的,每个单元的非第一次作业难度都不小,无论是写还是测试都没少肝。

(2)对架构设计的认识:

  架构的力量主要表现在工程量较大的科目,比如上学期的计组,不过那是一门硬件课。OO是我接触的第一门软件方面代码量较大吃的科目。第一单元的前两次作业写得都比较面向过程,但从第三次作业开始,如果没有一个好的架构是很难写出易于调试与优化的程序的。“这次作业要设置几个类?他们各自要实现怎样的功能,对外要提供怎样的使用接口?类与类之间的协作关系是怎样的?这么设计是否有更好的可扩展性?”这些问题的思考变成了每次作业耗费时间最长的环节,不过当在草纸上想清楚这些问题后,之后编码就轻松很多了。

(3)对测试的实践:

  虽然这部分内容在之前已经说过了,不过鉴于写评测机和对其不断优化的过程真的是带来了很多乐趣与小小的成就感,还是要将其作为课程收获单独列为一点。几个单元下来,摸了一些matlab,windows和linux的命令行,java编译的各种命令行操作等等,python的使用也比之前熟练了。

(4)向身边的同学学习:

  整个过程中在与好友们的交流中也学到了很多,比如写数据生成器的思路,架构设计上的骚操作等等;研讨课也经常能从大佬得到启发;还有讨论区,感觉第三单元第三次作业讨论区的处理方法真的是太太太太巧妙了,既容易实现性能还极强。

 

五、改进建议

  说实话,一开始想吐槽的一些点基本都在课程的进展中已经被改进了。比如一开始OO实验上午讲课下午就考试的问题,之后基本会提前通知实验内容并下发预习材料;然后课上实验一开始15min的冷冻期也取消了。剩下的建议如下:

(1)关于作业内容:

  a.我们有的

  从结果的角度分析,第一单元的作业起到了测试入门的作用,第三次作业是我个人认为所有作业中OO味道最足的一次,封装,继承,多态都有所体现,而且架构弱的话很难写出没有bug德程序,也很难优化。第二单元的作用没什么可说的,多线程无可替代。而第三四单元的作业个人感觉完全是各种算法题的杂糅,并且用面向过程的方法反倒性能更高。

  b.我们没有的

  目前的形式并不会去push同学一定要应用solid原则中的某几条,或者某种设计模式

  c.综上,是否有可能将第三或四单元的作业改成类似于“协作开发”的形式,每个人的工作量以类为单位,要求其特定类的设计要满足特定功能,并且不要有危险的行为,比如某个public方法会抛出关键的实例对象等。

  或者类似的其它做法,设置一个可以典型反应solid原则与某些设计模式的单元,先由同学独立完成一次作业,下一次作业的框架由老师或助教搭好(这个框架要体现solid原则中的某些特点或设计模式中的某些模式),提供一些类的设计说明书让我们去以填空的形式完成,让我们从对比的过程中认识到这些原则及模式的好处。单纯的助教发实例代码或者同学在研讨课上讲其实大多数人很难理解。

(2)关于互测与强测分数比例

  建议提高互测的分数比例,主要基于以下两个依据:

  1. 由于互测占的比重过低,到后期互测的参与度明显下降,这不利于下一届的口评导向,比如会有人和学弟说“互测基本没啥影响,把这时间留着干点别的什么不好”;同时也不利于大家在互测中借别人之手发现自己的bug,违背了开设互测的初衷。
  2. 互测的bug和强测的bug没有本质区别,只是写数据的人侧重点不一样,很多逃过强测的人仍然会有很明显的bug。

(3)关于强测的扩展

  无论这部分是否占分,也许可以有一个用A屋中的精品测试数据对所有人再次测试的过程,以便大家发现自己的bug。

(4)关于指导书样例

  后两个单元的指导书样例确实有点少,在这种情况下我们就只能通过在讨论区不断问来解惑,并且事实证明很多结果和大多数人的理解不一样。有的时候如果架构为了性能鲁棒性差的话一个小的需求的变更可能都会伤筋动骨,就容易改出bug来。

-----最后的最后,祝oo越来越好!-----

完结篇OO总结的更多相关文章

  1. 解剖SQLSERVER 完结篇 关于Internals Viewer源代码

    解剖SQLSERVER 完结篇 关于Internals Viewer源代码 大家可能都用过Internals Viewer这个软件 <查看SQLSERVER内部数据页面的小插件Internals ...

  2. (视频)《快速创建网站》 4.2 完结篇 – 应用运营vs.发射卫星,遥测(Telemetry) 技术

    本文是<快速创建网站>系列的第10篇(完结篇),如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文.访问本系列目录,请点击:http://devopshub.c ...

  3. 不就是抽个血吗,至于么-jQuery,Linux完结篇

    hi 趁着周一去抽血化验,真开心...下午报告才出来,不过早上来了就开始各种晕菜,叫错名字,说错话.....至于么.. 还有在教研室的30天就可以肥家了,凯森凯森.今天不想干活(哪天想干过我就问问), ...

  4. 直接拿来用!最火的Android开源项目(完结篇)

    直接拿来用!最火的Android开源项目(完结篇) 2014-01-06 19:59 4785人阅读 评论(1) 收藏 举报 分类: android 高手进阶教程(100) 摘要:截至目前,在GitH ...

  5. ASP.NET 5系列教程(七)完结篇-解读代码

    在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]") ...

  6. Android 实现书籍翻页效果----完结篇

    By 何明桂(http://blog.csdn.net/hmg25) 转载请注明出处 之前由于种种琐事,暂停了这个翻页效果的实现,终于在这周末完成了大部分功能,但是这里只是给出了一个基本的雏形,没有添 ...

  7. 《BackboneJS框架的技巧及模式》(4)完结篇

    <BackboneJS框架的技巧及模式>(4)完结篇 本文紧接第二部分:<BackboneJS框架的技巧及模式(3)> 作者:chszs,转载需注明.博客主页:http://b ...

  8. 实现app上对csdn的文章查看,以及文章中图片的保存 (制作csdn app 完结篇)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24022165 今天给大家带来CSDN的完结篇,即增加文章的查看和文章中图片的保存 ...

  9. Cocos2dx游戏开发系列笔记13:一个横版拳击游戏Demo完结篇

    懒骨头(http://blog.csdn.net/iamlazybone QQ:124774397 ) 写下这些东西的同时 旁边放了两部电影 周星驰的<还魂夜> 甄子丹的<特殊身份& ...

随机推荐

  1. 为CentOS下的Docker安装配置python3【转】

    * 安装python3以及docker yum install docker docker pull centos service docker start systemctl enable dock ...

  2. CTS/APIO后文化课游记

    根据ghj1222的尿性,干什么事都要写一个游记划水记啥的...然后就写嘛... 现在是5.30微机课,先开个坑,学校6.5放假,我将于6.5后开始更新本文 APIO回来后发生的事真的特别多...有的 ...

  3. putty提示Network error:Software caused connection abort

    在 sshd host 的 /etc/ssh/sshd_config 设定: TCPKeepAlive yes,和将LoginGraceTime的值设为0,默认为2m,然后使用service sshd ...

  4. Webpack, 现在最流行的模块打包工具.压缩打包

    压缩bundle.js 1.把我们项目的代码从es6 -> es5 [babel] 参考:http://babeljs.io/docs/setup/#installation 1.1.安装包 b ...

  5. HDU 2103 Family Plan

    题目HDU 2103:http://acm.hdu.edu.cn/showproblem.php?pid=2103 Problem Description As far as we known,the ...

  6. iptables端口转发规则(内网端口转外网端口)

    需求:外网124.202.173.118需要访问 10.45.225.70的内网54032端口,10.45.225.70服务器有公网地址139.129.109.81将内网地址端口转发到外网地址端口,并 ...

  7. eclipse类自动生成注释

    1.创建新类时自动生成注释 window->preference->java->code     styple->code     template 当你选择到这部的时候就会看 ...

  8. 使用spring boot admin

    spring boot admin管理端, 需要部署成独立的应用 pom中添加依赖 <dependency> <groupId>de.codecentric</group ...

  9. formatter 操作列表的合并

    {field:'22',title:'操作',width:250,align:'center',sortable:true,formatter : function(value, row, index ...

  10. 数据库用户被锁怎么办,报the passord logon

    –1.使用管理员用户登陆,查看用户状态: select username,account_status from dba_users; –2.修改用户状态: alter user base accou ...