最近刚刚开始学面向对象的开发,出于好奇,想比较一下面向对象开发与面向过程开发的区别,也是为了执行本身关于写技术博客的计划。java
这是我在CSDN上的第一篇技术博客,也是我人生中的第一篇技术博客,所以我将尽量的详细陈述,来做为一个记念吧;编程
本文以实现一个简单的用户需求,制做一个能够计算矩形和圆形周长以及面积的计算器为度量标准,来比较面向过程开发和面向对象开发的特色;安全
1.需求:模块化
用户输入选项,选择计算某个几何图形(本例中仅仅创建圆形和矩形两个选择)的周长和面积,接着输入该几何图形的的相关参数,获得结果;测试
2面向过程的开发:this
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.