Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何清理if-else系列_C#_Coding Style - Fatal编程技术网

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

在C#中工作,要减少if-else系列,实体有两个属性
从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
,我