哈尔滨工业大学hit软件构造实验lab2

2023-10-08 05:30

本文主要是介绍哈尔滨工业大学hit软件构造实验lab2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1 实验目标概述
  • 2 实验环境配置
  • 3 实验过程
    • 3.1 Poetic Walks
      • 3.1.1 Get the code and prepare Git repository
      • 3.1.2 Problem 1: Test Graph
      • 3.1.3 Problem 2: Implement Graph
        • 3.1.3.1 Implement ConcreteEdgesGraph
        • 3.1.3.2 Implement ConcreteVerticesGraph
      • 3.1.4 Problem 3: Implement generic Graph
        • 3.1.4.1 Make the implementations generic
        • 3.1.4.2 Implement Graph.empty()
      • 3.1.5 Problem 4: Poetic walks
        • 3.1.5.1 Test GraphPoet
        • 3.1.5.2 Implement GraphPoet
        • 3.1.5.3 Graph poetry slam
      • 3.1.6 Before you’re done
    • 3.2 Re-implement the Social Network in Lab1
      • 3.2.1 FriendshipGraph类
      • 3.2.2 Person类
      • 3.2.3 客户端main()
      • 3.2.4 测试用例
      • 3.2.5 提交至Git仓库
  • 4 实验进度记录
  • 5 实验过程中遇到的困难与解决途径
  • 6 实验过程中收获的经验、教训、感想
    • 6.1 实验过程中收获的经验和教训
    • 6.2 针对以下方面的感受

1 实验目标概述

本次实验训练抽象数据类型(ADT)的设计、规约、测试,并使用面向对象编程(OOP)技术实现ADT。

2 实验环境配置

已安装:jdk-18、git、eclipse…
安装配置EclEmma:打开eclipse,在上方菜单栏中点击Help -> Install New Software…从更新站点http://update.eclemma.org/安装。

我的GitHub Lab2仓库的URL地址:
https://github.com/ComputerScienceHIT/HIT-Lab2-120L021328.git

3 实验过程

3.1 Poetic Walks

在该问题中,将实现抽象数据类型Graph,用于带有标记顶点的可变加权有向图。有了我们的图形数据类型,继续实现GraphPoet,一个使用单词关联图生成诗歌的类。目的是练习设计、测试和实现抽象数据类型,侧重于实现提供规范的可变类型。

3.1.1 Get the code and prepare Git repository

本地文件夹打开git bash输入命令git init创建本地仓库。然后用git remote add origin https://github.com/ComputerScienceHIT/HIT-Lab2-120L021328.git命令把本地仓库关联到GitHub。
访问https://github.com/rainywang/Spring2022_HITCS_SC_Lab2/tree/master/P1得到URL: https://github.com/rainywang/Spring2022_HITCS_SC_Lab2.git,在本地仓库git clone https://github.com/rainywang/Spring2022_HITCS_SC_Lab2.git获取该任务的代码。
之后通过git add *、git commit -m ‘…’、git push origin master提交至GitHub。

3.1.2 Problem 1: Test Graph

设计思路:
使用JUnit对Graph进行单元测试,进行黑盒测试检查代码功能,主要采用等价类划分确定测试用例;进行白盒测试检查代码内部实现细节。

实现过程:
testing strategy:
在这里插入图片描述

以一个方法为例:
在这里插入图片描述

运行结果:
在这里插入图片描述

3.1.3 Problem 2: Implement Graph

3.1.3.1 Implement ConcreteEdgesGraph

设计思路:
先设计Edge:定义私有类型变量来存边的起点、终点和权值;构造方法实现对边的一些操作:检查表示不变性、获取边的起点、获取边的终点、获取边的权值大小、获取边的字符串表示。其AF、RI、Safety from rep exposure:
在这里插入图片描述

再设计ConcreteEdgesGraph:定义私有类型变量来存顶点集、边表;构造方法实现对图的一些操作:检查表示不变性、添加一个顶点、添加或修改一条边、删除一个顶点和其连接的边,获取顶点集、获取从某点出发的边表、获取到达某点的边表、获取边的字符串表示。其AF、RI、Safety from rep exposure、immutable:
在这里插入图片描述

最后完成对测试的设计:测试三个方法Get…;继承Graph的测试,但额外增加toString的测试。

实现过程:(各选一个方法的实现为例)
Edge:
在这里插入图片描述

ConcreteEdgesGraph:
在这里插入图片描述

test:
在这里插入图片描述
在这里插入图片描述

运行结果:

在这里插入图片描述

3.1.3.2 Implement ConcreteVerticesGraph

设计思路:
先设计Vertices:定义私有类型变量来存点的标识、该点能达到的点、能达到该点的点;构造方法实现对点的一些操作:检查表示不变性、获取点的标识、获取该点能达到的点、获取能达到该点的点、添加或删除该点的邻边(通过修改该点能到达的点或能达到该点的点)、获取点的字符串表示。其AF、RI、Safety from rep exposure:
在这里插入图片描述

再设计ConcreteVerticesGraph:定义私有类型变量来存顶点集;构造方法实现对图的一些操作:检查表示不变性、添加一个顶点、添加或修改一条边、删除一个顶点和其连接的边,获取顶点集、获取从某点出发的边表、获取到达某点的边表、获取边的字符串表示。其AF、RI、Safety from rep exposure、immutable:
在这里插入图片描述

最后完成对测试的设计:测试三个方法Get、两个Add、两个Remove;继承Graph的测试,但额外增加toString的测试。

实现过程:(各选一个方法的实现为例)
Vertices:
在这里插入图片描述

ConcreteVerticesGraph:
在这里插入图片描述

test:
在这里插入图片描述
在这里插入图片描述

运行结果:
在这里插入图片描述
在这里插入图片描述

3.1.4 Problem 3: Implement generic Graph

3.1.4.1 Make the implementations generic

设计思路:
将原有的String类型改为L类型,将原有的Edge、ConcreteEdgesGraph、Vertices、ConcreteVerticesGraph后面加。

实现过程:
在这里插入图片描述

其余同理。

运行结果:
在这里插入图片描述

3.1.4.2 Implement Graph.empty()

设计思路:
我选择了用边实现,再补充测试用例。

实现过程:
在这里插入图片描述
在这里插入图片描述

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1.5 Problem 4: Poetic walks

3.1.5.1 Test GraphPoet

设计思路:
使用JUnit进行单元测试,除了MIT网站提供的测试用例,还额外多选择了几个文件来尽可能覆盖各种情况。

实现过程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

运行结果:
在这里插入图片描述

3.1.5.2 Implement GraphPoet

设计思路:
设计GraphPoet:定义私有类型变量来存该图;构造方法实现对图的一些操作:检查表示不变性、读取文件并存入图、根据需要扩充的字符串进行扩充并返回最终结果、获取图的字符串表示。其AF、RI、Safety from rep exposure:
在这里插入图片描述

实现过程:
在这里插入图片描述
在这里插入图片描述

运行结果:
在这里插入图片描述

3.1.5.3 Graph poetry slam

维持原程序不变。

3.1.6 Before you’re done

提交方法见3.1.1,我的项目的目录结构树状示意图:
在这里插入图片描述

3.2 Re-implement the Social Network in Lab1

基于我在3.1节Poetic Walks中定义的Graph及用边实现,重新实现Lab1中3.3节的FriendshipGraph类,我是对Lab1中代码进行部分修改来完成的,最后通过main函数的输出与JUnit检验结果。

3.2.1 FriendshipGraph类

设计思路:
定义私有类型变量来存该图;修改原有的对图的一些操作方法:返回该图(用于测试)、新建一个图、添加顶点、添加边、获取两点间距离。其AF、RI、Safety from rep exposure、immutable:
在这里插入图片描述

实现过程:
用新的方法替换旧的方法,以添加边为例:
在这里插入图片描述

运行结果:
见3.2.3、3.2.4。

3.2.2 Person类

设计思路:
定义私有类型变量来存姓名;构造方法实现对人的一些操作:修改人名、获取该人人名。其AF、RI、Safety from rep exposure:
在这里插入图片描述

实现过程:
在这里插入图片描述

运行结果:
见3.2.3、3.2.4。

3.2.3 客户端main()

设计和实现不做改变,运行结果:
在这里插入图片描述

3.2.4 测试用例

设计和实现不做改变,运行结果:
在这里插入图片描述
在这里插入图片描述

3.2.5 提交至Git仓库

提交方法见3.1.1,我的项目的目录结构树状示意图:
在这里插入图片描述

4 实验进度记录

日期 时间段 计划任务 实际完成情况
2022.5.16-2022.5.26 18:00-22:00 完成3.1并上传git 按时完成
2022.5.27 18:00-22:00 完成3.2并上传git 按时完成
2022.5.29 15:00-20:00 写实验报告 按时完成

5 实验过程中遇到的困难与解决途径

不习惯测试优先的编程,纯靠想象来构造测试用例太抽象,即使构造出来了也难以用规范化的语言来描述test strategy 回顾第二章的知识,模仿课件的例子写
不理解测试为什么无法运行 查阅博客无果,向同学请教后明白抽象类测试是需要实例时运行查看结果
不会泛型的使用 查阅博客并模仿、试错,不断尝试出解决办法

6 实验过程中收获的经验、教训、感想

6.1 实验过程中收获的经验和教训

测试优先的编程在刚开始使用时,由于测试策略的混乱以及没有实际代码的,感觉十分抽象,无处下手,但是通过对函数规约的研读,逐渐找到高效的方法,并且体会到在完成代码后立刻可以对代码的正确性做出判断的优势;同时深刻感受到严谨的函数规约强的重要。

6.2 针对以下方面的感受

(1) 面向ADT的编程和直接面向应用场景编程,你体会到二者有何差异?
面向ADT的编程要求考虑的更加细致、严谨,因为要便于后续其他编程;直接面向应用场景编程可能只需要完成眼下的任务,目的更直接更单纯,编程也更简单但是应用起来有局限性。
(2) 使用泛型和不使用泛型的编程,对你来说有何差异?
使用泛型之后,使代码的可移植性更好,更利于使用者对一段代码在多种场景的迁移与应用。
(3) 在给出ADT的规约后就开始编写测试用例,优势是什么?你是否能够适应这种测试方式?
节省编程整体时间,明确编程思路,出现错误时可以第一时间察觉并及时修改。不适应。
(4) P1设计的ADT在多个应用场景下使用,这种复用带来什么好处?
写好一个ADT后,在之后很多编程中可以直接拿来使用,大大提高编程效率。
(5) 为ADT撰写specification, invariants, RI, AF,时刻注意ADT是否有rep exposure,这些工作的意义是什么?你是否愿意在以后编程中坚持这么做?
保证ADT表示独立性,使得后续其被使用时能正确完成任务。愿意。
(6) 关于本实验的工作量、难度、deadline。
工作量很大、难度合适、deadline合适。
(7) 《软件构造》课程进展到目前,你对该课程有何体会和建议?
课程很困难很抽象,尤其课件大多是英文,给学习掌握知识带来很多不便,但是本课程比C语言拓展了很多神奇的思路,学习过程充满乐趣。

这篇关于哈尔滨工业大学hit软件构造实验lab2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/163022

相关文章

电子盖章怎么做_电子盖章软件

使用e-章宝(易友EU3000智能盖章软件)进行电子盖章的步骤如下: 一、准备阶段 软件获取: 访问e-章宝(易友EU3000智能盖章软件)的官方网站或相关渠道,下载并安装软件。账户注册与登录: 首次使用需注册账户,并根据指引完成注册流程。注册完成后,使用用户名和密码登录软件。 二、电子盖章操作 文档导入: 在e-章宝软件中,点击“添加”按钮,导入待盖章的PDF文件。支持批量导入多个文件,

将一维机械振动信号构造为训练集和测试集(Python)

从如下链接中下载轴承数据集。 https://www.sciencedirect.com/science/article/pii/S2352340918314124 import numpy as npimport scipy.io as sioimport matplotlib.pyplot as pltimport statistics as statsimport pandas

小红书商家电话采集软件使用指南

使用小红书商家电话采集软件可以提高商家电话的采集效率,以下是使用指南及附带代码。 步骤一:安装Python和相关库 首先,确保你的电脑已经安装了Python运行环境(建议安装Python3版本)。安装完成后,同样需要安装一些相关的库,如requests、beautifulsoup4等。在命令行窗口中输入以下命令进行安装: pip install requestspip install bea

高性能并行计算华为云实验五:

目录 一、实验目的 二、实验说明 三、实验过程 3.1 创建PageRank源码 3.2 makefile的创建和编译 3.3 主机配置文件建立与运行监测 四、实验结果与分析 4.1 采用默认的节点数量及迭代次数进行测试 4.2 分析并行化下节点数量与耗时的变化规律 4.3 分析迭代次数与耗时的变化规律 五、实验思考与总结 5.1 实验思考 5.2 实验总结 E

PHP序列化用到的构造:__sleep() __wakeup()

串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法. 有时你可能需要一个对象在反串行化后立即执行. 为了这样的目的,PHP会自动寻找__sleep和__wakeup方法.   当一个对象被串行化,PHP会

物联网系统运维——移动电商应用发布,Tomcat应用服务器,实验CentOS 7安装JDK与Tomcat,配置Tomcat Web管理界面

一.Tomcat应用服务器 1.Tomcat介绍 Tomcat是- -个免费的开源的Ser Ivet容器,它是Apache基金会的Jakarta 项目中的一个核心项目,由Apache, Sun和其他一 些公司及个人共同开发而成。Tomcat是一一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。 在Tomcat中,应用程序的成部署很简

STM32HAL库--SDRAM实验(速记版)

STM32F429IGT6 自带了 256K 字节的 SRAM,对一般应用来说,已经足够了,不过在一些对内存要求高的场合, STM32F429 自带的这些内存就不够用了。比如使用 LTDC 驱动RGB 屏、跑算法或者跑 GUI 等,就可能不太够用,所以阿波罗 STM32F429 开发板板载了一颗 32M 字节容量的 SDRAM 芯片:W9825G6KH,满足大内存使用的需求。 1

服务器监控:运维行业的核心保障与第三方监控软件的选择

随着信息技术的飞速发展,企业IT架构日益复杂,服务器作为整个IT系统的核心,其稳定性和性能对业务的连续性至关重要。在运维行业中,服务器监控作为保障服务器稳定运行的关键环节,已经受到了越来越多企业的重视。本文将探讨服务器监控的重要性、挑战以及选择第三方监控软件的原因,并推荐一款优秀的服务器监控软件——监控易。 一、服务器监控的重要性     服务器监控是指对服务器硬件、操作系统、应用程序

docx转doc工具(软件)

word中的docx转成doc格式软件下载: http://pan.baidu.com/s/1ntsi0yt <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize

python3GUI--ktv点歌软件By:PyQt5(附下载地址)

文章目录 一.前言二.展示1.启动2.搜索2.服务1.首页2.天气预报3.酒水饮料4.酒水饮料2 3.服务4.灯光5.调音6.排行榜7.分类点歌9.歌手点歌10.歌手个人页 三.心得体会1.关于代码2.关于设计3.关于打包 四.总结 文件大小:33.13M https://wwt.lanzoul.com/iikRv22iqmpg 如果安装后打不开,多半是权限问题,请使用管理