本次实验训练抽象数据类型(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. 微信小程序和公众号和H5之间相互跳转

    参考链接:https://www.imooc.com/article/22900 一.小程序和公众号 答案是:可以相互关联. 在微信公众号里可以添加小程序. 可关联已有的小程序或快速创建小程序.已关联 ...

  2. window.location.href用法与a标签的比较

    1.在使用这两种方法进行页面的跳转时,这两种方法都能够有效的实现该功能 但是其原理不尽相同 第一:window.location.href()方法必须书写在js中 <html> <h ...

  3. 微信小程序插件组件-Taro UI

    微信小程序组件使用以下官网查看 ↓  ↓  ↓ https://taro-ui.jd.com/#/docs/fab

  4. ruby 版本管理RVM (ruby version manager)

    macOS. 自带的ruby 版本目录权限比较高, 经常有很多 操作需要权限而不能执行 虽然 macOS 自带了一个 ruby 环境,但是是系统自己使用的,所以权限很小,只有 system. 而/Li ...

  5. 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客?

    前言 OK,我也来造轮子了 博客系统从一开始用WordPress,再到后来用hexo.hugo之类的静态博客生成放github托管,一直在折腾 折腾是为了更好解决问题,最终还是打算自己花时间搞一个好了 ...

  6. 高精度加法(C++实现)

    高精度加法 简介 用于计算含有超过一般变量存放不下的非负整数 高精度加法这个过程是模拟的小学竖式加法计算 步骤 以下有顺序之分 数组清零 输入 获取长度 逆置 字符型数字转成对应的整型数字 计算并输出 ...

  7. [翻译] 使用 TensorFlow 进行分布式训练

    本文以两篇官方文档为基础来学习TensorFlow如何进行分布式训练,借此进入Strategy世界.

  8. 《手写Mybatis》第4章:Mapper XML的解析和注册使用

    作者:小傅哥 系列:https://bugstack.cn/md/spring/develop-mybatis/2022-03-20-%E7%AC%AC1%E7%AB%A0%EF%BC%9A%E5%B ...

  9. 把图片存储 canvas原生API转成base64

    1.LocalStorage有什么用? 2.LocalStorage的普通用法以及如何存储图片. 首先介绍下什么是LocalStorage 它是HTML5的一种最新储存技术.但它只能储存字符串.以前的 ...

  10. Hadoop3.x 三大组件详解

    Hadoop Hadoop适合海量数据分布式存储和分布式计算 运行用户使用简单的编程模型实现跨机器集群对海量数据进行分布式计算处理 1. 概述 1.1 简介 Hadoop核心组件 HDFS (分布式文 ...