最近刚刚开始学面向对象的开发,出于好奇,想比较一下面向对象开发与面向过程开发的区别,也是为了执行自己关于写技术博客的计划。
这是我在CSDN上的第一篇技术博客,也是我人生中的第一篇技术博客,因此我将尽可能的详细陈述,来作为一个纪念吧;
本文以实现一个简单的用户需求,制作一个可以计算矩形和圆形周长以及面积的计算器为度量标准,来比较面向过程开发和面向对象开发的特点;
1.需求:
用户输入选项,选择计算某个几何图形(本例中仅仅建立圆形和矩形两个选择)的周长和面积,接着输入该几何图形的的相关参数,得到结果;
2面向过程的开发:
2.1 设计思路:
1)全部代码在main方法内执行;
2)使用switch case分支结构来实现不同图形的计算;
3)考虑到是由用户输入变量,因此用到Scanner;
2.2 代码如下:
//面向过程的开发
import java.util.Scanner;
public class RectangleCircleProcess {
public static void main(String[] args) {
Scanner var = new Scanner(System.in);
System.out.println("请选择(输入数字即可)几何图形: 1.圆形 2.矩形");
int graph = var.nextInt();
switch(graph){
case 1:
System.out.println("请输入半径:");
double r = var.nextDouble();
double girth1 = 2 * (Math.PI) * r;
double area1 = (Math.PI) * r * r;
System.out.println("该圆形的周长是:" + girth1 + "mm" + "\n"+ "该圆形的面积是:" + area1 + " mm^2");
break;
case 2:
System.out.println("请输入矩长:");
double len = var.nextDouble();
System.out.println("请输入矩宽:");
double wid = var.nextDouble();
double girth2 = 2 * (len + wid);
double area2 = len * wid;
System.out.println("该矩形的周长是:" + girth2 + "mm" + "\n"+ "该矩形的面积是:" + area2 + " mm^2");
break;
default:
}
}
}
3.面向对象的开发:
3.1 设计思路:
1)同面向过程一样,程序通过Scanner 控制台输入和switch case来实现用户需求;
2)在测试类中创建object实现对不同图形属性的访问,因此要为每个object封装一个类来存储该object的属性和行为(也就是变量和方法),因此需要新建两个自定义类(分别是矩形和圆形);
3)关于新建类中的方法:
(1)考虑用构造方法来访为封装类中的对象属性(在此例中为几何图形的物理参数),用方法来访问封装类中的对象行为(在此例中行为是计算面积和周长的公式);
(2)每个类中的局部变量和成员变量命名相同,这样是为了练习规范写法访问变量;
(3)测试类中的main方法中调用新建类中的方法和构造方法;
3.3 代码如下:
// 面向对象的开发
package oo.day02; //新建类 圆
public class Circle {
double r;
Circle(double r){
this.r = r;
}
void calGirth(){
double girth = 2 * (Math.PI) * r;
System.out.println("该圆形的周长是:" + girth + " mm");
}
void calArea(){
double area = (Math.PI) * r * r;
System.out.println("该圆形的面积是:" + area + " mm^2");
}
}
package oo.day02; //新建类 矩形
public class Rectangle {
double len;
double wid;
Rectangle(double len, double wid){
this.len = len;
this.wid = wid;
}
void calGirth(){
double girth = 2 * (len + wid);
System.out.println("该矩形的周长是:" + girth + " mm");
}
void calArea(){
double area = len * wid;
System.out.println("该矩形的面积是:" + area + " mm^2");
}
}
package oo.day02; // 测试类(新建两个对象 c 与 re 分别访问 前述两个新建类;)
import java.util.Scanner;
public class CircleRectangle {
public static void main(String[] args) {
Scanner var = new Scanner(System.in);
System.out.println("请选择(输入数字即可)几何图形: 1.圆形 2.矩形");
int graph = var.nextInt();
switch(graph){
case 1:
System.out.println("请输入半径:");
double r = var.nextDouble();
Circle c = new Circle(r);
c.calGirth();
c.calArea();
break;
case 2:
System.out.println("请输入矩长:");
double len = var.nextDouble();
System.out.println("请输入矩宽:");
double wid = var.nextDouble();
Rectangle re = new Rectangle(len, wid);
re.calGirth();
re.calArea();
break;
default:
}
}
}
4. OO和OP 的比较;
4.1 代码结构的大致比较
为便于理解这一部分用汉字陈述;
1)OP:
class3
Scanner
switch
case1 方法1 方法2
case2 方法3 方法4
2)OO:
class1
方法1 方法2
class2
方法3 方法4
class3
Scanner
switch
case1
建对象1
调用class1中的方法1 方法2
case2
建对象2
调用class2中的方法3 方法4
4.2 特点分析:
1) OO模块化设计思想
由代码结构的比较可以看出,OO是模块化的拆分(封装)设计并组装实现功能;OP则是一体化的;
就上面例子而言,OO的代码量多与OP,看起来似乎还‘’繁琐一些“;实际上换来的却是结构更为清晰,而且倘若代码两巨大的话,按照OP的思路则更为繁琐,包括但不限于繁琐的声明变量,以及字符拼接;
2)便于维护和团队协作
OO的新建类其他人也可以调用,但是如果OP设计,则只能是一个人使用,不利于团队协作;
OO的突出优点就是各个部分彼此独立,互不影响,而且代码结构清晰,避免了大量的代码重复,这些都有利于代码的维护,也许还有利于数据安全,OO为大规模编程开发奠定了基础。
拿 造汽车来说打比方,面向过程的制造思路就是只有一个工厂,每个构件都要做,再一台车一台车的逐辆制造,面向对象的制造思路就是,第1个厂专门造轮子,第2 个厂专门造座椅,第3个厂专门造发动机,第4个厂专门造玻璃,第5个厂负责总装,生产整车第6个,7个同样可以总装,因此在大规模制造上来说,OO的理念 更具备优势;
3)OO理念更符合人的思维方式,引用伯特兰.罗素在《西方哲学简史》中的论述,进一步说,对象是把一堆事件集合到一起的方式。我们一提起Smith先生,就想到他的穿着、声音、相貌等,如果没有这些事件构成一个集合,Smith先生便什么也不是了。
Everything is an object.