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

OOsummaryUnit4&课程总结

Unit4博客&课程总结Unit4作业的架构设计本单元作业的设计我分为了三个模块处理:模型构建+预处理+任务函数,前两部分即为整个图的完整构建,第三部分即为实现题目要求的查询方法。

Unit 4博客&课程总结

Unit 4作业的架构设计

本单元作业的设计我分为了三个模块处理:模型构建 + 预处理 + 任务函数,前两部分即为整个图的完整构建,第三部分即为实现题目要求的查询方法。

最终的文件树如下图所示:

 

 


模型构建

为了便于对于一些属性的查询以及避免与官方包内的数据类混淆,我为题目中遇到的每个UML元素都构建了自定义类,在拷贝过原有的属性后,另外新增了一些过程量表示模型图结点间的关系。以 UmlClass 为例,我构建了 MyClass 类。为了表示类图中的属性、方法以及其他一些中间变量,我构建了相应的容器并配备了查询方法。

除此之外,对于整体图模型的解析与构建,我采用了层次化解析的思路,即从上到下依次解析。例如对于类图元素,先解析图中的结点(类与接口),再搭建类图中的关系、补充结点信息(继承、关联、方法等),以此类推。层次化构建使过程非常清晰,且可扩展性也非常好。

 

 


预处理

因为本单元的任务完全是静态查询,数据在输入后不会发生变化,因此为了减少查询时的时间复杂度,我对一些变量采取了预处理的办法,在执行完模型构建后调用相应的 update() 方法。例如对类的继承深度 depth、类的间接属性、类实现的全部接口(包括直接与间接)等。

 

 


任务函数

任务函数即为预处理后对相关的数据的查询,这部分的具体实现内置在每个自定义类中,不必详细介绍。

三个模块完全依次执行,相互独立,耦合度低,且可扩展性很强。

 


架构设计思维及OO方法理解的演进


架构设计

架构设计是OO课程中不可或缺的一环。以往程序设计的题目只是解决一个小问题,我习惯于拿到题目后直接上手,遇到问题时再去想怎么解决;但是OO课程每一个单元的作业更像一个完整的项目,代码动辄几百上千行,要想避免让代码变为屎山,就要求有一个清晰、可扩展的架构。因此在每个单元作业前,我都会预留思考的时间,仔细想想需求的层次、模块的设计、以及可能的扩展方向,力求在将来的增量开发中有更好的体验

像在第二单元的线程安全的设计中,我反复琢磨可能发生死锁的情况,对执行 wait() 方法的模块反复推敲,取得了良好的效果。

在第四单元的作业中,在拿到题目后,层次化解析UML元素、分层架构的思路就已经浮现在脑海了,我将所有的元素分为5层进行解析,先是类图、接口、顺序图,再是他们中的属性、方法、消息等,很快就完成了作业,足以见得架构设计给我带来的帮助。

 


OO方法

面向对象中封装性至关重要,是面向对象的灵魂。OO将需求拆解为各个模块,通过完善模块内容与处理模块间的交互来完成需求。这样的好处是:



  1. 层次化清晰,每个模块解决自己的活,分工明确,同时也降低代码的耦合度,利于维护与更改;



  2. 增强可扩展性,需求变化后只需更改相应模块的内容即可解决;



  3. 复用性强,模块作为一个整体可被反复调用;



 


测试方面

OO课程中的测试环节我都是按照以下流程进行:



  1. 利用样例代码与自己手动捏的较弱的数据进行测试,保证基础功能的完成;



  2. 针对易错、易超时的方法针对性构造数据强测,如Unit 3中图论的一些方法等;



  3. 与小伙伴对拍,利用大数据覆盖性测试。



在第一单元中,我没有使用测评机,均是采用上述一二步骤进行测验。由于构造测试样例的疏漏,我没有考虑构造输入为0的情况,导致在第二次作业中强测被扣了分。

在第二单元中,针对电梯请求的构造,我利用测评机生成覆盖性数据进行本地强测。但是可能由于测评机不够完善,导致在第二次作业采用共享队列时被hack了。

针对第三单元的JML测试,我用不惯Junit,实际上还是针对方法自己构造测试数据。因此还是采用了针对图论方法构造可能超时的数据进行测验,第三单元强测均满分。

第四单元细节繁多,的测试主要以和小伙伴对拍为主。先用超大数据进行强测,而后生成对应的针对性数据找bug,效果不错。

 


课程收获



  1. 学会一门新语言——OO课程帮助我了解了java,不仅包括基础的java语言,还包括UML类图、JML规格等。通过第一到第四单元的作业,我已经能够熟练使用java编程,并轻松地debug;



  2. 一帮好友——OO课程作业设计十分巧妙,有许多值得推敲的点,上到架构的设计、模块的构建,小到具体算法是实现,都是值得讨论的地方。在于他人交流的过程中,我感受着思维的碰撞,与同学们相互交流,也让我结实到了许多优秀的同志;



  3. 对于层次化架构的理解——设计层次化的架构是面向对象编程必不可少的环节,简约、清晰、易扩展的架构能节约很多时间。在拿到需求后设计模块、理清楚逻辑关系是首要环节,否则很有可能在后期的迭代开发中面临要么重构,要么堆屎山代码的选择。层次化架构的分析不仅是OO的一种思想,也是一种人生哲理啊!这告诉我们切勿想着一口气吃个胖子,要做好规划。



 


改进建议



  1. 我认为寒假的预习板块可以改进一下。可以看出该部分是为了承接第一单元表达式计算的作业而设计的,花费了很多篇幅去讲解正则表达式的格式以及UML类图的设计,但是花费一个单元共5讲的内容来介绍正则表达式有些冗长。我认为可以将第三弹的内容进行压缩,达到熟悉正则的目的即可,并相应地增加一个预习第四弹,可以介绍一些常见的设计模式(如工厂模式、单例模式等)。OO课程的目的最终还是培养面向对象的思想、架构设计能力,这样也可以契合培养方案。



  2. 我认为对于讨论区以及微信群的交流与答疑方式可以改进。据实际体验而言,微信内的答疑效率非常低下,许多人不翻消息记录,会有大量的重复提问;讨论区的相关板块十分杂乱,没有索引结构,助教老师回答采用 “引用原话+回复” 的方式不够清晰,导致在“针对指导书提问”这一个栏目给人观感十分臃肿、不清晰。我认为可以将一些针对指导书内容的提问局限在讨论区,微信群仅用于其他交流,再为规范讨论区的结构,建立清晰的索引结构,提高同学们提问、查找的效率



  3. 研讨课上一些内向或摆烂的同学不积极发言,全程混讨论,没有自己的观点,享受他人思维碰撞的果实,这是不公平的。我认为可以对研讨课环节分数的评定进行一些细化,如会议纪要中写出每个组员贡献的思想并以此评议每个人的分数,再根据小组代表发言的内容进行小组加分,细化为个人与团体分,可能大家积极性会高一些。





推荐阅读
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 一家位于长沙的知名网络安全企业,现面向全国诚聘高级后端开发工程师,特别欢迎具有一线城市经验的技术精英回归故乡,共创辉煌。 ... [详细]
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
  • 对象存储与块存储、文件存储等对比
    看到一篇文档,讲对象存储,好奇,搜索文章,摘抄,学习记录!背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 本文通过思维导图的形式,深入解析了大型网站技术架构的核心原理与实际案例。首先,探讨了大型网站架构的演化过程,从单体应用到分布式系统的转变,以及各阶段的关键技术和挑战。接着,详细分析了常见的大型网站架构模式,包括负载均衡、缓存机制、数据库设计等,并结合具体案例进行说明。这些内容不仅有助于理解大型网站的技术实现,还能为实际项目提供宝贵的参考。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • ABP框架是ASP.NET Boilerplate的简称,它不仅是一个开源且文档丰富的应用程序框架,还提供了一套基于领域驱动设计(DDD)的最佳实践架构模型。本文将详细介绍ABP框架的特点、项目结构及其在Web API优先架构中的应用。 ... [详细]
  • Juval Löwy主张,每个类都应被视为服务,这并非是为了让服务无处不在,而是因为微服务是经过深思熟虑后系统分解的自然结果。在他的设计和构建的系统中,这种理念有助于提高模块化、可维护性和扩展性。通过将每个类视为独立的服务,系统能够更好地应对复杂性,实现更灵活的部署和更高的性能。 ... [详细]
  • 深入解析 RuntimeClass 及多容器运行时应用
    本文旨在探讨RuntimeClass的起源、功能及其在多容器运行时环境中的实际应用。通过详细的案例分析,帮助读者理解如何在Kubernetes集群中高效管理不同类型的容器运行时。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • 探索CNN的可视化技术
    神经网络的可视化在理论学习与实践应用中扮演着至关重要的角色。本文深入探讨了三种有效的CNN(卷积神经网络)可视化方法,旨在帮助读者更好地理解和优化模型。 ... [详细]
  • 本文总结了近年来在实际项目中使用消息中间件的经验和常见问题,旨在为Java初学者和中级开发者提供实用的参考。文章详细介绍了消息中间件在分布式系统中的作用,以及如何通过消息中间件实现高可用性和可扩展性。 ... [详细]
author-avatar
Jerrefy是不会游泳的鱼_177
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有