欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

对软件构造实验的总结与感想

程序员文章站 2022-07-14 21:12:29
...

Lab1

一、实验目标概述

本次实验通过求解四个问题,训练基本 Java 编程技能,能够利用 Java OO 开
发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够
为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。
另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。(这部分单独提)
⚫ 基本的 Java OO 编程
⚫ 基于 Eclipse IDE 进行 Java 编程
⚫ 基于 JUnit 的测试
⚫ 基于 Git 的代码配置管理

二、实验过程

1、Magic Squares

第一个要求让你判定一个矩阵是否使得所有行、所有列和对角线中的n个数之和为同一个常数。
用Buffer从txt文件读取数据完毕后,先要判断输入文件的各种特殊情况,例如:不是矩阵、行数列数不相等、有小数、负数还有分隔符不合法这样的情况。
如果未遇到特殊情况,则进行是否为MagicSquare的判断,遍历整个数组,计算每行和、每列和、以及对角线和,若这些值都相等,则是MagicSquare,反之则不是。
第二个要求是将老师提供的一种函数的修改与补全。这个函数尝试用固定的算法,根据输入的数字n自动生成一个n×n的正方形矩阵满足“魔方”的要求。

2、Turtle Graphics

第一个要求我们用一个叫Turtle的工具,通过这个工具来画一些图案,这个实验其实也还好,因为就像一个黑箱操作一样,各个函数的功能功能告诉你,你只需要修改参数即可,但是画图案的时候,你还是需要有计算度数的函数,例如知道多边形的边数,得到多边形的单个内角度数,或者知道单个内角度数,求边数。最后画了三角形,五边形,自己设计的图案完成。
第二个要求然后有个判定是否为凸包的问题,这个我使用了暴力法,也就是选择一条边,看其他的边是不是在这条边的同一侧,如果是的话,那么这条边就是构成凸包的一条边。

3、Social Network

构建一个社会关系网,对人与人之间的关系进行处理,大概就是等同于解决一个图的问题,求图的最短路径。这个代码就用到了java的知识,我们需要构建两个类FriendshipGraph类和Person类,然后FriendshipGraph类调用了Person类的内容,而Person类有一个构造函数,是得到这个人的姓名。
测试用例Junit:这也是第一次接触的东西,大概就是调用你写的函数,然后与你写的可能结果相比较。

@Test
	public void getDistance()
	{
		Graph.addVertex(A);
		Graph.addVertex(B);
		Graph.addVertex(C);
		Graph.addVertex(D);
		Graph.addVertex(E);
	
		Graph.addEdge(A, E);
		Graph.addEdge(E, A);
		Graph.addEdge(C, D);
		Graph.addEdge(A, D);
		Graph.addEdge(D, A);
		Graph.addEdge(B, E);
		Graph.addEdge(C, B);
		Graph.addEdge(B, C);
		assertEquals(1, Graph.getDistance(A, D));
		assertEquals(-1, Graph.getDistance(D, B));
		assertEquals(2, Graph.getDistance(B, D));
		assertEquals(0, Graph.getDistance(D, D));
		assertEquals(-1, Graph.getDistance(F, A));
	}

像这样通过调用函数构造图,然后用assertEquals函数来比较函数结果,前面的预期得到的结果,后面的是函数的返回值。如果相同的话,那说明函数就没有问题。最后Junit会给绿灯。

4、Tweet Tweet

Tweet.Java是一个由实验提供的特别的类。在运用过程中,学生可以切身的体会到从学习新的类方法到正确规范的使用新方法的过程。这个大概就是让我们通过推特的情况,得到与你关系近的用户。这里面比较关键的新知识是Map
这个结构包含两部分,键(key)和值(value),Map是一个映射,将键映射到值。大概就是这么一个东西,我们输入键,可以得到相应的值。

三、实验感想

实验一之后,感觉对java有了小小的入门,然后对于数据结构的内容温习了一下。这个实验很多的还是给了你函数的代码,让你对它进行修改就行,甚至不用修改,这样的事难度都还不算大,因为这样相当于已经给了你思路,并且代码上面的书写困难也没有给你。但是从这个实验还是感受了java语言的独特的部分,从新的写法,比如类,还有新的自带的各种数据结构还有Junit测试函数,这些都使得java语言十分的好用。

Lab2

一、实验目标概述

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

这个实验是进行了图的定义以及实现,并运用了新学的范型以及继承这样的知识。
第一个要求写各种测试代码,检测我们即将写的关于图的函数。
第二个要求继承的方式写两个类,一个类是写基于顶点的图,一个类则是基于边的图。
其中函数的名及其作用为:
boolean add(String vertex):这个函数的作用是新建顶点,如果成功,返回True,否则返回。False
public int set(String source, String target, int weight):这个函数的作用是添加边,输入的参数为起点,终点以及边的权值,同样如果成功,返回True,否则返回False。
boolean remove(String vertex):这个的作用是删除顶点,同时删除含该顶点的边,因为边分了起点和终点,所以会稍微困难一点。
Map<String, Integer> sources(String target):这个函数是返回一个以target为终点的map,map的key值为以target为终点的起点,value值为该边的权值。
Map<String, Integer> targets(String source):这个函数和上一个函数是对应的,返回以source为起点的终点和边的权值。
Set vertices():这个函数的作用就是返回顶点的集。
String toString():这个函数是为了格式化输出。
class Vertex/class Edge:这里面原本是用范型来表示的,表示点的类型,而在实现的时候将点表示为string类型的,这两个类当中起着调用信息和存储信息的作用。其中还有一个checkrep函数,作用为检验,使输入进来的起点终点不为空,权值不为0。

2、Re-implement the Social Network in Lab1

这个内容就是用我们刚写的关于图的类来改进我们Lab1中所写的SocialNetwork,使他的实现更加简单。

3、Playing Chess

这个实验写了Games、Player、Board、Piece、Position、Action这六个类。
Piece中存储了单个棋子是否被使用,颜色,种类(围棋,或者象棋得国王,皇后等),以及序数。
Position类中记录了某个位置是否被占用。
Board类当中根据判定,建立不同得棋盘大小,然后建立关于position得二维组,初始化。
Player类当中记录了这个人得边(黑,白),存储了他拥有的棋子,根据判定来初始化,他的棋的种类等。
Action类十分得简单,记录了简单得出去一个棋,放入一个棋,移动一个棋的方法。
Game类当中则是更加具体得,分国际象棋以及围棋,具体提子,移子等怎么完成,同时又初始化棋盘得作用(在国际象棋得时候将棋摆好)。
最后在主程序MyChessAndGoGame当中,首先开始比赛,然后询问玩儿得棋得类型,自动生成这些类,player直接生成两个作为对手,方便使用。这里面循环打印菜单,这里我有一个count用于记该是那边操作,单数黑边,双数白边。就这样进行下棋游戏。
Junit当中用到了assertFalseassertTrue,其实和assertEquals差不多的意思,就是看括号里的情况是为True还是False的。

三、实验感想

到了实验了,更依赖于ADT的使用了,特别是到了PlayChess这个部分,我们写了六个类,其中联系的也更加的紧密,测试也用例也变得更多了。感觉Lab2更像是Lab1的升级版,做了一个更大的联系,对于ADT,对于测试。除了这些还多了两个内容:
1、继承:就是继承已经存在的类就可以复用这些类的方法和域。在此基础上,可以添加新的方法和域,从而扩充了类的功能。
2、范型:泛型编程会有更多限制,但是泛型有适用范围广的优势。

Lab3

一、实验目标概述

本次实验覆盖课程第 3、5、6 章的内容,目标是编写具有可复用性和可维护
性的软件,主要使用以下软件构造技术:
⚫ 子类型、泛型、多态、重写、重载
⚫ 继承、代理、组合
⚫ 常见的 OO 设计模式
⚫ 语法驱动的编程、正则表达式
⚫ 基于状态的编程
⚫ API 设计、API 复用
本次实验写三个具体应用(径赛方案编排、原子结构可视化、个人社交系统),学生通过 ADT 和泛型等抽象技术,开发一套可复用的 ADT 及其实现,充分考虑这些应用之间的相似性和差异性,使 ADT 有更大程度的复用(可复用性)和更容易面向各种变化(可维护性)。

二、实验过程

首先是基于语法的图数据输入,这之中用到了正则表达式:用来检索、替换那些符合某个模式(规则)的文本。
按一定的格式读取运动员,细胞,用户关系图的信息。

1、CircularOrbit

设计 CircularOrbit 应提供的接口方法。主要考虑所谓轨道系统的通用方法。接口的方法和继承有相似之处,但是也有区别。其中一个类只有需要的函数名称以及参数,而另一个类来写函数的具体实现。然后另外的三个具体的类(也就是径赛方案编排、原子结构可视化、个人社交系统)是继承具体实现的基础类,这样可以用基础的操作,然后还能够添加关于自己的操作。可以复用的还有轨道系统和中心点和轨道物体。
具体实现的时候要分别讨论这三个应用的情况:

2、TrackGame

这个类当中无中心物体,轨道物体为运动员,轨道有长度之分:100/200/400。然后运动员有很多信息,包括国籍,年龄,姓名,成绩,号码等等。在生成这个系统的时候,要看是随机排运动员还是用成绩来排序。

3、AtomStructure

这个类当中,中心物体为细胞核,轨道的物体每个都没有区别,都是电子,轨道没有什么特点,但是有信息表示自己是第几个轨道。功能有电子跃迁这一个,实现这个功能就是删除原来轨道的一个电子,然后在目标轨道上添加一个电子。

4、SocialNetworkCircle

这个类的中心物体是中心用户,一开始是没有轨道的。轨道的生成是通过将周围的用户进行亲密度的比较,有直接关系的在第一个轨道上,然后和直接关系有关系的用户在第二个轨道上,就这样类推。所以周边的用户也就是轨道物体。然后其中一个功能实现为通过自己定义的想法,看通过某个用户,中心用户能间接得到多少个朋友。还有个功能是计算两个轨道上用户的逻辑距离,这个就是实现图的最短距离的计算,之前已经实现了很多次了。

三、实验感想

这是个相对较大型的实验,并且后面的Lab4,Lab5都是在这个实验的基础上进行修改,当时这个实验写的相当的不好,也影响了后面实验的进行,这个实验也是让我们熟练的应用ADT,然后让我们学会使用接口,重写等操作。然后还在有余力的情况下实现GUI,也就是可视化的操作,而我在当时是没有弄出来的,弄出GUI是在写Lab4的时候补出来的Lab3。这个GUI的实现就特别依赖图结构的正确性,因为要画图全是使用我们存的Map的数据。

Lab4

一、实验目标概述

本次实验重点训练学生面向健壮性和正确性的编程技能,利用错误和异常处
理、断言与防御式编程技术、日志/断点等调试技术、黑盒测试编程技术,使程序
可在不同的健壮性/正确性需求下能恰当的处理各种例外与错误情况,在出错后
可优雅的退出或继续执行,发现错误之后可有效的定位错误并做出修改。
实验针对 Lab 3 中写好的 ADT 代码和基于该 ADT 的三个应用的代码,使用
以下技术进行改造,提高其健壮性和正确性:
⚫ 错误处理
⚫ 异常处理
⚫ Assertion 和防御式编程
⚫ 日志
⚫ 调试技术
⚫ 黑盒测试及代码覆盖度

二、实验过程

1、Error and Exception Handling

这个实验是让我们熟悉错误和异常处理代码。这里大概就是让我们考虑读文件可能出现的问题,比如文件可能是空的,文件中某一行的格式其实是不正确的,或者文件中有重复的内容等。这个我们可以用特定函数上声明异常(throws)抛出异常(throw)捕获并处理异常(try-catch-finally、try-with-resources),这样的方式来直接使程序停止。这样的做法其实相当于if操作之后直接结束程序一样,只是这个的优先级是最高的。

2、Logging

运用Logger这个东西,让为 3.1和 3.2 节经过异常处理、错误处理、断言处理的程序增加日志功能。
所以在之前抛出错误的时候可以看到,不仅抛出错误打印了错误类型,还复制了一份进入日志当中。
然后写一个函数,让我们可以进行日志的搜索。

3、SpotBugs tool

我们运用一个插件SpotBugs tool,来找出程序中可能还有的错误,然后进行修改。

4、Debugging

这个是对已经有的程序进行改正。

三、实验感想

写了实验让我们知道其实程序是有各种各样的Bug的,我们还需要的改的,需要提高健壮性的地方还有很多。当然还是要考虑平衡防御和性能之间的关系。
在这个实验当中也学习了一些新的东西:
Logger:Java中关于日志系统的API,Logger类是用来记录 某个级别的日志消息。
SpotBugs:检测一些Bug的小工具。

Lab5

一、实验目标概述

本次实验通过对 Lab4 的代码进行静态和动态分析,发现代码中存在的不符
合代码规范的地方、具有潜在 bug 的地方、性能存在缺陷的地方(执行时间热点、
内存消耗大的语句、函数、类),进而使用第 4、7、8 章所学的知识对这些问题
加以改进,掌握代码持续优化的方法,让代码既“看起来很美”,又“运行起来
很美”。
具体训练的技术包括:
⚫ 静态代码分析(CheckStyle 和 SpotBugs)
⚫ 动态代码分析(Java 命令行工具 jstat、jmap、jcmd、VisualVM、JMC、
JConsole 等)
⚫ JVM 内存管理与垃圾回收(GC)的优化配置
⚫ 运行时内存导出(memory dump)及其分析(Java 命令行工具 jhat、MAT)
⚫ 运行时调用栈及其分析(Java 命令行工具 jstack);
⚫ 高性能 I/O
⚫ 基于设计模式的代码调优
⚫ 代码重构

二、实验过程

1、Static Program Analysis

第一个要求是通过看google或者oracle规范,来修改自己的代码。
第二个要求是使用CheckStyleSpotBugs进行静态代码分析。CheckStyle改的都是一些小的细节,比如包名改为小写,写Javadoc(注释)这样的东西。但是有了这样的代码规范,才能让代码的可读性更好,比如开始的导入语句需要考虑字典顺序。

2、多种I/O实现方式

使用了Stream,Buffer,Scanner三种方式。来对比读和写的效率。
之后就是各种各样的分析,例如Garbage Collection,然后进行修改。

三、实验感想

从这个实验,我们需要知道平衡代码是“看起来美”还是“运行起来美”。在修改我们代码规范的时候我们可以使用各种各样的小插件来进行提示。
关于这个大实验,通过Lab3,4,5也就结束了,一开始真的写的有点慢,所以到后面有点越来越跟不上。这三个实验差不多向我们展示了一个程序应该编写的完整的过程,不是写完了可以运行就结束了,还应该考虑他的性能,他的可读性,他的健壮性。需要考虑的有很多。
这个实验当中我们学到了:
Checkstyle:对代码的规范进行检查,并提示修改。
各种优化配置。
高性能I/O:从实验中,我得出的结论是Stream读取文件的速度比较快,Scanner写文件相对来说还行,最全面的应该是Buffer。

Lab6

一、实验目标概述

本次实验训练学生的并行编程的基本能力,特别是 Java 多线程编程的能力。
根据一个具体需求,开发两个版本的模拟器,仔细选择保证线程安全(threadsafe)
的构造策略并在代码中加以实现,通过实际数据模拟,测试程序是否是线程安全
的。另外,训练学生如何在 threadsafe 和性能之间寻求较优的折中,为此计算吞
吐率和公平性等性能指标,并做仿真实验。
⚫ Java 多线程编程
⚫ 面向线程安全的 ADT 设计策略选择、文档化
⚫ 模拟仿真实验与对比分析

二、实验过程

这个实验和多线程有关系。

1、设计ADT

我们需要解决的是猴子过桥的问题。所以我们需要写的类有猴子,*,*的踏板,两个猴子过河的策略,可视化的类,等等。

2、关于单个Monkey线程的run()的执行流程图

对软件构造实验的总结与感想

3、保持threadsafe

threadsafe,这个是一个重要的指标。
在这个实验当中在不变性方面保证*的数量,猴子的数量等都为整数且大于0,这是得保证的。
在暴露的安全性方面,能protected或者private的变量就尽量这样写,然后使用函数来调用他们如果是需要改变的等,才写为public。
在策略的选择和猴子选策略的时候
对软件构造实验的总结与感想
对软件构造实验的总结与感想
使用这样一个语句保证一次只有一个进行选择,锁住其他的,保证安全。

4、吞吐率与公平性

这是衡量一个算法的效率的重要标志,吞吐率是程序追求的目标,应该越大越好。
假如????只猴子过河的总耗时为????秒,那么每只猴子的平均耗时为???? =????/????秒,则吞吐率ℎ =????/????表征每秒钟可过河的猴子数目。

三、实验感想

在这个实验之后,课程要求的所有的实验都结束了。从一开始对java没有什么感觉到最后了解了很多关于java的知识,还是很有用的。从简单的关于类的,然后是继承,到各种工具,JUnit测试函数,日志类等等等等。希望之后能够越学越懂,越懂越多。

Git

这个是我们提交实验的方式。让网上的仓库和本地电脑的一个文件夹关联,可以将文件夹中的文件提交到网络中。
正常的简单步骤大概为,在文件夹目录当中,右键选择git bash,输入一下命令行:
git clone https://(https后面为具体的地址)
git add .
git commit -m "提交信息"
git push -u origin master(提交的主分支当中)
如果我们需要创建新的分支
git checkout -b 分支名(不要-b就是已经有了分支,进入这个分支)
然后add,commit,push -u origin 分支名,将文件提交到分支当中。
如果我们最后想要将分支合并到master中,就回到master
然后输入git merge 分支名

相关标签: 软件构造