所謂條件表達式,就是分支語句,去掉分支語句咯
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,代碼更好看一點。