20145203盖泽双:Java实验报告二
Java实验报告二:Java面向对象程序设计
实验要求:
初步掌握单元测试和TDD
理解并掌握面向对象三要素:封装、继承、多态
初步掌握UML建模
熟悉S.O.L.I.D原则
了解设计模式
实验内容
(一)单元测试
(二)面向对象三要素
(三)设计模式初步
(四)练习
实验过程
(一)单元测试
(1) 三种代码: 伪代码、产品代码、测试代码。
伪代码与具体编程语言无关,伪代码从意图层面来解决问题,最终,伪代码是产品代码最自然的、最好的注释。
产品代码
测试代码
(2)TDD(Test Driven Devlopment, 测试驱动开发)
定义:这种先写测试代码,然后再写产品代码的开发方法叫“测试驱动开发”(TDD)。一般步骤如下:
①明确当前要完成的功能,记录成一个测试列表
②快速完成编写针对此功能的测试用例
③测试代码编译不通过(没产品代码呢)
④编写产品代码
编写完产品代码之后,测试代码消失了。
再一次调试时出现了红色bar
我再次修改了产品代码
⑤测试通过
我又进行了边界测试和错误测试。但是出现了bug
通过检查我发现是在数据=100的时候出现了错误!我再一次修改了类代码。
⑥对代码进行重构,并保证测试通过(重构下次实验练习)
⑦循环完成所有功能的开发
(二)面向对象三要素
(1)抽象
抽象能力是指"去粗取精、化繁为简、由表及里、异中求同"的能力。
程序设计中,抽象包括两个方面,一是过程抽象,二是数据抽象。
(2)封装、继承与多态
面向对象(Object-Oriented)的三要素包括:封装、继承、多态。包括面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程实现(OOP)。
1、封装
定义:将数据与相关行为包装在一起以实现信息就隐藏。
封装实际上使用方法(method)将类的数据隐藏起来,控制用户对类的修改和访问数据的程度,从而带来模块化(Modularity)和信息隐藏(Information hiding)的好处;接口(interface)是封装的准确描述手段。 Dog类通过使用类和访问控制(private,public)隐藏了属性color,开放了接口setColor(),getColor(),bark()和toString。
2、我们可以看到,在UML里,一个类的属性能显示它的名字,类型,初始化值,属性也可以显示private,public,protected。 类的方法能显示它们的方法名,参数,返回类型,以及方法的private,public,protected属性。其中:
①+表示public
②#表示 protected
③-表示 private
3、继承指一个类的定义可以基于另外一个已经存在的类,即子类基于父类,从而实现父类代码的重用。既存类称作基类、超类、父类(base class、super class、parent class),新类称作派生类、继承类、子类(derived class、inherited class、child class)。继承关系表达了”Is a kind of“的关系,称为“ISA”关系。继承的关键在于确认子类为父类的一个特殊类型。它有以下等特点:
①继承是实现软件可重用的根基,是提高软件系统的可扩展性与可维护性的主要途径。
②以封装为基础,继承可以实现代码复用,需要注意的是,继承更重要的作用是实现多态。
多态性:面向对象中允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式。在Java中,多态是指不同的类对象调用同一个签名的成员方法时将执行不同代码的现象。多态是面向对象程序设计的灵活性和可扩展性的基础。
(三)设计模式初步
(1)S.O.L.I.D原则
1、面向对象三要素是 “封装、继承、多态”,任何面向对象编程语言都会在语法上支持这三要素。如何借助抽象思维用好三要素特别是多态还是非常困难的,S.O.L.I.D类设计原则是一个很好的指导:
①SRP(Single Responsibility Principle,单一职责原则)
②OCP(Open-Closed Principle,开放-封闭原则)
③LSP(Liskov Substitusion Principle,Liskov替换原则)
④ISP(Interface Segregation Principle,接口分离原则)
⑤DIP(Dependency Inversion Principle,依赖倒置原则)
2、OCP是OOD中最重要的一个原则,OCP的内容是:
①software entities (class, modules, function, etc.) should open for extension,but closed for modification。
②软件实体(类,模块,函数等)应该对扩充开放,对修改封闭。对扩充开放,要求软件模块的行为必须是可以扩充的,在应用需求改变或需要满足新的应用需求时,我们要让模块以不同的方式工作;对修改封闭,要求模块的源代码是不可改动的,任何人都不许修改已有模块的源代码。
OCP的实现手段:(1)抽象和继承,(2)面向接口编程。
3、LSP(Liskov Substitusion Principle,Liskov替换原则)
内容:子类必须可以被其基类所代;使用指向基类的指针或引用的函数,必须能够在不知道具体派生类对象类型的情况下使用它。
核心思想是父类型对象可以被子类型对象所取代。
4、ISP(Interface Segregation Principle,接口分离原则)
内容:客户不应该依赖他们并未使用的接口(接口的功能不要太多)
5、DIP(Dependency Inversion Principle,依赖倒置原则)
内容:高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象 。
6、除SOLID原则外还有很多其它的面向对象原则。如:
①"组合替代继承":这是说相对于继承,要更倾向于使用组合;
②"笛米特法则":这是说"你的类对其它类知道的越少越好";
③"共同封闭原则":这是说"相关类应该打包在一起";
④"稳定抽象原则":这是说"类越稳定,越应该由抽象类组成";
(2)模式与设计模式
模式是某外在环境下﹐对特定问题的惯用解决方法,可以看作对一个问题可复用的专家级解决方法。
(3)设计模式实示例
1、四个基本要素:
模式名:描述模式,便于交流,存档
问题:描述何处应用该模式
解决:描述一个设计的组成元素,不针对特例
结果:应用该模式的结果和权衡
2、抽象工厂模式
容易出现过度设计的问题
只是对于整形数据来说的
(四)练习
1使用TDD的方式设计关实现复数类Complex。
伪代码:
①复数的实部为0,虚部为0
②复数的实部为0,虚部为对应数
③复数的实部为对应数,实部为0
④两参数分别为实部与虚部
⑤实现两复数的加法、减法、乘法。
产品代码
public class Complex {
double a, b;
Complex() {
this.a = 0;
this.b = 0;
}
Complex(double a) {
this.a = a;
this.b = 0;
}
Complex(double a, double b) {
this.a = a;
this.b = b;
}
Complex jia(Complex p1, Complex p2) {
Complex p = new Complex(p1.a + p2.a, p1.b + p2.b);
return p;
}
Complex jian(Complex p1, Complex p2) {
Complex p = new Complex(p1.a - p2.a, p1.b - p2.b);
return p;
}
Complex cheng(Complex p1, Complex p2) {
Complex p = new Complex(p1.a * p2.a - p1.b * p2.b, p1.b * p2.a + p1.a * p2.a);
return p;
}
void Print() {
System.out.println("复数的值为:");
if (this.b != 0)
System.out.println(this.a + "+" + this.b + "i");
else System.out.println(this.a);
}
}
测试代码
public class ComplexTest
{
public static void main(String[] args)
{
Complex c=new Complex();
Complex c1=new Complex(4,5);
Complex c2=new Complex(6,7);
c1.Print();
c2.Print();
System.out.println("这两复数和为:");
System.out.println((c.jia(c1, c2).a+"+"+c.jia(c1, c2).b+"i").toString());
System.out.println("这两复数差为:");
System.out.println(c.jian(c1, c2).a+"+"+c.jian(c1, c2).b+"i");
System.out.println("这两复数乘积为:");
System.out.println(c.cheng(c1, c2).a+"+"+c.cheng(c1,c2).b+"i");
}
}
2.实验报告中统计自己的PSP(Personal Software Process)时间
步骤 耗时 百分比
需求分析 20mins 10%
设计 90mins 37%
代码实现 60mins 35%
测试 30mins 13%
20145203盖泽双:Java实验报告二的更多相关文章
- 20145203盖泽双java实验三 敏捷开发与XP实践
java实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> ...
- Java实验报告二:Java面向对象程序设计
Java实验报告二:Java面向对象程序设计 ...
- java实验报告二
一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 二.实验步骤 (一)单元 ...
- 20135337朱荟潼Java实验报告二
20135337朱荟潼 实验二 Java面向对象程序设计 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L ...
- 20145203盖泽双 《Java程序设计》第十周学习总结
20145203盖泽双 <Java程序设计>第十周学习总结 教材学习内容总结 一.网络概述 1.网络编程就是两个或多个设备(程序)之间的数据交换. 2.识别网络上的每个设备:①IP地址②域 ...
- 20145203盖泽双《Java程序设计》第三周学习总结
20145203盖泽双<Java程序设计>第三周学习总结 教材学习内容总结 1.两个基本的标准类:java.util.Scanner与java.math.BigDecimal. 2.Big ...
- 20145221 《Java程序设计》实验报告二:Java面向对象程序设计
20145221 <Java程序设计>实验报告二:Java面向对象程序设计 实验要求 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...
- 20145203盖泽双 《Java程序设计》第9周学习总结
20145203盖泽双 <Java程序设计>第9周学习总结 教材学习内容总结 1.撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找. 2.JDBC目的:让Java程序设 ...
- 20145203盖泽双 《Java程序设计》第8周学习总结
20145203盖泽双 <Java程序设计>第8周学习总结 教材学习内容总结 1.java.util.logging包提供了日志功能相关类与接口,使用日志的起点是logger类,Logge ...
随机推荐
- 求N的因子之和。
理论依据: 代码: /* 显然,数据够大的时候,数组要用 __int64 */ #include<iostream> #include<map> #include<cst ...
- ASP.NET MVC中你必须知道的13个扩展点
ScottGu在其最新的博文中推荐了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,该文章为我 ...
- drupal7图片样式无法生成与显示
正常设置了图像的样式,并且为内同类型正确设置了显示的样式.但是上传图片后,却并没有在对应的文件夹下生成对应的缩略图.自然没有显示. 网上查询了一下,需要为nginx添加两个设置: location @ ...
- 关于redux
react将dom解耦,不用直接操作dom,使用了状态机制,当状态改变时视图就会相应更新.我们知道在react中,父组件可以将一些状态传递给子组件,让子组件的视图相应更新,这时我们会发现,只有有关联的 ...
- Windows access Linux / Ubuntu via Remote Desktop via xrdp
Windows 多用户远程桌面连接到 Ubuntu / Linux Access Ubuntu from Windows remotely Follow these steps : Step 1 ...
- fuzz实战之honggfuzz
Honggfuzz实战 前言 本文介绍 libfuzzer 和 afl 联合增强版 honggfuzz .同时介绍利用 honggfuzz 来 fuzz 网络应用服务. 介绍 honggfuzz 也是 ...
- C#中的三种timer
转 https://blog.csdn.net/hoiven/article/details/51362582 如果你需要使用规律的时间间隔重复执行一些方法,最简单的方式是使用定时器(timer). ...
- Sql Server tempdb原理-启动过程解析实践
我们知道在SqlServer实例启动过程中数据库会进行还原(Redo,Undo)然后打开提供服务,但我们知道tempdb是不提供重做机制的(Redo)那tempdb是如何还原的呢?如果tempdb损坏 ...
- Oracle EBS 创建资产报错
Solution:设置资产弹性域 随便输入一个值 再冻结
- C# 调用WebService服务
方 法 一 : 选择项目,右键添加服务引用,输入服务地址,如图: 点击确定跳转到如下界面: 调用 接口: ServiceReference1.ImportDataServiceClient sr = ...