C# 如何清理if-else系列
在C#中工作,要减少if-else系列,实体有两个属性C# 如何清理if-else系列,c#,coding-style,C#,Coding Style,在C#中工作,要减少if-else系列,实体有两个属性从ServiceID和到ServiceID,假设我的ServiceClass实例有下面的信息。如何清理下面的代码?任何类型的建议都可以接受 entity= new ServiceClass(); entity.FromServiceID=3 entity.ToServiceID=1 if (entity.FromServiceID == 1) { entity.1KWithdrawal(); } else if (entity.Fr
从ServiceID
和到ServiceID
,假设我的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<int, ServiceClass> dictionary = new Dictionary<int, ServiceClass>()
{
{1, new ServiceClass()},
{2, new ServiceClass()},
{3, new BTWithdrawal()},//assume BTWithdrawal inherits from ServiceClass
};
使用一个。大概是这样的:
Dictionary<int, ServiceClass> dictionary = new Dictionary<int, ServiceClass>()
{
{1, new ServiceClass()},
{2, new ServiceClass()},
{3, new BTWithdrawal()},//assume BTWithdrawal inherits from ServiceClass
};
您可以按如下方式使用开关箱:
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;
}
您可以按如下方式使用开关箱:
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;
}
也许这是一种过分的做法,但您可以为每个案例创建一个类,该类继承自一个公共接口(我们称之为
ICommon
),该接口为每个案例公开一个公共方法(在您的案例中是一个create方法),然后将该接口注入ServiceClass
的构造函数中
然后,当您想要使用ServiceClass
时,您必须提供ICommon
的实际实现(从每个案例中提取的一个类),最后您只需调用实体。Create
我相信这就是策略模式,概括地说,您应该在公共接口下的不同类中提取算法
最后,这种重构将降低代码的分圆复杂性(这主要意味着减少代码上的分支),这始终是一件好事。也许这是一种过分的做法,但您可以为每个案例创建一个从公共接口继承的类(我们称之为
ICommon
)这将为每种情况公开一个公共方法(在您的情况下为Create方法),然后将该接口注入到ServiceClass
的构造函数中
然后,当您想要使用ServiceClass
时,您必须提供ICommon
的实际实现(从每个案例中提取的一个类),最后您只需调用实体。Create
我相信这就是策略模式,概括地说,您应该在公共接口下的不同类中提取算法
最后,这种重构将降低代码的分圆复杂性(这主要意味着减少代码上的分支),这始终是一件好事。您可以做的是将所有变体放入一个枚举中,并像您希望调用的方法一样调用枚举值。(我建议不要在名称中使用数字,因为编译器不允许使用数字) 为了简单性和可测试性,我将enum和方法放在同一个类中:
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条件方法的方法。它使用反射来访问在枚举中编码的方法。您可能需要调整调用(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);
}
因此,您将得到一个枚举和两行代码。您可以做的是将所有变体放入一个枚举中,并像您希望调用的方法一样调用枚举值。(我建议不要在名称中使用数字,因为编译器不允许使用数字)
为了简单性和可测试性,我将enum和方法放在同一个类中:
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条件方法的方法。它使用反射来访问在枚举中编码的方法。您可能需要调整调用(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);
}
因此,您将得到一个枚举和两行代码。使用开关。。。case…
是伪代码吗?您正在初始化对象,但没有将实例分配给变量,因此它们在初始化后即可进行垃圾收集。类名何时可以以数字开头?如果我们不知道此类的用途以及这些方法的作用,我们将帮不上什么忙。它太抽象了,无法提供真正的改进。通常我建议将逻辑封装在ServiceClass
中。因此,实现一个方法进程
(或其他任何方法),它根据属性的值调用方法。那么您只需要entity.Process()代码>标识符(如方法名或类型名)不能以数字开头,因此1K()代码>不能是真实代码。请使用开关。。。case…
是伪代码吗?您正在初始化对象,但没有将实例分配给变量,因此它们在初始化后即可进行垃圾收集。类名何时可以以数字开头?如果我们不知道此类的用途以及这些方法的作用,我们将帮不上什么忙。它太抽象了,无法提供真正的改进。通常我建议将逻辑封装在ServiceClass
中。因此,实现一个方法进程
(或其他任何方法),它根据属性的值调用方法。那么您只需要entity.Process()代码>标识符(如方法名或类型名)不能以数字开头,因此1K()代码>不能是真实代码。OP检查两个不同的属性though@S.Akbari,谢谢您的回复,请您描述一下如何使用您的语法。@S.Akbari,谢谢您的回复,假设我的ServiceClass实例值包含如下信息:ServiceClass值=新ServiceClass();值。FromServiceId=1;value.ToServiceId=2,现在我如何使用您的语法。@S.Akbari,感谢您的宝贵努力,请告诉我为什么它比我的语法好。对于包含输入的实例和out
变量,使用一个变量value
,我