本次实验训练抽象数据类型(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. 微信小程序人脸识别

    参考:https://cloud.tencent.com/document/product/1007/31071

  2. [MySQL]IP处理函数inet_aton()和inet_ntoa()

    INET_ATON(expr) 给出一个作为字符串的网络地址的"点地址"(如127.0.0.1)表示,返回一个代表该地址数值的整数.地址可以是4或8比特地址. mysql> ...

  3. 攻防世界——gif

    分析 只有黑白两种颜色,大小均一样.考虑代表着二进制. python脚本 ''' 同样颜色的图片的二进制数据都相同 编写思路:取二进制 -> 转ascii码 ''' white = open(r ...

  4. JavaSSM-总结

    Spring框架技术 SSM(Spring+SpringMVC+Mybatis)阶段的学习,也算是成功出了Java新手村. 前面我们已经学习过Mybatis了. 从这里开始,很多的概念理解起来就稍微有 ...

  5. centos下 Docker-修改磁盘存储目录(实操)

    预备知识: Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux 基金 ...

  6. 解决hexo报错spwan failed

    报错1 FATAL { err: Error: Spawn failed at ChildProcess.<anonymous> (/usr/local/src/hexo/cairbin/ ...

  7. Java学习day11

    如果程序出现了问题,我们没有做任何处理,JVM会做默认处理,即:把异常的名称,原因和位置等信息输出在控制台,程序停止执行 一个简单的检测集合对象是否含有某元素,有就再添加一个某元素 public cl ...

  8. HTTP:聊一聊HTTP中的强制缓存

    http响应response headers中会有一个cache-control,这个参数就是用来做强制缓存的 一.什么是强制缓存 强制缓存就是服务端告诉客户端某些资源(JS CSS IMG)需要按照 ...

  9. Vim 中进行文本替换

    Vim 中进行文本替换 格式 用法 :[range]s/from/to/[flags] tips: [] 表示该内容可选 参数 from 需要替换的字符串(可以是正则表达式) to 替换后的字符串 r ...

  10. 宝藏发现之API接口高效协作神器Apifox

    概述 背景 Apifox官方地址 https://www.apifox.cn/ 前面文章我们已经围绕微服务展开,缺少一个关键前置流程,那就是API接口设计,而在API接口设计开始前本篇先推荐一个非常好 ...