第四单元和课程总结:简单的架构设计意识
一、第四单元架构设计总结
- 第一次作业
- 由于需要按名查找类图模型,于是建立"Class"类进行管理
- 由于方法具有参数导致类中存在二级结构,于是建立"Operation"类进行管理,再将其作为Class类的成员
- 对重名情况的处理:
不同对象的ID不同,对象实体也不同,但Name(String)相同,这是一个相当常见的场景。
笔者采用以下方法进行处理:- 建立从ID到对象的映射: private HashMap<String, Class> idsToClass
这样的映射是一一映射,使用普通的HashMap即可实现。 - 建立从Name到ID的映射: private MultiHashMap<String, String> nameToIds
这样的映射是一对多的映射,使用自建数据结构MultiHashMap实现。 - MultiHashMap的形式: HashMap<K, HashSet<V>> multiMap;
通过Key可以查询到一个包含Value的HashSet。这样就实现了一对多映射的方便管理。 - 可以预见到的是,自己建立一个 HashMap<K, HashSet<V>> multiMap 是十分方便的,其使用场景非常普遍,在两次作业中具体有:
- 维护一对多的映射(例如,通过重复的Name查询独一无二的ID,抛出DuplicateClassNameException等)
- 维护简单图的邻接表结构(一个点的邻接点或关联边构成一个集合)
- 建立从ID到对象的映射: private HashMap<String, Class> idsToClass
- 由于输入的元素类型顺序不定,于是构造UmlComparator类实现Comparator<UmlElement>接口,用于对元素进行排序,
要求任意元素的父元素出现顺序在其之前: Arrays.sort(elements, new UmlComparator()); - 具体架构大意如下类图:
- 第二次作业:
- 继承了第一次作业的类图解析与处理架构
- 由于需要按名查找状态机模型,于是建立"StateMachine"类进行管理
- 由于要求撰写类实现General接口,但是类不支持多继承,所以为了实现类图维护与有效性检查、顺序图维护、状态图维护这三个完全独立的功能,
将三个独立的功能分散到三个不同的类中,再将它们组合到最终的目标类中(将他们实例化,作为成员)。构造时将元素同时传给三个类进行构造即可。
这样,最终要求的目标类就仅剩对三个类中方法的调用,十分简洁,且三个功能互不干扰。
同时,对源码结构的管理也变得十分简洁,如下图所示:
- 具体架构大意如下类间关系图:
二、课程中对架构设计及OO理解的演进
- 第一单元
- 应当具有好的可拓展性,不应在方法中做出太多基于当前假设的妥协
- 应当将方法分解为基本原子操作的组合,让方法各司其职,而不是出现:
- 方法间的功能重合
- 迭代时的方法内容手动拆分
- 方法的副作用大,内容包含与其名称不符的额外操作
- 某方法中接了本来应该在上层方法中进行逻辑判断的锅
- 准确识别继承和接口的使用时机
- 当且仅当确实有可抽象的共性内容和提取的必要时,才进行继承和接口操作
- 善用工厂模式系列和单例模式
- 在最初设计时留出进行可拓展的空间,该空间很大程度由类间关系的设计决定
- 架构设计应当给性能的优化留出空间,如将需要算法的操作放在某个方法中,并将其尽量与其他方法解耦,便于后续进行调整
- 典型例子:给定图,求最短路、联通块等
- 不应进行重复性的工作,应借助程序员理清逻辑和过程、finished标记、lazy等方法提高性能
- 第二单元
- 在多线程程序中,应当将同步执行区域的代码和直接调用的代码区分开,放进不同的类中(如:调度器被电梯线程直接调用代码,没有必要设置成一个线程)
- 尽量少使用线程,准确识别什么对象应该单独承载一个线程(如:每部电梯一个线程,还是每个请求一个线程)
- 可以在设计时和编码中使用UML顺序图对每个线程间的交互和线程的进展进行设计
- 第三单元和第四单元
- 尽量识别出可抽象的、共有的功能或数据结构,单独建立一个类进行管理,并进行有效复用,如:
- 第四单元的MultiHashMap类,既能维护图结构,又能完成一对多的映射,做到了高效的复用
- 第三单元的ShortestPath类和Connectivity类,配合Graph类分别进行运算,在主类看来就成为了一个完成特定功能而无需关心的工具黑箱
- 完全无关的功能,应该由完全独立的类(甚至是package)实现,再在主逻辑类中进行组合,尽量将核心功能下放
- UML图是一种辅助设计的好的工具,不仅仅是类图,其顺序图和状态图对于程序员也十分重要:
- 状态图在设计和编码过程中是极其重要的逻辑指导
- 顺序图在多线程程序设计中具有十分重要的意义
- 尽量识别出可抽象的、共有的功能或数据结构,单独建立一个类进行管理,并进行有效复用,如:
三、课程中对测试的理解与实践的演进
- 第一单元:对于简单的输入-输出型程序:
- 具有固定格式的:使用数据生成器进行批量数据生成和测试
- 具有大量分支的:首先总结出每个分支处的组合情况,然后在数据生成器和手造数据中确保覆盖每种情况
- 首先使用数据生成器等技巧覆盖大部分的情况,然后针对其求补集,人工构造小规模但刁钻的数据进行进一步的确保
- 第二单元:对于交互输入和多线程程序
- 使用定时投喂模拟器,在关键的时间节点(如上一条请求刚刚处理完、刚刚开始处理等)附近投喂交互性的输入数据进行测试
- 构造数据规模不大但对同步互斥性、线程协作要求高的数据,进行反复多次测试,尽量降低不可复现bug的可能性
- 第三单元:
- 使用JUnit对每个类的每个方法进行单元测试,首先尽量保证每个方法内部的正确性
- 使用简单的类似JML的语言(自然语言和Java相结合的方式笔者觉得较好)对方法、类和数据进行规范
- 在JUnit的过程中,根据上述的规范语言构造针对性的测试用例
四、课程收获
- Java程序设计
- 基础语言
- 大数、可变长参数等特性
- lambda、泛型编程等奇技淫巧
- HashMap、HashSet等各种各样好用的Collection
- 高级
- Junit与单元测试
- 并发、多线程编程
- 基础语言
- 面向对象设计
- 继承与接口的类间关系设计
- 好的设计模式及其应用场景
- 第一次进行系统的面向对象程序实践
- 不断丰富需求下的程序重构与迭代
- UML类图、协作图、状态图的应用
Generally程序设计
- 契约式程序设计与JML类似物
- 单元测试
五、关于课程的三个具体建议
- 放弃对JML的强制语法要求和基于JML自动生成JUnit测试,但保留前置条件、后置条件等说明。
即,不要求求出绝对正确的JML语言,也不要求使用OpenJML等工具对程序进行验证和测试。(由于其工具链并不完善)
但,保留PRE-condition、POST-condition等的撰写和阅读要求,它们是十分重要的。
表意明确是最重要的,是不是精确使用JML并不是那么重要。即使是自然语言+Java的组合,只要能达到目的也一样好。
不应该为了形式而忘了其最初的目的。 - 第三单元和第四单元的讲授重点是JML和UML,作业的考察重点却是类似于第一单元的简单面向对象程序设计,作业意义不大。
可以将某一单元的内容改为复杂的面向对象设计,如应用复杂的设计模式等。
在第一单元中,课程组鼓励大家使用更为先进的设计模式,但没有硬性要求。
在后续的单元中,应该对其加大训练力度,否则其训练强度不够,难以过渡到实际开发中的复杂场景要求。 - 实验课的进一步科学化。
目前的实验课有如下几个问题:
(1) 题面的说明不够精确、严谨。(如多线程的某次实验,代码中和题面中提到的输出内容完全不符,严重影响自动测评的正确性)
(2) 评分标准模糊,评分手段不够严谨。(如许多代码题却无法进行有效的自动测评,只能由人工测试。如JML的补充等。)
(3) 上午讲完下午考,不够熟悉。
感谢课程组的努力,祝BUAA OO课程越来越好!
转载于:https://www.cnblogs.com/FuturexGO/p/11075059.html
第四单元和课程总结:简单的架构设计意识相关推荐
- 王家林最受欢迎的一站式云计算大数据和移动互联网解决方案课程 V1之Android架构设计和实现完整训练:HALFrameworkNative ServiceAndroid ServiceBes
如何理解Android架构设计的初心并开发出搭载Android系统并且具备深度定制和软硬整合能力特色产品,是本课程解决的问题. 课程以Android的五大核心:HAL.Binder.NativeSer ...
- 【成为架构师课程系列】系统架构设计:非功能性目标的设计
前言 为了提高综合客户满意度及不同质量属性的满意度,必须考虑计划和设计产品时的不同质量属性. -- Stephen H.Kan,<软件质量工程> 质量属性很难定义,但它们经常可以区分产品是 ...
- iOS架构设计-关东升-专题视频课程
iOS架构设计-3563人已学习 课程介绍 移动平台分层架构设计:大到企业级系统,小到移动设备,我们需要架构设计,因为设计是大道之理,那么分层是将一个系统分成相似技术的模块,这样做的目 ...
- 【OO学习】OO第四单元作业总结及OO课程总结
[OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...
- 面向对象第四单元(UML)总结体会课程总结
1.第四单元两次作业的框架设计 两次作业的框架设计是一脉相承的,第14次作业完全继承了第13次作业类中的方法. 通过对UmlElement类的分析,直接将前一次作业中涉及到的9个类在构造方法中便分开并 ...
- 第四单元博客总结——暨OO课程总结
第四单元博客总结--暨OO课程总结 第四单元架构设计 第一次UML作业 简单陈述 第一次作业较为简单,只需要实现查询功能,并在查询的同时考虑到性能问题,即我简单的将每一次查询的结果以及递归的上层结果都 ...
- OO第四单元——UML及其解析器——总结 暨 OO课程大总结
第四单元总结 第四单元主要内容是写代码解析UML,因此需要理解UML UML相关 starUML的储存方式是一个.mdj文件,通过使用文本编辑器观察这个文件,我们可以看出这是一个json格式储存的文件 ...
- 面向对象课程第四单元作业总结
面向对象第四单元作业总结 一.第四单元架构设计 1.1 思考过程 本单元涉及到UML图的解析和查询,那么架构设计的核心便在于存储结构的设计.由于原本.mdj文件中元素的存储是使用树形结构来组织的,那么 ...
- OO第四单元小结暨2019春季学期OO课程总结
OO第四单元小结暨2019春季学期OO课程总结 目录: OO第四单元总结 一.总结本单元两次作业的架构设计 第一次作业 第二次作业 学期最终总结 二.四个单元中架构设计及OO方法理解 2.1 第一单元 ...
最新文章
- PAT 显示格式错误
- SOTA排行榜大变天!MIT研究十个CV测试集,平均错误率超3.4%
- MySQL高效分页解决方案集
- 有那种条件可以用 火山云引擎 - 提供免费云计算销售管理系统
- 【Android Studio安装部署系列】十八、Android studio更换APP应用图标
- 5.linux目录结构介绍
- python typing与之配合_python 代码实例1
- c语言指针易错情况,C语言/C++从入门到精通之指针易错点总结
- Python:线程、进程与协程(5)——multiprocessing模块(2)
- 新浪微博android代码,新浪微博Android源代码(基于OAuth1.0 仅供学习)
- qq批量登录软件_20191228分享,雪藏了几天的软件合集分享,心痛一小编,开心一大家。...
- java开发常用chrome插件下载地址,开发者常用的十款Chrome插件
- android 播放器 samba,超强本地播放器一款支持samba、FTP/Windows共享服务-简单不折腾...
- 【路径规划】基于蚁群求解多旅行商MTSP问题matlab源码
- python实现zip分卷压缩与解压
- 一个关于IT界牛人的故事,估计是杜撰的。
- 解决linux:docker-compose: Permission denied
- Altium designer如何实现原理图和PCB交互式布局
- 什么是oracle 匿名块,Oracle PL/SQL匿名块
- 软件测试(三)p51-p104 软件测试用例方法、缺陷