--------------------------------<代碼優化之避免使用過多ifelse>---------------------------------
在www.infoq.com/cn網站上看了一本書叫《thoughtworks文集》,裡邊有一章講的是“對象健身操”,其中提到了“拒絕使用else關鍵字”。那麼如何“拒絕使用else關鍵字”呢?
1、如果程式中隻有一個else,如下:
if(con){
dosomething();
}else{
dootherthings();
}
可以如下拒絕else:
return;
dootherthings();
或者使用三元運算符:con ? dosometing() : dootherthings();
2、如果程式中有多個else,如下:
if(con1){
dothing1();
}else if(con2){
dothing2();
}else if(con3){
dothing3();
}......
可是使用政策模式或多态機制來拒絕else(還有很多其他方式),下面先介紹“政策模式”的方式:
首先講一個使用if...else...的例子:
package ifelse.use;
public class useifelse {
public static void main(string args[]){
mypaper mypaper = new mypaper(papercolor.red);
if(mypaper.getmypapercolor() == papercolor.black){
system.out.println("you need a black pen!");
}else if(mypaper.getmypapercolor() == papercolor.blue){
system.out.println("you need a blue pen!");
}else if(mypaper.getmypapercolor() == papercolor.red){
system.out.println("you need a red pen!");
}else if(mypaper.getmypapercolor() == papercolor.white){
system.out.println("you need a white pen!");
}
}
}
class mypaper{
private papercolor papercolor;
public mypaper(papercolor papercolor){
this.papercolor = papercolor;
public papercolor getmypapercolor(){
return this.papercolor;
enum papercolor{
white, black, blue, red
使用if...else...的弊端在于:不利于對程式的擴充,如果新添加了一個顔色類型,那麼就得去修改程式再添加一個if...else...分支,根據“開-閉原則”的宗旨:對擴充開,對修改閉。顯然是用if...else...已經go out了。
下面講一個使用“政策模式”解決上述問題的辦法:
package ifelse.no;
public class noifelse {
public static void main(string args[]){
mypaper mypaper = new mypaper(new white());
mypaper.choicepen();
}
interface papercolor{
public void getpencolor();
class white implements papercolor{
public void getpencolor(){
system.out.println("you need a white pen!");
class red implements papercolor{
system.out.println("you need a red pen!");
class blue implements papercolor{
system.out.println("you need a blue pen!");
class black implements papercolor{
system.out.println("you need a black pen!");
public papercolor getpapercolor(){
public void choicepen(){
this.papercolor.getpencolor();
}
總結:
if...else...的每個分支語句都做一件事,是以我們可以把這麼些事單獨封裝在一個類中,就有了white、blue、red、black4個類,這四個類都實作了接口papercolor,我們再定義一個mypaper的類(此類具有類似負載均衡的作用,分按照不同的請求分别調用跟前面4個類中的一個)。這樣就把if...else...屏蔽掉了。
接下來介紹使用“多态”機制來實作拒絕else:
package ifelse.no.polymorphism;
public class noifelse_polymorphism {
public static void main(string args[]){
mypaper mypaper = new mypaper();
mypaper.choice(new black());
}
}
class white {
public void getpencolor(){
system.out.println("you need a white pen!");
class red {
system.out.println("you need a red pen!");
class blue {
system.out.println("you need a blue pen!");
class black {
system.out.println("you need a black pen!");
class mypaper{
public void choice(white white){
white.getpencolor();
public void choice(red red){
red.getpencolor();
public void choice(blue blue){
blue.getpencolor();
public void choice(black black){
black.getpencolor();
此處使用的多态機制指:方法的重構,根據方法名相同兒參數不同的機制,來實作拒絕關鍵字。
注意:上述兩種方式适用于同時隻有一個分支被執行的情況。
參考:“java設計模式”之“政策模式”。
=================================<代碼優化之避免使用過多ifelse>======================================