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

实验要求:

  1. 初步掌握单元测试和TDD

  2. 理解并掌握面向对象三要素:封装、继承、多态

  3. 初步掌握UML建模

  4. 熟悉S.O.L.I.D原则

  5. 了解设计模式

实验内容

(一)单元测试

(二)面向对象三要素

(三)设计模式初步

(四)练习

实验过程

(一)单元测试

(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实验报告二的更多相关文章

  1. 20145203盖泽双java实验三 敏捷开发与XP实践

    java实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> ...

  2. Java实验报告二:Java面向对象程序设计

    Java实验报告二:Java面向对象程序设计                                                                               ...

  3. java实验报告二

    一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 二.实验步骤 (一)单元 ...

  4. 20135337朱荟潼Java实验报告二

    20135337朱荟潼 实验二 Java面向对象程序设计 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L ...

  5. 20145203盖泽双 《Java程序设计》第十周学习总结

    20145203盖泽双 <Java程序设计>第十周学习总结 教材学习内容总结 一.网络概述 1.网络编程就是两个或多个设备(程序)之间的数据交换. 2.识别网络上的每个设备:①IP地址②域 ...

  6. 20145203盖泽双《Java程序设计》第三周学习总结

    20145203盖泽双<Java程序设计>第三周学习总结 教材学习内容总结 1.两个基本的标准类:java.util.Scanner与java.math.BigDecimal. 2.Big ...

  7. 20145221 《Java程序设计》实验报告二:Java面向对象程序设计

    20145221 <Java程序设计>实验报告二:Java面向对象程序设计 实验要求 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  8. 20145203盖泽双 《Java程序设计》第9周学习总结

    20145203盖泽双 <Java程序设计>第9周学习总结 教材学习内容总结 1.撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找. 2.JDBC目的:让Java程序设 ...

  9. 20145203盖泽双 《Java程序设计》第8周学习总结

    20145203盖泽双 <Java程序设计>第8周学习总结 教材学习内容总结 1.java.util.logging包提供了日志功能相关类与接口,使用日志的起点是logger类,Logge ...

随机推荐

  1. Netty面试

    声明:此文章非本人所 原创,是别人分享所得,如有知道原作者是谁可以联系本人,如有转载请加上此段话  1.BIO.NIO 和 AIO 的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要 ...

  2. SpringCloud学习指南【更新】

    一. 推荐学习博客主页[更新] Spring Cloud 系列文章(纯洁的微笑,强烈推荐系列文章) Spring Cloud系列教程 (周立大大,强烈推荐) Spring Cloud入门到实战系列教程 ...

  3. 一文告诉你git如何使用

    提供简易教程学习网址 http://www.bootcss.com/p/git-guide/ git add . //提交至缓存 git commit -m '注释' //提交至本地 (git com ...

  4. c#无边窗体实现移动的两种方式

    转载:http://blog.csdn.net/dxsh126/article/details/2940226 首先,要用到一个WimdowsAPI函数,因此必须引入 using System.Run ...

  5. js中var、let、const区别

    javascript中有三种声明变量的方式:var.let.const 1.var 作用域:全局或局部 var的作用域可以是全局或是局部,以下分四种情况说明: (1).当var关键字声明于函数内时是局 ...

  6. 计时器(Chronometer)

    计时器(Chronometer) 常用属性:format(计时器的计时格式) 常用方法: setBase(long base) 设置计时器的起始时间 setFormat(String format) ...

  7. Nested Prefab Mode 嵌套预制体 保存问题 Dirty

    Unity2018.3 Nested Prefab Mode 嵌套预制体 Unity2018.3开始,新增了一个Prefab Mode,俗称嵌套预制体,在Prefab里套Prefab.实际应用中多少会 ...

  8. asp.net --- reponse对象写图片

    FileStream fs = new FileStream(Server.MapPath("images/DSC_0290.JPG"), FileMode.Open);//将图片 ...

  9. 制作 OS X El Capitan 启动盘

    制作 OS X El Capitan 启动盘 1. 下载系统盘的dmg格式 2. 直到出现了 3. 在命令行中找到 Install OS X El Capitan.app 4. 格式化你的U盘(U盘名 ...

  10. 使用CoreData [1]

    使用CoreData [1] 本篇教程能教你从无开始接触CoreData,包括新建工程,创建出实体,增删改查样样都有,属于使用CoreData最初级教程. 1. 创建带有CoreData的工程项目 2 ...