程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 【重構學習】08 條件表達式的重構,重構08條件表達式

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

編輯:C#入門知識

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


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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved