实验二 Java面向对象程序设计
实验内容
1.初步掌握单元测试和TDD
2.理解并掌握面向对象三要素:封装、继承、多态
3.初步掌握UML建模
4.熟悉S.O.L.I.D原则
5.了解设计模式
实验要求
1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程
2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
3.严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。
4.请大家先在实验楼中的~/Code目录中用自己的学号建立一个目录,代码和UML图要放到这个目录中,截图中没有学号的会要求重做,然后跟着下面的步骤练习。
一、单元测试
伪代码是可以提现程序骨架的有错误的代码
按照实验按的要求,先写出产品代码
进行测试
进行多组测试
二、TDD
1.明确当前要完成的功能,记录成一个测试列表
2.快速完成编写针对此功能的测试用例
3.测试代码编译不通过(没产品代码呢)
4.编写产品代码
5.测试通过
6.对代码进行重构,并保证测试通过(重构下次实验练习)
7.循环完成所有功能的开发
这个代码在检测的时候一开始还是有问题的不过基本上点灯炮采取他告诉我的方式既能够解决这个问题了都变绿了就可以了。
三、面向对象三要素
1.抽象:抽象就是抽出事物的本质特征而暂时不考虑他们的细节。对于复杂系统问题人们借助分层次抽象的方法进行问题求解;在抽象的最高层,可以使用问题环境的语言,以概括的方式叙述问题的解。在抽象的较低层,则采用过程化的方式进行描述。在描述问题解时,使用面向问题和面向实现的术语。
2.封装,继承,多态
封装:封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度,从而带来模块化和信息隐藏的好处;接口是封装的准确描述手段。
继承:继承指一个类的定义可以基于另外一个已经存在的类,即子类基于父类,从而实现父类代码的重用。既存类称作基类、超类、父类,新类称作派生类、继承类、子类。继承的关键在于确认子类为父类的一个特殊类型。继承是实现软件可重用的根基,是提高软件系统的可扩展性与可维护性的主要途径。
多态:在Java中,当我们用父类声明引用,用子类生成对象时,多态就出现了。
四、设计模式初步:
1.S.O.L.I.D原则
面向对象三要素是“封装、继承、多态”,任何面向对象编程语言都会在语法上支持这三要素。如何借助抽象思维用好三要素特别是多态还是非常困难的,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,依赖倒置原则)
五、练习
写一个类测试编写的复数类的方法
构造函数,将实部,虚部都置为0
构造函数,创建复数对象的同时完成复数的实部,虚部的初始化
设置实部,设置虚部:复数相加、复数相减、复数相乘
package shiyan.second;
import java.util.Scanner;
/**
-
Created by mc on 2016/8/2.
*/
public class Complex {
protected int a;protected int b;
public Complex(int a, int b) {
this.a = a;
this.b = b;
}public String toString() {
return this.a + " + " + this.b + "i";
}public static Complex addition(Complex complex1, Complex complex2) {
int a = complex1.a + complex2.a;
int b = complex1.b + complex2.b;
return new Complex(a, b);
}public static Complex subtract(Complex complex1, Complex complex2) {
int a = complex1.a - complex2.a;
int b = complex1.b - complex2.b;
return new Complex(a, b);
}public static Complex multiplication(Complex complex1, Complex complex2) {
int a = complex1.a * complex2.a - complex1.b * complex2.b;
int b = complex1.b * complex2.a + complex1.a * complex2.b;
return new Complex(a, b);
}
}
class ComplexMain {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入两个复数的实部和虚部:(a+bi、c+di)");
System.out.printf("a =");
int a = scanner.nextInt();
System.out.printf("b =");
int b = scanner.nextInt();
System.out.printf("c =");
int c = scanner.nextInt();
System.out.printf("d =");
int d = scanner.nextInt();
Complex fushu1 = new Complex(a, b);
Complex fushu2 = new Complex(c, d);
while (true) {
System.out.println("请输入需要进行的运算:1、ADD 2、SUBTRACT 3、MULTIPLY ");
int choice = scanner.nextInt();
switch (choice) {
case 1:
System.out.println(Complex.addition(fushu1, fushu2));
break;
case 2:
System.out.println(Complex.subtract(fushu1, fushu2));
break;
case 3:
System.out.println(Complex.multiplication(fushu1, fushu2));
break;
default:
System.out.println("错误");
}
}
}
}
(代码太长一个屏幕截不下来干脆就复制粘贴了)
git上传截图: