如何清理if else系列
在C#中工作,想要减少if else系列,实体有两个属性FromServiceID
和ToServiceID
,假设我的ServiceClass
实例有下面的信息。如何清理下面的代码? 任何类型的建议都是可以接受的。
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"); } }
使用Dictionary
。 像这样的东西:
Dictionary dictionary = new Dictionary() { {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());
也许这是一种矫枉过正,但你可以为你的每个案例创建一个类,它inheritance自一个公共接口(让我们称之为ICommon
),为每种情况公开一个通用的方法(在你的情况下是一个Create方法),然后注入ServiceClass
的构造函数中的接口。
然后,当您想要使用ServiceClass
,您必须提供ICommon
的实际实现(从每个案例中提取的类之一),最后您只需要调用entity.Create
。
我相信这是策略模式,总的来说,你应该在一个通用接口下的不同类中提取算法。
最后,这种重构将降低代码的分圆复杂性(这主要意味着您减少代码的分支),这总是一件好事。
您可以做的是将所有变体放入枚举中,并调用枚举值,就像您想要调用的方法一样。 (我建议不要在名称中使用数字,因为编译器不允许使用它)
为了简单和可测试性,我将枚举和方法放在同一个类中:
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-condition方法的方法。 它使用reflection来访问枚举中编码的方法。 您可能必须在Invoke(sc, null);
调整object
参数Invoke(sc, null);
根据您的方法所在位置调用。 如果它们与您调用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行代码。
你可以使用如下的switch case:
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; }