2017-02-28 28 views
0

在C#中工作,想減少if else系列,實體有兩個屬性FromServiceIDToServiceID,假設我的ServiceClass實例有下列信息。如何清理波紋管代碼?任何類型的建議都是可以接受的。如何清理if else系列

entity= new ServiceClass(); 
entity.FromServiceID=3 
entity.ToServiceID=1 

if (entity.FromServiceID == 1) 
{ 
    entity.1KWithdrawal(); 
} 
else if (entity.FromServiceID == 2) 
{ 
    entity.10KWithdrawal(); 
} 
else if (entity.FromServiceID == 3) 
{ 
    entity.BTWithdrawal(); 
}   
if (entity.ToServiceID == 1) 
{ 
    entity.1KDeposit(); 
} 
else if (entity.ToServiceID == 2) 
{ 
    entity.10KDeposit(); 
} 
else if (entity.ToServiceID == 3) 
{ 
    entity.BTDeposit(); 
} 


public class ServiceClass 
{ 

    public int FromServiceID { get; set; } 
    public int ToServiceID { get; set; } 

    public void 1KWithdrawal() 
    { Console.WriteLine("One_KWithdrawal"); } 

    public void 10KWithdrawal() 
    { Console.WriteLine("Ten_KWithdrawal"); } 

    public void BTWithdrawal() 
    { Console.WriteLine("BTWithdrawal"); } 

    public void 1KDeposit() 
    { Console.WriteLine("One_KDeposit"); } 

    public void 10KDeposit() 
    { Console.WriteLine("Ten_KDeposit"); } 

    public void BTDeposit() 
    { Console.WriteLine("Ten_KDeposit"); } 
} 
+4

使用'switch ... case ...'而不是 – GSP

+1

那是僞代碼嗎?您正在初始化對象,但不會將實例分配給變量,因此它們已準備好在初始化後立即進行垃圾回收。 –

+1

從什麼時候開始班級名稱以數字開頭? – pinkfloydx33

回答

2

使用Dictionary。事情是這樣的:

Dictionary<int, ServiceClass> dictionary = new Dictionary<int, ServiceClass>() 
{ 
    {1, new ServiceClass()}, 
    {2, new ServiceClass()}, 
    {3, new BTWithdrawal()},//assume BTWithdrawal inherits from ServiceClass 
}; 

如何使用它的一個例子:

ServiceClass value=new ServiceClass(); 
value.FromServiceId=1; 
value.ToServiceId = 2; 
dictionary.TryGetValue(value.FromServiceId, out value); 
//or dictionary.TryGetValue(value.ToServiceId, out value); 
if (value != null) MessageBox.Show(value.Id.ToString()); 
+1

OP通過 – pinkfloydx33

+0

@ S.Akbari檢查兩個不同的屬性,感謝您的回覆,請您介紹如何使用您的語法。 – shamim

+0

@ S.Akbari,感謝您的回覆,假設我的ServiceClass實例值具有以下信息:ServiceClass value = new ServiceClass(); value.FromServiceId = 1; value.ToServiceId = 2,現在我如何使用您的語法。 – shamim

0

您可以使用如下開關情況:

var entity = new ServiceClass(); 

entity.FromServiceID = 3; 
entity.ToServiceID = 1; 

switch(entity.FromServiceID) 
{ 
    case 1: 
     new 1KWithdrawal(); 
     break; 
    case 2: 
     new 10KWithdrawal(); 
     break; 
    case 3: 
     new BTWithdrawal(); 
     break; 
} 

switch(entity.ToServiceID) 
{ 
    case 1: 
     new 1KDeposit(); 
     break; 
    case 2: 
     new 10KDeposit(); 
     break; 
    case 3: 
     new BTDeposit(); 
     break; 
} 
1

也許這就是矯枉過正,但您可以創建從每個案例中繼承的每個案例的一個類(我們稱之爲ICommon)爲每個案例公開一個公共方法(在您的情況下爲Create方法),然後將該接口注入到constru電話號碼爲ServiceClass

然後當你想使用ServiceClass時,你將不得不提供ICommon(你從每個案例中提取的一個類)的實際實現,最後你只需要撥打entity.Create即可。

我相信這是策略模式,總結說你應該在一個通用接口下的不同類中提取算法。最後,這種重構將減少代碼的分圓複雜性(這主要意味着你減少了代碼中的分支),這總是一件好事。

0

你可以做的是把所有的變化放到一個枚舉中,並像你想要調用的方法一樣調用枚舉值。 (我建議不要在名稱中使用的數字,因爲編譯器不會允許它)

爲了簡單和可測試性,我把枚舉的目的和方法到同一類別:

public class ServiceClass 
{ 
    public enum ServiceID 
    { 
     OneKWithdrawal, 
     Ten_KWithdrawal, 
     BTWithdrawal, 
     OneKDeposit, 
     Ten_KDeposit, 
     BTDeposit 
    } 
    public ServiceID From_Ser_ID { get; set; } 
    public ServiceID To_Ser_ID { get; set; } 

    public void One_KWithdrawal() 
    { Console.WriteLine("One_KWithdrawal"); } 

    public void Ten_KWithdrawal() 
    { Console.WriteLine("Ten_KWithdrawal"); } 

    public void BTWithdrawal() 
    { Console.WriteLine("BTWithdrawal"); } 

    public void One_KDeposit() 
    { Console.WriteLine("One_KDeposit"); } 

    public void Ten_KDeposit() 
    { Console.WriteLine("Ten_KDeposit"); } 
} 

這將是執行你的if條件方法的方法。它使用反射來訪問在枚舉中編碼的方法。您可能必須調整Invoke(sc, null);調用中的object參數,具體取決於您的方法所在的位置。如果他們與您要撥打execute的同一班級中,則可以使用this

public static void execute(ServiceClass sc) 
{ 
    sc.GetType().GetMethod(sc.From_Ser_ID.ToString()).Invoke(sc, null); 
    sc.GetType().GetMethod(sc.To_Ser_ID.ToString()).Invoke(sc, null); 
} 

在這裏你可以測試整個代碼:

public static void Main(string[] args) 
{ 

    ServiceClass entity = new ServiceClass(); 
    entity.From_Ser_ID = ServiceClass.ServiceID.BTWithdrawal; 
    entity.To_Ser_ID = ServiceClass.ServiceID.Ten_KDeposit; 

    execute(entity); 
} 

所以,你最終會得到一個枚舉和2行代碼。