国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

【重構學習】08條件表達式的重構

2019-11-14 13:34:32
字體:
來源:轉載
供稿:網友

所謂條件表達式,就是分支語句,去掉分支語句咯

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,代碼更好看一點。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 彭泽县| 成都市| 龙井市| 新竹县| 孟村| 兴文县| 柳河县| 山东| 平和县| 云安县| 沙坪坝区| 闻喜县| 资源县| 汉源县| 榕江县| 德保县| 红原县| 枣阳市| 东阳市| 台东县| 蒲江县| 顺平县| 蓬溪县| 六安市| 安新县| 济宁市| 疏附县| 泰安市| 旬阳县| 穆棱市| 南宁市| 洛阳市| 邹平县| 老河口市| 登封市| 乌海市| 剑河县| 拜泉县| 会宁县| 辽源市| 隆安县|