假設開發自動駕駛系統。在設計之初,自動駕駛系統擁有乙個駕駛系統命令的列舉型別:
enum drivecommand
start,
stop
又假設有乙個駕駛的方法處理車輛接收到的指令。一開始我們這樣編碼:
static void main(string args)
drivecommand comand=drivecommand.start;
drive(comand);
comand=drivecommand.stop;
drive(command);
static void drive(drivecommand command)
if(command==drivecommand.start)
//車輛啟動
} else if(command==drivecommand.stop)
//車輛停止
或者用switch:
static void drive(drivecommand command)
switch(command)
case drivecommand.start:
//車輛啟動
break;
case drivecommand.stop:
//車輛停止
break;
default:
break;
隨著更多的功能被開發出來,我們加入的命令也越來越多。
enum drivecommand
start,
stop,
pause,
turnleft
隨著drivecommand元素的增加,採用if語句或switch語句會非常的混亂,在複雜的兄台你各種命令可能會多達上百條。每增加乙個命令我們都要修改drive方法。drive方法將會及其膨脹,並且每一行的**幾乎一樣。
在這種情況下,我們不得不考慮重構原來的**,遵守設計模式中的開閉原則。開閉原則指的是:對擴充套件開放,修修改關閉。
設計個抽象類:
abstract class commander
public abstract void execute();
所有的start或者stop之類的命令,繼承這個抽象類。
class startcommander:commander
public override void execute()
//啟動
class stopcommander:commander
public override void execute()
//停止
使用多型後,下面的**改為:
static void main(string args)
commander commander=new startcommander();
driver(commander);
commander=new stopcommander();
driver(commander);
static void drive(commander commander)
commander.execute();
這樣**簡潔了不少,並且,可擴充套件性增強了,對於drive方法,即使增加再多的命名,也不需要對齊修改。
使用多型代替條件判斷
摘要 由於最近在做重構的專案,所以對重構又重新進行了一遍學習和整理,對31天重構最早接觸是在2009年 10月份,所以是在國外的社群上閒逛的時候鏈結過去的。記得當時一口氣看完了整個系列並沒有多少感覺,因為這些基本上專案都在使用,只是我們沒有專門把它標示和整理出來,所以也沒有引起多大的重視。現在突然接...
建議 用EnumMap代替序數索引。
enummap在執行速度方面之所以能與通過序數索引的陣列相媲美,是因為enummap在內部使用了這種陣列。但是他對程式設計師隱藏了這種實現細節,集map的豐富功能和型別安全與陣列的快速於一身。注意enummap構造器採用鍵型別的class物件 這是乙個有限制的型別令牌 bounded type to...
建議110 用類來代替enum
建議110 用類來代替enum 列舉 enum 用來表示一組固定的值。例如,為了表示星期資訊,我們可以定義列舉week enum week 列舉最大的優點在於它的型別是值型別。相比較引用型別來說,它可以在關鍵演算法中提公升效能,因為它不需要建立在 堆 中。但是,如果不考慮這方面的因素,我們不妨讓類 ...