热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OO面向对象编程:第四单元总结及课程总结

OO面向对象编程:第四单元总结及课程总结OO面向对象编程:第四单元总结及课程总结一、第四单元作业架构1.第一次作业2.第二次作业3.对UML的理解:总结与感受二、课程

OO面向对象编程:第四单元总结及课程总结

 

 

OO面向对象编程:第四单元总结及课程总结

一、第四单元作业架构

1.第一次作业

2.第二次作业

3.对UML的理解:总结与感受

二、课程总结

1.结构设计以及方法理解的演进

2.理解与实践的演进

3.课程收获

三、给课程的改进建议

 

 

一、第四单元作业架构

1.第一次作业

作业类图:

  1. 顶级类 MyUmlGeneralInteraction 负责将输入归类,形成3个子UmlElement数组,分配给处理类图,状态图和顺序的3个类;建立基础设施类:graph,实现图的通用方法:加边,dfs,计算可达结点,拓扑排序等。对于类图,类和接口都当作图中的结点;

  2. MyUmlClassModelInteraction处理类图,MyUmlCollaborationInteraction处理顺序图,MyUmlStateChartInteraction处理状态图,三者基于graph类;状态,迁移个数抽象成图的结点数和边数,后继状态抽象成计算图中某点的可达结点数; 参与对象,交互消息抽象成图的结点数和边数, incoming消息抽象成图中某个结点的入度; 有了图结构之后,类图中的函数实现也变得非常简单。比如计算类实现的全部接口实质,先做拓扑排序,再按照逆拓扑序依次计算每个结点实现的接口。这样一来,计算某个类时,其父类,以及其实现的接口实现的接口都已经算出来了,直接列表相加就行。不需要任何的递归。 建完3个图后,将所有的查询全部计算完毕缓存起来,之后查询只是访问缓存结果。

2.第二次作业

作业类图:

1 在第二次作业中我将功能更细致的拆出去。Graph类用来处理新增加的对状态图和顺序图的查询,Check类实现对类图 进行Rule1,Rule2,Rule3的查询,Build类服务于构造方法中对UMLElement的信息的初始存储,主类依旧完成对类图的先关查询,为了满足类不超过500行,对于与attribute有关的查询被单独放到了count类。拆类将功能更加细致的划分出去,但是更多的map结构在类之间传递也为写代码带来困扰,并且有一个类方法依赖的数据结构过多,最终传入9个参数,checkstyle没有过。

2 在第一次作业的基础上新增的查询状态图和查询顺序图的需求难度不大,在构造方法中把这两个图有关数据类型之间的关系保存下来,在getStateCount、getTransitionCount、 getParticipantCount、getMessageCount、 getIncomingMessageCount直接查询即可,getSubsequentStateCount中后继状态之间的关系类比多继承关系,用bfs解决也是轻车熟路。

Rule1就是对于已经存好信息的数据结构进行查询即可。对于Rule2,由于接口与类继承特性的区别,分别检查接口与类是否满足要求。对于循环继承,考虑进行dfs递归,我的初始版本dfs设计的不好,思路受限于哈密尔顿图的dfs算法,导致一些冗余重复的递归发生,对于继承分支多的接口检查时会超时。经过思考与同学讨论,意识到这个地方的dfs与哈密尔顿图的dfs要求有些许差别,因此实现上细节应该改进。对于Rule3,与检查类有几个接口的思路类似,使用bfs并适当缓存信息即可。

3.对UML的理解:总结与感受

统一建模语言(英语:Unified Modeling Language,缩写 UML)是非专利的第三代建模和规约语言。UML是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进行建模方面,特别是在软件架构层次已经被验证有效。

在UML系统开发中有三个主要的模型:

  • 功能模型:从用户的角度展示系统的功能,包括用例图。

  • 对象模型:采用对象,属性,操作,关联等概念展示系统的结构和基础,包括类别图、对象图。

  • 动态模型:展现系统的内部行为。包括序列图,活动图,状态图。

区分UML模型和UML图是非常重要的,UML图,包括用例图、协作图、活动图、序列图、部署图、构件图、类图、状态图,是模型中信息的图形表达方式,但是UML模型独立于UML图存在。UML的当前版本只提供了模型信息的交换,而没有提供图信息的交换。

UML使用一套与Java语言或其他面向对象语言等价物,同时也是本体论等价物的图形标记。

UML并不是一个方法学,也不要求使用一个方法学,但是UML对于Rational统一过程来说是必不可少的。

回顾本单元的设计训练:

• UML功能视图(use case diagram)支持的元素及关系表达 • 用例(use case):系统提供给用户的功能及其交互场景 • Precondition, postcondition, flow of events • 执行者(actor):为系统执行提供输入激励或者记录系统执行结果的相关 对象 • 自然人、设备、其他系统等 • actor与use case之间的关系 • 哪些用户为这个用例提供输入? • 哪些用户关心这个用例的执行结果? • use case与use case之间的关系 • 依赖关系 • 抽象层次关系

• 状态图针对具有一定状态复杂度的类来专门设计其行为 • 多种状态和转移关系 • 在运行时会随输入动态改变其状态 • 一般多用于描述控制行为:针对被控对象的状态来实施相应的控 制行为,并维护其状态更新 • 线程调度(线程对象的状态空间) • 根据线程对象的状态来调度请求来更改其状态 • 电梯调度(电梯对象的状态空间) • 根据电梯对象的状态来分配乘客请求并改变其状态 • 不同状态之间在属性取值上必须严格分离

 

二、课程总结

 

1.结构设计以及方法理解的演进

本学期OO课程,让我进入了面向对象编程的世界。在这个世界中,万物皆对象。没有什么new一个对象解决不了的问题,如果有,那就再new一个新的对象。说起来很简单,但是其中技巧非常之多。我们的面向对象程序需要具有高内聚,低耦合的特点,具有很强的复用性和扩展性。这需要我们充分理解并且合理运用JAVA封装,继承,多态这三个特点。封装为了程序的安全性,我们代码风格也要求我们进行合理的封装。而最关键的时继承和多态。通过继承,接口,重写等操作,会大大增强我们程序的可扩展性和复用性。

在第一单元表达式求导的作业中,我对面向对象的理解不足,程序非常的“面向过程”,主要体现在大量核心代码集中在一个类,甚至一个方法之中;类与类之间的耦合度很高,我在使用Metrics度量分析我的代码时,很多类复杂度爆红;代码的扩展性很差,三次作业我都进行了大面重构甚至重写。

经过第一单元作业的经验教训,在第二单元作业中,我非常重视代码的构架设计,注意类功能的内聚性,用包对不同功能的类进行了划分,并应用枚举类,单例模式,观察者模式等多种方法,

让代码具有一定的扩展性。在三次增量式作业中,我的构架基本上可以支持扩展,让作业之间的迭代变得容易了很多。但是我对各种方法运用的还不够成熟,复杂度还是比较高

第四单元作业,我延续一学期以来学习面向对象的思想,使用了接口和继承对元素进行抽象,封装了一些数据结构,并对不同图的元素进行划分。保证了两次作业增量式设计,进一步锻炼了构架设计能力,让我对面向对象的思量有了更深的理解。

总体来说,经过了这学期以JAVA语言为载体的面向对象编程训练之后,我逐渐理解了面向对象建模思维的一般过程与方法,抛弃了以前面向过会曾编程的种种不好的习惯。

2.理解与实践的演进

在第一单元的测试中,着重测试了代码的正确性,其中主要针对边界条件进行测试,构造了大量的数据进行验证。由于数据的规模很小,没有对性能进行很好的测试。

第二单元是多线程的测试,由于多线程的特殊性,导致一些bug很难复现,不太容易找到程序中存在的bug,导致在面对一些特殊数据时,处理方法不够得当,出现了很多问题。

第三单元的JML实现中,虽然有自动测试的工具,但还是主要通过自己生成的数据进行测试。为了保证运行的正确性,针对每一条指令的每一个分支进行测试,尽量做到充分覆盖。而由于没有测试程序运行时间的措施,导致在第一次作业中对运行时间估计出错,大面积超时。

第四单元是UML的分析,测试主要通过自己构造UML模型来测试,针对于模型中的具体细节进行独立测试。在第二次作业状态图和顺序图的分析时,单独考虑两者的所有情况即可。而在三条规则性检查时,借助讨论区中的一些测试样例完成了测试。

在这四个单元中,课程组培养我们注重的不仅仅是代码书写和架构设计,还有对代码的测试也是一门重头戏。可以说,代码的测试是保证每份代码质量必不可少的一环,如果缺少了代码测试,相信很少有人能够信誓旦旦的保证自己的代码完全没有问题。课程组在第一单元的第一次作业就强调让我们重视代码的测试问题,鼓励我们对代码进行深度测试,尤其是在第三单元,我们学习了Junit对代码进行测试,这样能够基本保证代码的基本功能的可靠性。

 

3.课程收获

(1)封装

所谓“封装”,就是用一个框架把数据和代码组合在一起,形成一个对象。遵循面向对象数据抽象的要求,一般数据都被封装起来,也就是外部不能直接访问对象的数据,外部能见到的只有提供给外面访问的公共操作(也称接口,对象之间联系的渠道)。在C#中,类是对象封装的工具,对象则是封装的基本单元。

(2)继承

世界是复杂的,在大千世界中事物有很多的相似性,这种相似性是人们理解纷繁事物的一个基础。因数事物之间往往具有某种“继承”关系。比如,儿子与父亲往往有许多相似之处,因数儿子从父亲那里遗传了许多特性;汽车与卡车、轿车、客车之间存在着一般化与具体化的关系,它们都可以用继承来实现。

(3)多态性

多态性就其字面上的意思是:多种形式或多种形态。在面向对象编程中,多态是指同一个消息或操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。例如,问甲同学:“现在几点钟”,甲看一看表回答说:“3点15分”,又问乙同学:“现在几点钟”,乙想一想回答说:“大概3点多钟”,又问丙同学:“现在几点钟”,两干脆回答说:“不知道”。这就是同一个消息发给不同的对象,不同的对象可以做出不同的反应。

三、给课程的改进建议

我觉得这门课程整体的难度设置,各个单元的内容的连贯性都还不错,学习的主题也比较鲜明,作业相关内容的设置还有老师助教们为我们提供的优良的线上测试的平台的体验都是相当不错的。

有以下几点建议:

1.在寒假时可讷讷更需要自己去学习大量的java的语法知识,其中在预习的过程中,就有可能已经让我们去自学了大量的关于面向对象编程思想的知识,这对于我来说,在寒假没有进行大量相关工作,到了开课之后,感到对整体的要求同学对基本知识的掌握上有些不达标。

因此希望在预习阶段,老师能够给一些更加具体有效的预习建议,甚至是教程。

2.对于上课的实验部分,也就是上机,虽然主旨是让我们去学习,而非测验,但是每次早上刚刚介绍完本次学习的主题和重点之后,下午就直接去进行相关的测试,这就要求我们提前比较长的时间去准备,去了解之后的学习内容,所以对于一部分同学早上才了解了相关知识之后,下午就直接考试的话,可能会带来比较大的压力。

所以建议每次上了讲解知识之后,隔一段时间,再去进行上机这样的测试活动。

 

 

转:https://www.cnblogs.com/chenhaonan-nickyoung/p/11078841.html



推荐阅读
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • Postgresql备份和恢复的方法及命令行操作步骤
    本文介绍了使用Postgresql进行备份和恢复的方法及命令行操作步骤。通过使用pg_dump命令进行备份,pg_restore命令进行恢复,并设置-h localhost选项,可以完成数据的备份和恢复操作。此外,本文还提供了参考链接以获取更多详细信息。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
author-avatar
好人___夏洁
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有