本次实验训练抽象数据类型(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实验总结的更多相关文章

  1. 哈工大软件构造Lab2(2022)

    (防扒小助手) 本人CSDN博客: https://blog.csdn.net/m0_61753302https://blog.csdn.net/m0_61753302本人博客园博客(同步CSDN): ...

  2. 软件构造Lab1实验要点总结

    本实验通过解决三个问题,训练了基本的Java编程技能,并给出了Eclipse+Jdk+Junit的配置方案,以及对使用git进行项目管理的方式. 1.因此,本实验的第一个要点是配置环境.具体配置环境过 ...

  3. 软件构造 Lab1

    大二软件构造第一次实验 本人本次实验操作系统:macOS high Sierra 10.13.3 任务一:MagicSquare 对于本任务,主要需要实现两个方法,一个是isLegalMagicSqu ...

  4. 哈工大软件构造Lab3(2022)

    (防扒小助手) 本人CSDN博客: https://blog.csdn.net/m0_61753302 本人博客园博客(同步CSDN): 何以牵尘 - 博客园 (cnblogs.com)https:/ ...

  5. 哈工大软件构造Lab1(2022)

    目录 一.实验目标概述 二.实验环境配置 1.安装编写java程序的IDE--IntelliJ IDEA 2.安装Git 3.安装Junit 4.GitHub Lab1仓库的URL地址 三.实验过程 ...

  6. 麻省理工18年春软件构造课程阅读02“Java基础”

    本文内容来自MIT_6.031_sp18: Software Construction课程的Readings部分,采用CC BY-SA 4.0协议. 由于我们学校(哈工大)大二软件构造课程的大部分素材 ...

  7. HIT2019春软件构造->Git&Github学习笔记

    由于软件构造课程需要,学习使用git,以下作为学习笔记. 一.Git初始化及仓库创建和操作  1.基本信息设置(设置签名)  命令        项目级别/仓库级别:仅在当前本地库范围内有效 git ...

  8. 面向对象软件构造 (Bertrand Meyer 著)

    Part A: The Issues 议题 第一章 软件品质 第二章 面向对象的标准 Part B: The Road To Object Orientation 通向面向对象之路 第三章 模块性 第 ...

  9. 由软件构造引申的OOP与POP的心得体会

    在大一初学C语言的时候,所解决的问题都是一些轻量级的简单问题,当时写过一个教学管理系统.这个教学管理系统的功能很简单,思想就是“流水线”:按部就班的实现所有流程.要完成整个教学管理系统,实际上就是完成 ...

随机推荐

  1. Qt 实现配置 OpenCV 环境,并实现打开图片与调用摄像头

    一.说明 所用QT版本:5.9.1 电脑配置:win10,64位系统 调用的是编译好的:OpenCV-MinGW-Build-4.1.0(稍后放链接) 在大学期间,由于项目需求需要用到QT+openc ...

  2. FastAPI(七十三)实战开发《在线课程学习系统》接口开发-- 回复留言

    之前文章分享FastAPI(七十二)实战开发<在线课程学习系统>接口开发-- 留言列表开发,这次我们分享如何回复留言 按照惯例,我们还是去分析这里面的逻辑. 1.判断用户是否登录 2.用户 ...

  3. numpy教程04---ndarray的索引

    欢迎关注公众号[Python开发实战], 获取更多内容! 工具-numpy numpy是使用Python进行数据科学的基础库.numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变 ...

  4. java_类的访问控制符

    1.分类: public protected default private是java中的访问控制修饰符. public String name; protected String name; Str ...

  5. 【LeetCode】76. 最小覆盖子串

    76. 最小覆盖子串 知识点:字符串:滑动窗口 题目描述 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ...

  6. Flex 的 多种对齐属性

    1. html 结构 <div id="container"> <div class="item item-1"> <h3> ...

  7. cookie和localstorge、sessionStorge的区别

    一.背景由来 cookie原来是用来网络请求携带用户信息的,只不过在HTML5出现之前,前端没有本地存储的方法,只能使用cookie代替 localstorge.sessionStorge是html5 ...

  8. Git删除已提交的文件

    Git删除已提交的文件 Git删除已提交的文件 定位文件 删除文件 参考链接 昨天通过Git Bash提交代码的时候遇到了由于单个文件大小超过100M,导致代码上传失败的问题.考虑到那个大文件是用于训 ...

  9. 联邦平均算法(Federated Averaging Algorithm,FedAvg)

    设一共有\(K\)个客户机, 中心服务器初始化模型参数,执行若干轮(round),每轮选取至少1个至多\(K\)个客户机参与训练,接下来每个被选中的客户机同时在自己的本地根据服务器下发的本轮(\(t\ ...

  10. MySQL基础合集

     我的小站 1.MySQL的优势 运行速度快 使用成本低 可移植性强 适用用户广 2.MySQL的运行机制 一个SQL语句,如select * from tablename ,从支持接口进来后,进入连 ...