你的位置:首页 > ASP.net教程

[ASP.net教程]【重构学习】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,代码更好看一点。