最近剛剛開始學面向對象的開發,出於好奇,想比較一下面向對象開發與面向過程開發的區別,也是爲了執行本身關於寫技術博客的計劃。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.