您的位置:首页 > 运维架构

面向对象(OO)开发与面向过程(OP)开发的比较

2017-02-10 00:00 363 查看
最近刚刚开始学面向对象的开发,出于好奇,想比较一下面向对象开发与面向过程开发的区别,也是为了执行自己关于写技术博客的计划。

这是我在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)考虑用构造方法来
3ff0
访为封装类中的对象属性(在此例中为几何图形的物理参数),用方法来访问封装类中的对象行为(在此例中行为是计算面积和周长的公式);

(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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息