软件构造Lab2实验总结
本次实验训练抽象数据类型(ADT)的设计、规约、测试,并使用面向对象编程(OOP)技术实现ADT。具体来说内容如下:
针对给定的应用问题,从问题描述中识别所需的ADT;
设计ADT规约(pre-condition、post-condition)并评估规约的质量;
根据ADT的规约设计测试用例;
ADT的泛型化;
根据规约设计ADT的多种不同的实现;针对每种实现,设计其表示(representation)、表示不变性(rep invariant)、抽象过程(abstraction function)
使用OOP实现ADT,并判定表示不变性是否违反、各实现是否存在表示泄露(rep exposure);
测试ADT的实现并评估测试的覆盖度;
使用ADT及其实现,为应用问题开发程序;
在测试代码中,能够写出testing strategy并据此设计测试用例。
本实验分为两个部分,每部分的难点以及要点如下:
1.第一个实验是从头设计一个Graph,重难点在于对每种实现的表示,不变性以及抽象过程。另一个需要注意的点是在实现方法之前需要先写测试用例和测试策略,这样在具体实现不同方法的时候就可以对各种可能的输入空间进行划分,从而使代码实现更加具有可扩展性以及模块化。测试用例和测试策略注意要对所有可能的输入进行覆盖,用笛卡尔覆盖的方法划分输入空间可以保证输出样例全覆盖。然后根据测试策略写能够覆盖每种情况的最小集合的测试。
然后实现以边为主的图形和以点为主的图形,其中重点在于对两种不同的实现方法,我们对数据结构和方法的设计也不同。以边为主的方式是每个边用起点,终点,权重表示,然后和点集一起构成图形的实现。至于方法的具体设计如下:
ConcreteEdgesGraph需要实现Graph的6个函数,还要完成一个toString函数。
add函数:set集合中的add方法刚好可以保证加入不重复的点,所以直接使用即可。加入成功返回true,不成功返回false。
set函数:以权重大于0,小于0,等于0分别进行讨论。小于0直接输出错误信息;等于0看点存不存在,不存在就不用管,都存在且有边的话就删掉边;大于0的话就加点加边,边存在的话就改值。但Edge类是immutable的,所以只能删掉原来的edge,再新建一个edge。
remove函数:点集里删除点,边集里把相关边也删掉。
vertices函数:返回set集合vertices即可,但为了外面的人不能调用,新建一个集合返回即可。
sources函数:找所有target是输入的边,然后把source和weight加到新建的map里返回即可。
targets函数:找所有source是输入的边,然后把target和weight加到新建的map里返回即可。
toString函数:把图的所有点和边按顺序输出即可,格式规范就好。
以点为主的图形设计类似,只是点的实现关键在以点为主,所以存边的方式可以用Map,当然这两个量为了防止泄露,还是使用private final格式。以点为主的话,我们需要做的就是存点的标记(现在是String),然后边的话就是用Map,存target和权重。
然后用泛型L代替String,只要对每个相关函数和方法加个标签就可以了。然后实现Graph也很简单,用以边为主的图形和以点为主的其中一个新建就可以了。经过测试,覆盖率很高,结果也都是正确的。
2.第二个实验是重新实现Lab1的FriendshipGraph函数,用这次的Graph来实现。改代码的难度很小,因为方法是固定的,主要难点在于对FriendshipGraph函数的每种实现的表示,不变性以及抽象过程。还有测试用例也要补充测试策略,并根据测试策略的结果进行测试样例的编写。其他都不算特别难,所以总的难度不算很大。
以上就是我总结的本实验的要点,希望对大家有所帮助。
软件构造Lab2实验总结的更多相关文章
- 哈工大软件构造Lab2(2022)
(防扒小助手) 本人CSDN博客: https://blog.csdn.net/m0_61753302https://blog.csdn.net/m0_61753302本人博客园博客(同步CSDN): ...
- 软件构造Lab1实验要点总结
本实验通过解决三个问题,训练了基本的Java编程技能,并给出了Eclipse+Jdk+Junit的配置方案,以及对使用git进行项目管理的方式. 1.因此,本实验的第一个要点是配置环境.具体配置环境过 ...
- 软件构造 Lab1
大二软件构造第一次实验 本人本次实验操作系统:macOS high Sierra 10.13.3 任务一:MagicSquare 对于本任务,主要需要实现两个方法,一个是isLegalMagicSqu ...
- 哈工大软件构造Lab3(2022)
(防扒小助手) 本人CSDN博客: https://blog.csdn.net/m0_61753302 本人博客园博客(同步CSDN): 何以牵尘 - 博客园 (cnblogs.com)https:/ ...
- 哈工大软件构造Lab1(2022)
目录 一.实验目标概述 二.实验环境配置 1.安装编写java程序的IDE--IntelliJ IDEA 2.安装Git 3.安装Junit 4.GitHub Lab1仓库的URL地址 三.实验过程 ...
- 麻省理工18年春软件构造课程阅读02“Java基础”
本文内容来自MIT_6.031_sp18: Software Construction课程的Readings部分,采用CC BY-SA 4.0协议. 由于我们学校(哈工大)大二软件构造课程的大部分素材 ...
- HIT2019春软件构造->Git&Github学习笔记
由于软件构造课程需要,学习使用git,以下作为学习笔记. 一.Git初始化及仓库创建和操作 1.基本信息设置(设置签名) 命令 项目级别/仓库级别:仅在当前本地库范围内有效 git ...
- 面向对象软件构造 (Bertrand Meyer 著)
Part A: The Issues 议题 第一章 软件品质 第二章 面向对象的标准 Part B: The Road To Object Orientation 通向面向对象之路 第三章 模块性 第 ...
- 由软件构造引申的OOP与POP的心得体会
在大一初学C语言的时候,所解决的问题都是一些轻量级的简单问题,当时写过一个教学管理系统.这个教学管理系统的功能很简单,思想就是“流水线”:按部就班的实现所有流程.要完成整个教学管理系统,实际上就是完成 ...
随机推荐
- CentOS的安装以及IP地址(动态/静态)的配置
啊!复试压力好大,跟好多学长聊完以后觉得自己更该好好努力了,一边好好准备复试科目,一边把之前忘掉的捡起来吧,加油! 1.安装的具体过程请参照这位博主写的,我觉得写的很详细,https://blog.c ...
- CSS简单样式练习(一)
运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...
- mpvue下拉刷新
1 开启下拉刷新 在想要下拉刷新的页面的 main.json 里,添加: { "navigationBarTitleText": "页面标题", "e ...
- 模拟FCFS调度算法(先来先服务)
文章目录 一.FCFS的介绍 二.代码演示 三.代码分析 1.使用节点模拟进程 2.SimulateFCFS(核心模拟FCFS类) 3.创建一个节点为n的队列(模拟就绪队列) 4.核心计算分析 5.输 ...
- rancher 添加集群
用rancher的管理账户登录rancher控制台首先创建用户 jinzs,后面用户绑定到要添加的集群上的 其次点全局,出现集群列表 >点添加集群 这里集群名称任意,只要你知道,该名称要对应实际 ...
- 在非k8s 环境下 的应用 使用 Dapr Sidekick for .NET
在k8s 环境下,通过Operator 可以管理Dapr sidecar, 在虚拟机环境下,我们也是非常需要这样的一个管理组件,类似下图:在这张图片中,在上图左面,我们看到了"dapr.ex ...
- Python Requests 速通爆肝、这么牛逼的库你还不会用吗?
上网原理 爬虫原理 Get.Post Requests 介绍 安装 常用方法 Http协议 开发者工具网络界面 Response对象 下载保存一张图片.一首音乐 添加Headers发送请求 判断HTT ...
- Java学习day15
File是文件和目录路径名的抽象表示 文件和目录可以通过File封装成对象 对于File而言,封装的不是一个真正存在的文件,只是一个路径名,它可以存在,也可以不存在,要通过后续操作把路径的内容转换为具 ...
- el-menu菜单 -- unique-opened 子菜单唯一性失效
总结: 点击的是 el-sub-menu . 所以 el-sub-menu 的唯一性是必须的.否则 unique-opened 属性不生效
- Java语言学习day32--8月07日
###07正则表达式邮箱地址验证 * A: 正则表达式邮箱地址验证 * a: 案例代码 public class RegexDemo2 { public static void main(String ...