簡書 賈小強
轉載請注明原創(chuàng)出處,謝謝薪前!
在我的上篇文章中對面向對象進行了分析,這篇文章將采用高中解題中用的極限思維法來比較面向過程和面向對象,從而讓人直觀的知道看到什么樣的代碼就知道那樣的代碼用面向對象的方法更加合適馏锡,可以降低復雜度
一般而言面向對象的程序需要先經過面向對象分析,然后將系統(tǒng)分成不同的類伟端,各自負責一些責任杯道,并且類之間存在交互,但是這并不是萬能的责蝠,很多時候由于開始沒有考慮到党巾,直到當代碼寫到那里的時候才發(fā)現(xiàn)還需要什么萎庭,從而代碼逐漸就惡化,復雜性陡增齿拂,進入了代碼的窮兇極惡之地
這篇文章繼續(xù)從代碼的角度來分析驳规,優(yōu)點是和重構一樣,知道了壞味道署海,那么就可以想辦法改進吗购,也就說開始不用十全十美,中途發(fā)現(xiàn)壞味道的時候還能挽救
壞味道
首先假設一份原始代碼如下砸狞,采用極限思維的方法捻勉,把下面變量想象的更多,參數(shù)傳遞更加復雜刀森,各種交錯踱启,一團亂麻
public class Demo1 {
private void method0() {
//part1
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
int f = 6;
int g = 7;
int h = 8;
int i = 9;
int j = 10;
int k = 11;
int l = 12;
//part2
//一些別的代碼
a++;
c++;
//一些別的代碼
h++;
//part3
int x = method2(g, h, i, j, k, l);
//一些別的代碼執(zhí)行導致a b c變動,變動后的a b c后面代碼還將使用
for (int m = 0; m < 10; m++) {
a++;
b--;
--c;
}
System.out.println(a + b + c + d + e + f + x);
}
private int method2(int g, int h, int i, int j, int k, int l) {
return g + h + i + j + k + l;
}
public static void main(String[] args) {
Demo1 demo = new Demo1();
demo.method1();
}
}
輸出
71
這份代碼有如下問題:
- part1部分:有很多變量的聲明賦值
- part2部分:由于代碼實際邏輯原因撒强,上面的變量操作被間隔開了禽捆,雖然從某種角度上,這些變量還有有關系的
- part3部分:這樣的代碼很可能隨帶的有過長參數(shù)飘哨,當然也可能與多返回值胚想,以及引用傳遞等問題
改進
將上面變量以及相關操作提取一個類,也就演變成如下兩個類
public class Demo2 {
private void method0() {
//part1
Xx xx = new Xx();
//part2
//一些別的代碼
xx.method1();
xx.method2();
//一些別的代碼
xx.method3();
//part3
//一些別的代碼執(zhí)行導致a b c變動芽隆,變動后的a b c后面代碼還將使用
xx.method4();
xx.method5();
System.out.println(xx.method6());
}
public static void main(String[] args) {
Demo2 demo = new Demo2();
demo.method1();
}
}
public class Xx {
private int a;
private int b;
private int c;
private int d;
private int e;
private int f;
private int g;
private int h;
private int i;
private int j;
private int k;
private int l;
public Xx() {
this.a = 1;
this.b = 2;
this.c = 3;
this.d = 4;
this.e = 5;
this.f = 6;
this.g = 7;
this.h = 8;
this.i = 9;
this.j = 10;
this.k = 11;
this.l = 12;
}
public void method1() {
a++;
}
public void method2() {
c++;
}
public void method3() {
h++;
}
public void method4() {
for (int m = 0; m < 10; m++) {
a++;
b--;
--c;
}
}
public int method5() {
return g + h + i + j + k + l;
}
public int method6() {
int x = method5();
return a + b + c + d + e + f + x;
}
}
輸出
71
改進后part1浊服,part2,part3在Demo2中不再有上面提到的問題胚吁,在Demo2中的代碼中只看到了xx這個對象牙躺,于是method0這部分的邏輯清爽多了
擴展
據(jù)說面向對象這種編程方法在GUI程序中非常適合,細想一下確實沒錯腕扶,每個不同的控件都有各自的屬性孽拷,并且也各自有不同的方法,有的控件可以繼承從而復用代碼半抱,要是采用面向過程的方法脓恕,可能各種狀態(tài)變量傳來傳去,很快就將是場災難窿侈,而采用面向對象的方式組織代碼相較就科學很多
但是拋開這種直觀可視化具體和現(xiàn)實世界有對應關系的對象炼幔,真實的代碼中還有很多沒有形狀不可見抽象的的概念的對象,如果在程序設計之初沒有考慮到史简,可以用上面提取類的方法來用面向對象的方式乃秀,來識別并簡化代碼,讓代碼的復雜性在可控范圍之內
Happy learning !!