实验楼第二次实验

实验二 Java面向对象程序设计

(由于网速不好,实验楼的光标反映过慢,所以代码的调适与运行都是在电脑的Eclipse里面完成的,没在实验楼里截图)

实验内容

  1. 初步掌握单元测试和TDD
  2. 理解并掌握面向对象三要素:封装,继承,多态
  3. 初步掌握UML建模
  4. 熟悉S.O.L.I.D
  5. 了解设计模式

先在实验楼中的~/Code目录中用自己学号建立一个目录,用于存放代码和UML图

实验步骤

(一) 单元测试

(1)     三种代码

想用程序解决问题时,要会写三种代码

l  伪代码

l  产品代码

l  测试代码

举例:

需求:我们要在一个MyUtil类中解决一个百分制成绩转成“优、良、中、及  格、不及格”五级制成绩的功能

l  伪代码(伪代码与具体编程语言无关,不要写与具体编程语言语法相关的语句,伪代码从意图层面来解决问题,最终,伪代码产品代码最自然的、最好的注释)

l  产品代码(把伪代码用Java语言翻译一下)

l  测试代码(写了产品代码,我们还要写测试代码,证明自己的代码没有问题。Java编程时,程序员对类实现的测试叫单元测试。类XXXX单元测试,一般写建一个XXXXTest的类,针对MyUtil类写一个MyUtilTest.java的测试模块,代码如下)

这里我们设计了一个测试用例(Test Case)测试用例是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求

测试一般情况:

测试异常情况,如输入为负分或大于100的成绩,代码如下:

运行程序发现负分时与期望不一致,找到了一个bug,原因是判断不及格时没有要求成绩大于零。修改MyUtil.java,增加对负分的判断,代码如下:

为保证单元测度充分,一般要求测试代码产品代码多。《单元测试之道》提出的Right-BICEP方法可用于写测试

(2)TDD(Test Driven Devlopment,测试驱动开发)

测试驱动开发(TDD):先写测试代码,再写产品代码,从而写出来的代码就是正确的

步骤如下:

l  明确当前要完成的功能,记录成一个测试列表

l  快速完成编写针对此功能的测试用例

l  测试代码编译不通过(无产品代码?)

l  编写产品代码

l  对代码进行重构,并保证测试通过(重构下次实验练习)

l  循环完成所有功能的开发

基于TDD,我们不会出现过度设计的情况,需求通过测试用例表达出来了,我们的产品代码只要让测试通过就可以

Java中有单元测试工具JUnit来辅助进行TDD

用TDD的方式把前面的例子重写一次

Eclipse->File->New->Java Project新建一个TDDDemo的Java项目

TDDDemo->右键->New->Source Folder新建一个测试目录test

Test->右键->New->JUnit Test Case新建一个测试用例类MyUtilTest

我们增加第一个测试用例testNormal(测试用例前一定要有注解@Test)

在TDDDemosrc目录中新建MyUtil的类,并实现percentage2fivegrade方法

TDD的编码节奏是:

l  增加测试代码,Junit出现红条

l  修改产品代码

l  Junit出现绿条,任务完成

(二)面向对象三要素

(1)抽象

抽象是指人在认识思维活动中对事物表象因素的舍弃和对本质因素的抽取。

抽象就是抽出事物的本质特征而暂时不考虑他们的细节。对于复杂系统问题人们借助分层次抽象的方法进行问题求解;

在抽象的最高层,可以使用问题环境的语言,以概括的方式叙述问题的解。

在抽象的较低层,则采用过程化的方式进行描述。

在描述问题解时,使用面向问题和面向实现的术语。 程序设计中,抽象包括两个方面,一是过程抽象,二是数据抽象。

举例:

如图可以打印出“1,2,3”,想打引“1,2,3,4”怎么办?大多做法是把上面的代码拷贝下来,再加一行:

想打印出“1..100"怎么办?这两段代码有三行重复的代码,违反了常见的一个编程原则DRY(Don‘t Repeat Yourself),解决的方法是进行过程抽象,写一个函数printn:

之前的两段代码就可以用

(2) 封装,继承与多态

面向对象三要素:封装、继承、多态

面向对象的思想涉及到软件开发的各个方面,如面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程实现(OOP)。OOA根据抽象关键的问题域来分解系统。OOD是一种提供符号设计系统的面向对象的实现过程,用非常接近问题域术语的方法把系统构造成“现实世界”的对象,通过模型来实现功能规范

OOP则在设计的基础上用编程语言(如Java)编码。贯穿OOA、OOD和OOP的主线正是抽象

过程抽象的结果是函数,数据抽象的结果是抽象数据类型(Abstract Data Type,ADT),类可以作具有继承和多态机制的ADT。数据抽象才是OOP的核心和起源

封装:封装就是将数据与相关行为包装在一起以实现信息就隐藏

比如:

封装实际上使用方法(method)将类的数据隐藏起来,控制用户对类的修改和访问数据的程度,从而带来模块化(Modularity)信息隐藏(Information hiding)的好处;接口(interface是封装的准确描述手段

用UML中的类图来描述类Dog

shell->umbrello->类图标->class diagram->Dog

Dog->右键->Properties->Display->去掉Public Only

Dog->右键->New->Attribute->填好Type,Name,并选好Visibility

Dog->右键->New->Operation->填好Type,Name,并选好Visibility

在UML 里,一个类的属性能显示它的名字,类型,初始化值,属性也可以显示private,public,protected。 类的方法能显示它们的方法名,参数,返回类型,以及方法的private,public,protected属性

UML类图中继承的表示法,是用一个带三角的直线指向父类,通过继承,我们消除了Dog类和Cat类中的重复代码,符合DRY的要求

继承是实现软件可重用的根基,是提高软件系统的可扩展性与可维护性的主要途径。以封装为基础,继承可以实现代码复用,继承更重要的作用是实现多态。 面向对象中允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式,我们称此现象为多态性

多态是面向对象程序设计的灵活性和可扩展性的基础

(三)设计模式初步

(1)S.O.L.I.D

面向对象三要素是“封装、继承、多态”,任何面向对象编程语言都会在语法上支持这三要素。如何借助抽象思维用好三要素特别是多态还是非常困难的,S.O.L.I.D类设计原则是一个很好的指导

基于OCP,利用面向对象中的多态性(Polymorphic),更灵活地处理变更拥抱变化,OCP可以用以下手段实现:(1)抽象和继承,(2)面向接口编程

LSP的核心思想是父类型对象可以被子类型对象所取代

(2)模式与设计模式

模式是某外在环境下﹐对特定问题的惯用解决之道,其中最重要的是设计模式

(3)设计模式实示例

设计模式提供一个用于细化软件系统的子系统或组件,或它们之间的关系图,它描述通信组件的公共再现结构,通信组件可以解决特定语境中的一个设计问题

(四)练习

使用TDD方式设计并实现复数类Complex

(1)  伪代码

设计一个复数类complex,分别将复数的实部和虚部作为属性

定义两个成员方法计算两个复数的和与差

定义一个print()方法输出复数的值,当虚部为0时不输出虚部

定义一个song类使用complex类,在这个类的主方法中创建两个复数对象,计算并输出

(2)  产品代码

class complex {

double re,im;

complex(){

this.re=0;

this.im=0;}

complex(double re){

this.re=re;

this.im=0;}

complex(double re,double im){

this.re=re;

this.im=im;

}

complex add(complex p1,complex p2){

complex p=new complex(p1.re+p2.re,p1.im+p2.im);

return p;

}

complex minus(complex p1,complex p2){

complex p=new complex(p1.re-p2.re,p1.im-p2.im);

return p;

}

void print(){

System.out.println("复数的值为:");

if(this.im!=0)

System.out.println(this.re+"+"+this.im+"i");

else

System.out.println(this.re);

}

}

(3)  测试代码

public class song{

public static void main(String[] args){

complex c=new complex();

complex c1=new complex(2,7);

complex c2=new complex(5,2);

c1.print();

c2.print();

System.out.println("这两个复数的和为:");

System.out.println((c.add(c1,c2).re+"+"+c.add(c1, c2).im+"i").toString());

System.out.println("这两个复数的差为:");

System.out.println((c.minus(c1,c2).re+"+"+c.minus(c1, c2).im+"i").toString());

}

}


步骤


耗时


百分比


需求分析


20min


20%


设计


25min


25%


代码实现


40min


40%


测试


2min


15%


分析总结


10min

单元测试的好处:

保障了单元自身功能的正确性

单元测试是随着代码自然发展的,不会因为代码发生改变而过期

单元测试为每个单元都提供了一个必须遵守的,严格的和书面的契约

时间: 2024-10-14 12:52:45

实验楼第二次实验的相关文章

实验楼第二次试验报告

实验楼第二次试验报告 北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1353 姓名:王剑桥 学号:20135316 成绩:            指导教师:娄嘉鹏   实验日期:2015.5.6 实验密级: 预习程度:   实验时间: 仪器组次: 必修/选修:选修  实验序号:2 实验名称:             JAVA面向对象程序设计 实验目的与要求: 1. 初步掌握单元测试和TDD. 2.理解并掌握面向对象三要素:封装.继承.多态.

java的第二个实验——JAVA面向对象程序设计

java的第二个实验——JAVA面向对象程序设计 北京电子科技学院 实     验    报     告 课程:Java程序设计 班级:1352 姓名:林涵锦 学号:20135213 成绩:        指导教师:娄嘉鹏  实验日期:2015.4.14 实验密级: 预习程度:  实验时间:19:30~21:50 仪器组次:13 必修/选修:选修 实验序号:2 实验名称:JAVA面向对象程序设计 实验目的与要求: 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态

李瑞红201771010111第二周实验总结报告

第一部分:理论知识学习 本章主要内容是java的基本程序设计结构,包括以下几个方面的知识,(1)标识符.关键字.注释的相关知识:(2)数据类型:(3)变量:(4)运算符:(5)类型转换:(6)字符串:(7)输入输出:(8))控制流程:(9)大数值:(10)数组. 1.a,标识符只能由数字.字母.下划线和美元$符号组成,标识符不能以数字开头.b.关键字class表明java程序中的全部内容都包含在类里,class后面紧跟类名,源代码的文件名必须与公共类的名字相同,并用.java作为扩展名.c.与大

软件工程综合实践的第二次实验报告

队伍:阙定1757127,李铮达1759118 这次是软件工程综合实践的第二次实验,本次任务是结对编程,就是找一个小伙伴一起写代码,一人写代码一人复审代码,这样可以更快的找出代码的错误,然后立即更改,提高开发效率. 下面是老师发布的任务截图 讨论分析 拿到任务后,我们先考虑用哪种编程语言来写,直接用较为基础的C或C++编写即可,因为逻辑较为简单,且不需要涉及面向对象的问题.然后开始分析用什么方法来实现,以及如何实现.讨论持续了一整天,因为白天有课,所以我们都是用零星的时间来讨论的. 下面是周二中

2019春第二次实验报告

2019春第二次实验报告 一.实验项目名称 空战游戏 二.实验项目功能描述 在第一次实验基础上增加多台敌机,在一定的得分后发散导弹 三.项目模块结构介绍 四.实现界面展示 五.代码托管链接 https://gitee.com/wenyizhang999/ZWY/blob/master/空战游戏.cpp 六.实验总结 问题:创造无限循环模式 解决方法:编代码,未完成 总结:游戏规模越来越大,玩法越来越多,无限的空间待开发,觉得自己能完成一个游戏的开发太不容易,团队很重要. 原文地址:https:/

第二次实验

北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1353  姓名:黎静  学号:20135338 成绩:             指导教师:娄嘉鹏      实验日期:2015.5.17 实验密级:         预习程度:         实验时间: 仪器组次:          必修/选修:            实验序号:2 实验名称:   Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要

C语言第二次实验报告

PTA实验作业 题目一:11-7 找鞍点 一个矩阵元素的"鞍点"是指该位置上的元素值在该行上最大.在该列上最小. 本题要求编写程序,求一个给定的n阶方阵的鞍点. 1.设计思路 第一步:定义二维数组 第二步:判断用户给定矩阵大小 第三步:找行最大值 第四步:判断行最大值是否为列最小值 第五步:输出结果 实验代码 int a[6][6]; int n; scanf("%d",&n); int i,j; for(i=0; i<n; i++) for(j=0;

C语言的第二次实验报告

课程名称:高级语言程序设计 班级:网络1714 实验成绩: 指导教师:贺冰琰 姓名:穆浩然   实验项目名称: 学号:201721123120 实验时间: 一.实验内容与设计思路 题目一: 设计思路:设置一个flag并令其值为1,在输入二维数组后利用for语句的循环对每一个数字进行判断,若数字不为0则flag值赋为0,从而判断是否为上三角矩阵. 题目二: 设计思路:利用指针对字符串进行逆序,运用变量i的变化将字符串从最后一位不为\0的字符开始输出. 题目三: 设计思路:设两个数组,通过计算m.n

第二章实验实践报告

实践报告 第一题 实践题目 问题描述 算法描述 算法时间及空间复杂度分析(要有分析过程) 心得体会(对本次实践收获及疑惑进行总结) 1.实验题目:二分查找 2.问题描述 输入n值(1<=n<=1000).n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 3.算法描述 二分查找算法关键是下标的mid.left.right的变化,开始是left=0和right=length-1,接着就要判断需要查找的值x和mi