所謂條件表達(dá)式,就是分支語(yǔ)句,去掉分支語(yǔ)句咯
1、分解條件表達(dá)式
修改點(diǎn):你有一個(gè)復(fù)雜的條件語(yǔ)句(就是if else語(yǔ)句)
做法:將條件表達(dá)式的三個(gè)部分分別提煉出獨(dú)立函數(shù)
即
if (A部分) { B部分; } else { C部分; }
這三個(gè)部分都提煉成函數(shù)就好了。
2、合并條件表達(dá)式
修改點(diǎn):你有一系列測(cè)試,都得到相同結(jié)果
做法:將這些測(cè)試合并成一個(gè)條件表達(dá)式,并將這個(gè)表達(dá)式提煉成一個(gè)獨(dú)立函數(shù)
3、合并重復(fù)的條件片段
修改點(diǎn):在條件表達(dá)式的每個(gè)分支上有著相同一段代碼
做法:將這段重復(fù)代碼搬移到條件表達(dá)式之外
4、移除控制標(biāo)記
修改點(diǎn):在一系列布爾表達(dá)式中,某個(gè)變量帶有“控制標(biāo)記”(control flag)的作用。
做法:以break語(yǔ)句或return語(yǔ)句取代控制標(biāo)記
bool isILoveYou=true; int[] loveNum=new int[100]; for (int i=0; i < 100; i++) { if (isILoveYou) { if (某種原因) { isILoveYou = false; } Console.WriteLine(loveNum[i]); } }
而isILoveYou就是控制標(biāo)記,所以可以用continue,break,return這類跳出語(yǔ)句去移除控制標(biāo)記
5、以衛(wèi)語(yǔ)句取代嵌套條件表達(dá)式
修改點(diǎn):函數(shù)中的條件邏輯使人難以看清正常的執(zhí)行路徑
做法:使用衛(wèi)語(yǔ)句表現(xiàn)所有情況。
如果某個(gè)條件極其罕見,就應(yīng)該單獨(dú)檢查該條件,并在該條件為真時(shí)立刻從函數(shù)中返回,這樣的語(yǔ)句被稱為“衛(wèi)語(yǔ)句”。
6、以多態(tài)取代條件表達(dá)式
修改點(diǎn):你手上有個(gè)條件表達(dá)式,它根據(jù)對(duì)象類型的不同而選擇不同的行為
做法:將這個(gè)條件表達(dá)式的每個(gè)分支放進(jìn)一個(gè)子類內(nèi)的覆蓋函數(shù)中,然后將原始函數(shù)聲明為抽象函數(shù)。
如果你搞不清楚的話,你可以看一看我在 7、數(shù)據(jù)的重構(gòu) 里面的第14點(diǎn)的代碼,也許你會(huì)更清楚一點(diǎn)。
7、引入NULL對(duì)象
修改點(diǎn):你需要再三檢查某對(duì)象是否為NULL
做法:將NULL值替換為null對(duì)象
用了NULL值的代碼:
class PRogram { static void Main(string[] args) { var roomList = new List<Room>(); roomList.Add(new Room("低級(jí)房",new People("A先生"))); roomList.Add(new Room("高級(jí)房")); foreach (var room in roomList) { if (room.Master != null) { Console.WriteLine(room.Master.Name); } } Console.ReadKey(); } } public class Room { public Room(string roomName,People people=null) { this.RoomName = roomName; this.Master = people; } public string RoomName { get; set; } public People Master { get; set; } } public class People { public People(string name) { this.Name = name; } public string Name { get; set; } }
改為
class Program { static void Main(string[] args) { var roomList = new List<Room>(); roomList.Add(new Room("低級(jí)房",new People("A先生"))); roomList.Add(new Room("高級(jí)房")); foreach (var room in roomList) { Console.WriteLine(room.RoomName + ":" + room.Master.Name); } Console.ReadKey(); } } public class Room { public Room(string roomName,People people=null) { this.RoomName = roomName; this.Master = people; } public string RoomName { get; set; } public People Master { get{ return _master==null?new NullPeople():_master; } set { _master = value; } } People _master; } public class People { public People() { } public People(string name) { this.Name = name; } public virtual string Name { get; set; } public virtual bool IsNULL() { return false; } public static People CreateNullPeople() { return new NullPeople(); } } public class NullPeople:People{ public NullPeople():base() { } public override bool IsNULL(){ return true; } public override string Name { get { return "無(wú)人"; } } }
在這里不繼承people可能更好一點(diǎn),都繼承一個(gè)自定義的接口IsNULLPeople,代碼更好看一點(diǎn)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注