面向对象设计与构造课程总结作业
Posted Chenrt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象设计与构造课程总结作业相关的知识,希望对你有一定的参考价值。
面向对象设计与构造课程总结作业
四个单元中的架构设计
四个单元中对架构设计及面向对象方法理解的演进
-
在面向对象课之前
- 上学期写某物实验的数据处理程序和某组实验的数据生成程序的时候,比较频繁的使用结构体套函数进行封装
- 架构设计及面向对象思想的萌芽应该开始于那个时候,不过由于需求比较简单,始终没有更进一步的接触继承和多态
-
架构设计及面向对象方法理解的演进
- 这大概是一个张无忌在阿大面前练太极剑的过程
-
第一单元
- 现在看来架构设计其实非常直白,就是照搬形式化定义
- 当时比较嫩,脑子里想纸上画了半天之后才写,写出来快乐AK没有重构
-
第二单元
- 现在看来架构设计其实非常直白,就是照搬生产消费者模型
- 不过初识并发,读取是否阻塞,程序结束条件等还要斟酌一下
- 脑子里想了想直接写,写出来快乐AK没有重构
-
第三单元
- 可以理解为规模比较大的代码填空,这还设计啥架构
- 不想直接写,一边写一边想,写出来快乐AK没有重构
-
第四单元
- 架构设计非常直白,按照常识组织架构,发现UMLxxx不够用就加层壳改成Myxxx即可
- 不想直接写,一边写一边想,写出来快乐AK没有重构
-
关于四个单元作业的题目顺序
-
开始单元
- 这单元的主要目的是引导同学面向对象
- 如果把电梯放这一单元,单线程还没整明白就上并发,似乎不太行
- 如果把UML放到这一单元,多半会被很多人面向过程切完,训练效果达不到
- 如果把JML放到这一单元,倒也没啥问题,不过基本不涉及多态和继承还是水了点
- 这么看还是求导比较合适
-
结束单元
- 这单元是面向对象课程的收尾
- 如果把电梯放这一单元,倒也没啥问题,不过烤漆卷电梯性能也够刺激
- 把JML放到这一单元,倒也没啥问题,不过个人认为放UML的意义更大一些
- 把UML放到这一单元的妙处在于,这一单元可以扁平化设计,表达面向对象但不仅仅面向对象,个人认为这样的收尾是比较精彩的
-
中间单元
- 个人认为电梯和JML的顺序不是很有所谓
- 考虑到第三单元的时候OS进入高潮,OO划一划水比较友好
- 于是电梯安排到第二单元,JML安排到第三单元
- 综上所述,不考虑换题的话,当前这个顺序还是比较合理,比较有助于架构设计及面向对象方法理解演进的
-
四个单元中对测试理解与实践的演进
-
本地测试简要总结
- 全程批量测试机黑箱测试
- 数据包括大量随机数据,用于测试功能
- 数据包括一定量手造数据,用于测试性能
- 测试的有效性还是不错的,成功金刚狼
- 更具体的测试思路见各单元博客,在此不再赘述
-
本地测试的演进
- 个人认为有且仅有一点,对测试数据的覆盖程度验证
- 在第三单元接触了Junit,虽然感觉这东西用起来不是很爽但它的代码覆盖分析确实值得借鉴
- 笔者希望找到一种可以在黑箱测试过程中统计代码覆盖频率的手段,不过似乎没找到,只好自己动手丰衣足食
- 在后两单元笔者实现了DataCheck,其关注代码中预先设置好的一些关键位置,被执行时进行计数,结束后输出次数
- 后两单元中,笔者用这种方式发现了测试数据的一些未覆盖情况并进行了加强
-
对测试的一些思考
- 在测试的过程中免不了和他人对拍,也越来越发现一个问题,即笔者的数据测自己有余测他人不足,总存在一些有诡异Bug的代码可以通过笔者的数据
- 现在反思,主要原因在于DataGenerate,DataCheck由笔者一人开发,在开发过程中无可避免的会发现自己考虑不周的地方,如在思考某种数据能不能出的时候,就自然的会思考自己的程序遇到这样的数据会发生什么
- 也就是说对笔者自己而言,在测试在开始跑点前就开始了,其形式为作业代码,DataGenerate和DataCheck的自洽,而他人的代码可能没有经历这个过程,就比较有可能遇到笔者的数据测不出来的诡异Bug,往往出现在笔者本人实现下不可能出错的地方
- 此外对于笔者自己的实现,笔者比较清楚哪里可能存在问题,测试时也会对这些方面着重测试,尤其是第一单元的化简部分,笔者构造了相当多的数据测试自己三角化简和拆括号的功能与性能,这些数据对没有进行类似优化的代码往往没有效果,而在第二单元,笔者的调度算法中存在随机元素,在解决被毒瘤数据卡的同时也带来了一份数据测多少遍都不一样的效果,变相增加了测试强度
- 这样来看,虽然数据基于大量随机生成,但也不完全是无的放矢,可能这种结合才是数据强度的保障
三个对课程的具体改进建议
- 想了一会儿写了十个,如果介意溢出的话,只关注高优先级的三个即可
-
[高优先级]完善研讨课评价机制
- 建议全班对每个研讨课分享的同学打分,内容包括但不限于工作量,展示效果和收获等
- 对每个研讨课分享的同学,得分高的多加分,得分中等的有加分,得分不高的要倒扣分
- 恕我直言,有些分享纯粹是为了分享而分享,为了加分而分享,听起来味同嚼蜡基本等于没分享
- 上述全部内容针对(似乎有点普遍的)现象,不针对具体的人,切勿对号入座
-
[高优先级]增加实验课反馈机制
- 这个问题去年学长学姐博客就在说了,课程组还是没啥回应
- 建议以某种形式给出反馈或部分反馈,如果明确不给反馈建议说明原因
- 一声不吭当谜语人搞得大家都很不爽,不针对具体的人,切勿对号入座
-
[高优先级]给出官方代码或优秀代码
- 据了解往届是有这个环节的,这一届也说过要给,结果都结课了还是没看到
- 后两单元倒是无所谓,前两单元个人认为看官方代码或优秀代码还是比较有助于开拓思路的
- 即使无法开源给出,也可以考虑混淆后给出,供大家学习其性能优化
- 相信同学们会很乐意找官方代码或优秀代码中的问题的
-
[中优先级]调整第一单元第一次作业性能评定
- 第一单元第一次作业如果想追求性能满分,势必要做同类项合并
- 而基于形式化定义组织的层次化架构想要支持这一点的成本是比较高的,放在第一单元第一次作业难度不小
- 至少笔者在第一次作业中为了让基于形式化定义组织的层次化架构支持合并任意同类项下了不小的功夫
- 这将导致就算想到了基于形式化定义组织的层次化架构也有心无力,被迫采用过程式处理,后面必然重构
- 个人认为这样或存在一定的误导,建议调整第一次作业的性能评定或干脆改为Pre
-
[中优先级]增加互测部分的信息呈现
- 建议互测时给出个人全部的刀人记录,包括提交的数据,和测试的结果
- 有一种尴尬叫做交上去五刀时间到了一刷新发现中了三刀但不知道是哪三刀
-
[中优先级]修改互测代码的文件名
- 互测屋的代码下载下来应该是字符串的哈希值,感觉有点奇怪
- 建议直接改成代码在互测屋中匿名的名称或者至少包含代码在互测屋中匿名的名称
-
[中优先级]提供用于互测的DataCheck
- 建议给出用于检查测试数据合法性的程序(无需开源),这一点主要体现在第二单元和第四单元
- 第二单元包括能不能不给请求,电梯编号能不能是零的问题指导书没说,互测的时候诡异非法有点搞心态
- 第四单元没互测的可能原因之一是不好DataCheck,如果迭代几届搞出一个DataCheck,也许就可以互测了
-
[低优先级]增加对本地测试的引导
- 这一点主要体现在第二单元和第四单元,前者造评测机写Spj难度比较大,后者造测试数据难度比较大
- 建议课程组搬运一些帖子或写一些引导构造测试的帖子置顶到讨论区,让更多的人进行本地测试
-
[低优先级]四个单元博客中的一些问题
-
[低优先级]课程平台的一个Bug
- 关注一些帖子,这些帖子了出现超过五条回复
- 在通知中心中,这些回复会被显示,因为不止五条回复会触发分页显示
- 切换到最后一页,逐个将最后一页的回复标记已读
- 最后一页回复全部消失,回复下方的翻页也随之消失
- 无法回到其它页,需要刷新才能解决
个人课程收获
-
Cpp/Java/Python基本功
- 课程中作业全程使用Java,但本地测试工具链采用了Cpp/Java/Python混写
- 课程前只掌握了Cpp/Java/Python的基本使用,经过本学期的训练掌握了Cpp/Java/Python的面向对象尤其多态与继承
- 课程前只熟悉Cpp的调用系统Cmd和进行文件操作等功能,经过本学期的训练也掌握了Java/Python调用系统Cmd和进行文件操作等功能
-
更进一步的面向对象思想
- 课程前只熟悉封装,简单尝试过继承,没接触过多态
- 课程中尤其是第一单元大规模的使用了继承和多态,面向对象思想有比较大的提高
- 当然这部分的收获只有一半来自面向对象课程,另一半来自Cpp与C#程序设计课程
-
面向对象与并发的学习范式
- 个人认为课程的前两个单元是一个很好的学习范式
- 学习一个新的语言时,为快速上手其面向对象,可以实现一个求导(当然无所谓化简)作为练习
- 学习一个新的语言时,为快速上手其并发,可以实现一个单电梯调度(当然无所谓性能)作为练习
- 个人认为在今后的学习与工作中这或许可以发挥作用
-
应对较大项目的经验和能力
- 课程前写过最多2000行的Cpp,写了三四天,调了小两周
- 在面向对象课程中,基本练就了1000多行的Cpp/Java半天写完并调好
- 经过面向对象课程的训练,第四单元开发和调试约3400行的数据生成器也从容了不少
-
Git入门与从会用到爱用
- 课程前没啥版本维护意识,使用Git主要是为了用Pages服务
- 课程中强制使用Git,逐渐熟悉了Git更多的功能,到课程后期开始喜欢使用Git,对非课程内容也使用Git管理
- 当然这部分的收获只有一半来自面向对象课程,另一半来自操作系统课程
-
跨平台开发能力
- 本学期开发的全部本地测试工具链均支持Windows和Linux
- 在Cpp中,通过
#ifdef _WIN64
实现多平台支持 - 在Python中,通过
platform.system()
实现多平台支持
-
若干或许会有用的奇淫巧技之第一部分
- 这些收获来自面向对象课程
- 使用cyaron造数据阴人
- 使用Jar字节码混淆工具加密
- 本地使用reflect干官方接口
- 在图片里面藏可运行的Jar玩
-
若干或许会有用的奇淫巧技之第二部分
- 这些收获不来自面向对象课程,但来自面向对象课程组,
感觉还是这部分收获比较大 - Network基本知识,抓包与拦截
- Sql注入攻击,Xss注入攻击
- 安全方面的基本知识,软件开发的一些要点
- 这些收获不来自面向对象课程,但来自面向对象课程组,
-
无进步不暖心大满贯
-
金刚狼
- 全部强测和互测中没有被发现Bug且发现他人Bug得分Top10
-
强测总分Top10
- 12次强测总分1195.0053,平均分99.5838
-
性能总分Top10
- 前6次强测总分595.0053,平均分99.1676
- 和进步相关的嘛,没办法全程强测没下过98确实没啥大的进步(逃)
- 和暖心相关的嘛,感觉自己还挺暖心的,体贴的帮好多通过强测的同学发现了Bug呢(逃)
-
最后的最后
-
是结束,也是新的开始,共勉
当蜘蛛网无情地查封了我的炉台, 当灰烬的余烟叹息着贫困的悲哀, 我依然固执地铺平失望的灰烬, 用美丽的雪花写下:相信未来。 当我的紫葡萄化为深秋的露水, 当我的鲜花依偎在别人的情怀, 我依然固执地用凝霜的枯藤, 在凄凉的大地上写下:相信未来。 我要用手指那涌向天边的排浪, 我要用手掌那托起太阳的大海, 摇曳着曙光那支温暖漂亮的笔杆, 用孩子的笔体写下:相信未来。 我之所以坚定地相信未来, 是我相信未来人们的眼睛—— 她有拨开历史风尘的睫毛, 她有看透岁月篇章的瞳孔。 不管人们对于我们腐烂的皮肉, 那些迷途的惆怅,失败的苦痛, 是寄予感动的热泪,深切的同情, 还是给以轻蔑的微笑,辛辣的嘲讽。 我坚信人们对于我们的脊骨, 那无数次地探索、迷途、失败和成功, 一定会给予热情、客观、公正的评定, 是的,我焦急地等待着他们的评定。 朋友,坚定地相信未来吧, 相信不屈不挠的努力, 相信战胜死亡的年轻, 相信未来,热爱生命。
以上是关于面向对象设计与构造课程总结作业的主要内容,如果未能解决你的问题,请参考以下文章
201777010217-金云馨《面向对象程序设计(Java)》第二周学习总结
201871010133-赵永军《面向对象程序设计(java)》第一周学习总结