软件构造实验2总结

  • Post author:
  • Post category:其他


目录

1 实验目标概述 1

2 实验环境配置 1

3 实验过程 1

3.1 Poetic Walks 1

3.1.1 Get the code and prepare Git repository 1

3.1.2 Problem 1: Test Graph 1

3.1.3 Problem 2: Implement Graph 1

3.1.3.1 Implement ConcreteEdgesGraph 2

3.1.3.2 Implement ConcreteVerticesGraph 2

3.1.4 Problem 3: Implement generic Graph 2

3.1.4.1 Make the implementations generic 2

3.1.4.2 Implement Graph.empty() 2

3.1.5 Problem 4: Poetic walks 2

3.1.5.1 Test GraphPoet 2

3.1.5.2 Implement GraphPoet 2

3.1.5.3 Graph poetry slam 2

3.1.6 Before you’re done 2

3.2 Re-implement the Social Network in Lab1 2

3.2.1 FriendshipGraph类 2

3.2.2 Person类 3

3.2.3 客户端main() 3

3.2.4 测试用例 3

3.2.5 提交至Git仓库 3

4 实验进度记录 3

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

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

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

6.2 针对以下方面的感受 4

1实验目标概述

本次实验训练抽象数据类型(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

2实验环境配置

简要陈述你配置本次实验所需环境的过程,必要时可以给出屏幕截图。

特别是要记录配置过程中遇到的问题和困难,以及如何解决的。

本次实验主要需要配置EclEmma。我采用的方法是在eclipse中的Help->Eclipse Marketplace中搜索EclEmma,然后在搜索结果中选择安装即可。

在这里插入图片描述

![](https://img-blog.csdnimg.cn/20210705160736304.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1aWd1Z3U=,size_16,color_FFFFFF,t_70

安装完成后,我发现在上方的图标中并没有coverage的图标,经过查找得知需要在Windows->Customize Perspective中勾选Java Code Coverage选项,勾选之后相应的按钮就出现了。

在这里插入图片描述

在这里给出你的GitHub Lab2仓库的URL地址(Lab2-学号)。

3实验过程

请仔细对照实验手册,针对两个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。

3.1Poetic Walks

在这里简要概述你对该任务的理解。

该任务主要要求我们完善graph接口的各个方法,包括add、set、remove、vertices、sources、targets等。再完善实现了graph接口的ConcreteEdgesGraph类和ConcreteVerticesGraph类中的一些内容和方法。之后再编写GraphInstanceTest测试类,再补充和完善继承了GraphInstanceTest测试类的ConcreteEdgesGraphTest测试类和ConcreteVerticesGraphTest测试类。最后还要进行测试,并通过EclEmma来检查覆盖度。

3.1.1Get the code and prepare Git repository

如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。

选择项目所在的文件夹,右键点击后选择git bash here,之后输入git init完成仓库的初始化和建立。

之后输入git remote add origin https://github.com/ComputerScienceHIT/HIT-Lab2-190110513来完成仓库的连接。

之后通过git config –global user.name “xxx”和

git config –global user.email “335771063@qq.com”来完成认证。

然后输入git add .再输入git commit -m “xxx”最后输入git push -u origin master即可完成上传。

3.1.2Problem 1: Test Graph

以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。

首先编写graph的各种测试方法。

测试是否是空图

在这里插入图片描述

测试加入顶点的方法

在这里插入图片描述

测试set方法

在这里插入图片描述

测试remove方法

在这里插入图片描述

测试返回顶点集的vertices()方法

在这里插入图片描述

测试返回源点集的sources()方法

在这里插入图片描述

测试返回下一点集的targets()方法

在这里插入图片描述

3.1.3Problem 2: Implement Graph

以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。

3.1.3.1Implement ConcreteEdgesGraph

在这里插入图片描述

checkRep()方法首先检查顶点集是否为空,再检查是否有空节点加入。之后检查边是否不为空且权值都大于零,再检查是否有没有源点或终点的野边。

在这里插入图片描述

add方法是加入点的方法,如果原本就包含该点则返回false,否则加入该点并返回true。

在这里插入图片描述

set方法设置边。当weight不为零时,如果边存在则更新边的长度为weight值,若边不存在则加入边且权值为weight。当weight为零时则删除对应边。

在这里插入图片描述

remove方法删除点,如果点不存在则返回false,否则删除该点以及点的出边和入边并返回true。

在这里插入图片描述

vertices()方法返回图的顶点集。

在这里插入图片描述

sources(L target)方法返回target对应的源点。

在这里插入图片描述

targets(L source)方法返回source对应的下一个点。

在这里插入图片描述

Edge类包含边的各种属性和获取属性的方法

3.1.3.2Implement ConcreteVerticesGraph

在这里插入图片描述

checkRep()方法首先检查顶点集是否为空,再检查是否有空节点加入。之后检查边是否不为空且权值都大于零,再检查是否有没有源点或终点的野边。

在这里插入图片描述

add方法是加入点的方法,如果原本就包含该点则返回false,否则加入该点并返回true。

在这里插入图片描述

set方法设置边。当weight不为零时,如果边存在则更新边的长度为weight值,若边不存在则加入边且权值为weight。当weight为零时则删除对应边。

在这里插入图片描述

remove方法删除点,如果点不存在则返回false,否则删除该点以及点的出边和入边并返回true。

在这里插入图片描述

vertices()方法返回图的顶点集。

在这里插入图片描述

sources(L target)方法返回target对应的源点。

在这里插入图片描述

targets(L source)方法返回source对应的下一个点。

在这里插入图片描述

Vertex包含顶点的属性以及相应的获取方法

3.1.4Problem 3: Implement generic Graph

3.1.4.1Make the implementations generic

public class ConcreteEdgesGraph implements Graph {…}

class Edge { … }

3.1.4.2Implement Graph.empty()

public static Graph empty() {


return new ConcreteEdgesGraph();

}

3.1.5Problem 4: Poetic walks

3.1.5.1Test GraphPoet

在这里插入图片描述

3.1.5.2Implement GraphPoet

在这里插入图片描述

3.1.5.3Graph poetry slam

在这里插入图片描述

3.1.6Before you’re done

请按照http://web.mit.edu/6.031/www/sp17/psets/ps2/#before_youre_done的说明,检查你的程序。

如何通过Git提交当前版本到GitHub上你的Lab2仓库。

输入git add .再输入git commit -m “xxx”最后输入git push -u origin master即可完成上传。

3.2Re-implement the Social Network in Lab1

在这里简要概述你对该任务的理解。

该部分要求利用本次实验中的实现了graph接口的ConcreteEdgesGraph类和ConcreteVerticesGraph类中的一个来重构上次实验中的FriendshipGraph类

3.2.1FriendshipGraph类

给出你的设计和实现思路/过程/结果。

原FriendshipGraph类中的addVertex方法和addEdge方法将通过ConcreteEdgesGraph类中的add和set方法实现,而getDistance方法则稍作改动,通过ConcreteEdgesGraph类的vertices()方法来获取顶点集合,通过targets()方法来获取某个点的下一点,以此来实现广度优先遍历。

在这里插入图片描述

3.2.2Person类

给出你的设计和实现思路/过程/结果。

该类中成员变量包括人名以及为实现广度优先遍历而设计的visited和记录距离的distance。

在这里插入图片描述

3.2.3客户端main()

给出你的设计和实现思路/过程/结果。

加入一定数量的点和边然后输出距离。

在这里插入图片描述

3.2.4测试用例

给出你的设计和实现思路/过程/结果。

在这里插入图片描述

运行结果

在这里插入图片描述

3.2.5提交至Git仓库

如何通过Git提交当前版本到GitHub上你的Lab3仓库。

选择项目所在的文件夹,右键点击后选择git bash here,之后输入git init完成仓库的初始化和建立。

之后输入git remote add origin https://github.com/ComputerScienceHIT/HIT-Lab2-190110513来完成仓库的连接。

然后输入git add .再输入git commit -m “xxx”最后输入git push -u origin master即可完成上传。

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

遇到的难点 解决途径

不理解题目意思

通过翻译软件将题目翻译成中文并请教同学,最后基本弄明白题目意思

对于泛型和继承等一些Java方面的知识理解不够深刻

查找书籍和网络资料学习

写完后发现有bug,输出结果不符合要求

利用EclEmma来获取代码的执行情况,并适当通过System.out.println(); 方法来在可能出现bug的地方来输出一些信息,以此发现可能的bug。最终找到了bug并改正。

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

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

通过本次实验,我更加深刻地理解了Java中泛型、接口、类和继承等概念,让我对Java语言有了更深入的了解,同时提高了我的编程能力,让我受益匪浅。

5.2针对以下方面的感受

(1)面向ADT的编程和直接面向应用场景编程,你体会到二者有何差异?

ADT可以先写出与功能相关的代码。而具体场景应用其具体实现方法,可以大大降低工作量,比起直接面向应用场景代码也不会显得赘余

(2)使用泛型和不使用泛型的编程,对你来说有何差异?

使用泛型之后相应类的使用范围更广。

(3)在给出ADT的规约后就开始编写测试用例,优势是什么?你是否能够适应这种测试方式?

优势是在一边实现具体类时可以一边测试,利于修改。

暂时没有,在慢慢适应。

(4)P1设计的ADT在多个应用场景下使用,这种复用带来什么好处?

减小工作量,提高工作效率

(5)为ADT撰写specification, invariants, RI, AF,时刻注意ADT是否有rep exposure,这些工作的意义是什么?你是否愿意在以后编程中坚持这么做?

意义在于让开发者看懂自己写的东西,除了便于与别人交流,更重要的是让自己在开发的时候防止自己忘记自己该干什么,比如这个变量是拿来干嘛的,这些数字表示什么状态。忘了就倒回去看自己写的规约,大大减少无谓思考的时间。

愿意。

(6)关于本实验的工作量、难度、deadline。

工作量偏大,难度偏大,deadline合理。

(7)《软件构造》课程进展到目前,你对该课程有何体会和建议?

本课程教了我们许多关于Java的各种知识和语法,帮助我们掌握Java编程语言以及面向对象的思想,还教会我们如何使用eclipse和git,帮助我们养成了编程的良好习惯,使我受益匪浅。



版权声明:本文为guigugu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。