仅当条件时,我如何重构多个

how can i refactor multiple only if condition

在这里,我想一一检查对象的所有属性,并检查它是否 NAN 而不是应用一些逻辑,否则跳过每个属性。

为此我必须做多个如果。有更好的方法吗?


internal class cls_pro
{
    public double A;
    public double B;
    public double C;
    public double D;
    public double E;
    public double F;
}


class Program
{
    static void Main(string[] args)
    {
        cls_pro obj = new cls_pro();
        obj.A = 1;
        obj.B = 3;
        obj.C = 1;
        obj.D = 23;
        obj.E = double.NaN;
        obj.F = double.NaN;


        // If propertie is not null some logic will apply
        if (!double.IsNaN(obj.A)) { ;}
        if (!double.IsNaN(obj.B)) { ;}
        if (!double.IsNaN(obj.C)) { ;}
        if (!double.IsNaN(obj.D)) { ;}
        if (!double.IsNaN(obj.E)) { ;}
        if (!double.IsNaN(obj.F)) { ;}

        Console.ReadLine();
    }
}

嗯,领域A,...,F私事 cls_pro class;这就是为什么我建议 moving all

 if (!double.IsNaN(obj.A)) { ;}

和类似调用 cls_pro(让我们 将其重命名 ClsPro):

internal class ClsPro {
    //DONE: do not expose fields, but properties
    public double A { get; }
    public double B { get; }
    public double C { get; }
    public double D { get; }
    public double E { get; }
    public double F { get; }

    public ClsPro(double a = double.NaN, 
                  double b = double.NaN, 
                  double c = double.NaN, 
                  double d = double.NaN, 
                  double e = double.NaN, 
                  double f = double.NaN) {
      A = a;
      B = b;  
      C = c;
      D = d;
      E = e; 
      F = f; 
    } 

    public void PerformA() {
      if (double.IsNaN(A)) return;
      /* Some logic here*/
    }

    ...

    public void Perform() {
      PerformA();
      ...
      PerformF();
    }
}

执行时间:

class Program
{
    static void Main(string[] args)
    {
        ClsPro obj = new ClsPro(
          a :  1,
          b :  3,
          c :  1,
          d : 23 
        ); 

        obj.Perform();

        Console.ReadLine();
    }
}

应该使用没有更好的方法。

应用程序的每个基于条件的逻辑都可以用 3 种不同的方法构建:

If-else 分支

if (appliable) { /* do something */ }
else { /* do something different */ }

If-else 最适合短逻辑分支。如果你没有那么多条件,这是一个很好的工具。

切换分支

switch (logLevel)
{
    case LogLevel.Fatal:
        errorLogger.Fatal(exception);
        break;
    case LogLevel.Error:
        errorLogger.Error(exception, message);
        break;
    case LogLevel.Warning:
        logger.Warn(message);
        break;
    case LogLevel.Info:
        logger.Info(message);
        break;
    case LogLevel.Debug:
        logger.Debug(message);
        break;
    case LogLevel.Trace:
        logger.Trace(message);
        break;
    default:
        throw new ArgumentOutOfRangeException(nameof(level), level, null);
}

通常,switch 用于中等逻辑分支或模式匹配(C# 8.0 对此有更好的语法)。如果我有中等大小的逻辑分支 - 我更喜欢使用它。

策略模式

如果你有一个大的逻辑分支 - 你必须使用策略模式。
这个模式很简单:

public class StrategyUser
{
    private IStrategy strategy;

    public StrategyUser(IStrategy strategyToUse)
    {
        this.strategy = strategyToUse;
    }

    public void SetNewStrategy(IStrategy newStrategy)
    {
        this.strategy = newStrategy;
    }
}

策略可用于摆脱 if-else 地狱。您也可以直接在运行时更改 stretegy 以更改对象行为。

我认为您的任务最好的方法是使用 if 分支。比较合适。