所謂條件表達式,就是分支語句,去掉分支語句咯
1、分解條件表達式
修改點:你有一個復雜的條件語句(就是if else語句)
做法:將條件表達式的三個部分分別提煉出獨立函數
即
if (A部分) { B部分; } else { C部分; }
這三個部分都提煉成函數就好了。
2、合並條件表達式
修改點:你有一系列測試,都得到相同結果
做法:將這些測試合並成一個條件表達式,並將這個表達式提煉成一個獨立函數
3、合並重復的條件片段
修改點:在條件表達式的每個分支上有著相同一段代碼
做法:將這段重復代碼搬移到條件表達式之外
4、移除控制標記
修改點:在一系列布爾表達式中,某個變量帶有“控制標記”(control flag)的作用。
做法:以break語句或return語句取代控制標記
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就是控制標記,所以可以用continue,break,return這類跳出語句去移除控制標記
5、以衛語句取代嵌套條件表達式
修改點:函數中的條件邏輯使人難以看清正常的執行路徑
做法:使用衛語句表現所有情況。
如果某個條件極其罕見,就應該單獨檢查該條件,並在該條件為真時立刻從函數中返回,這樣的語句被稱為“衛語句”。
6、以多態取代條件表達式
修改點:你手上有個條件表達式,它根據對象類型的不同而選擇不同的行為
做法:將這個條件表達式的每個分支放進一個子類內的覆蓋函數中,然後將原始函數聲明為抽象函數。
如果你搞不清楚的話,你可以看一看我在 7、數據的重構 裡面的第14點的代碼,也許你會更清楚一點。
7、引入NULL對象
修改點:你需要再三檢查某對象是否為NULL
做法:將NULL值替換為null對象
用了NULL值的代碼:
class Program { static void Main(string[] args) { var roomList = new List<Room>(); roomList.Add(new Room("低級房",new People("A先生"))); roomList.Add(new Room("高級房")); 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("低級房",new People("A先生"))); roomList.Add(new Room("高級房")); 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 "無人"; } } }
在這裡不繼承people可能更好一點,都繼承一個自定義的接口IsNULLPeople,代碼更好看一點。