Как я могу рефакторинг несколько, только если условие - PullRequest
0 голосов
/ 12 марта 2020

Здесь я хочу проверить все свойства объекта одно за другим и проверить, не является ли это NAN, чем применять некоторые логи c, иначе пропустить для каждого свойства.

, для этого мне нужно сделать несколько ifs , Есть ли лучший способ, которым я должен это сделать?


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();
    }
}

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

Ну, поле с, как A, ..., F - это личное дело класса cls_pro; поэтому я предлагаю переместить все

 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();
    }
}
1 голос
/ 12 марта 2020

Нет лучшего способа использования .

Каждая логика c на основе условий вашего приложения может быть построена с 3 различными подходами:

If- else ветвление

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

If-else лучше всего подходит для коротких логи c ветвление. Если у вас не так много условий, это хороший инструмент.

Переключение ветвления

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 ветвления или сопоставления с образцом (C# 8.0 получает более хороший синтаксис для этого). Если у меня средний размер ветвления логики c - я предпочитаю его использовать.

Шаблон стратегии

Если у вас большое ветвление логики c - вы должны использовать шаблон стратегии.
Этот шаблон довольно прост:

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 ветвление. Это более уместно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...