建議104 用多型代替條件語句

2021-10-07 05:56:50 字數 1620 閱讀 5324

假設開發自動駕駛系統。在設計之初,自動駕駛系統擁有乙個駕駛系統命令的列舉型別:

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 列舉最大的優點在於它的型別是值型別。相比較引用型別來說,它可以在關鍵演算法中提公升效能,因為它不需要建立在 堆 中。但是,如果不考慮這方面的因素,我們不妨讓類 ...