Как упростить дерево if с условием else?

360
12 февраля 2017, 09:36

Данный код работает как нужно по задаче, вот только дерево if будет слишком большим, что можно переделать, чтобы не нагружать проверкой сотен if? По задаче: (приложение Windows Form - C#) когда в командной строке cmd обращаемся к приложению через команду /h выполняется команда 1, когда обращаемся с командами /h /s /e выполняется команда 1 2 3, при этом приложение не должно отображаться. Только при клике по приложению должна загружаться форма.

Код в Program.cs

static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        var form = new Form1();
        if (args.Contains("/h"))
        {
            form.Check1();
        }
        if (args.Contains("/s"))
        {
            form.Check2();
        }
        if (args.Contains("/e"))
        {
            form.Check3();
        }
        else if (args.Contains("/h") == false && (args.Contains("/s")) == false && (args.Contains("/e") == false))
        {
            Application.Run(new Form1());
        }
    }
Answer 1

Каждый вызов contains совершает проход по массиву, полагаю лучше сделать один вручную.
Можно завести булевую переменную, которая при необходимости запретит запуск приложения.

    var form = new Form1(); 
    bool needRun = true;
    foreach (string arg in args) {
      switch (arg) {
        case "/h": 
          form.Check1();
          needRun = false;
          break;
        case "/s": 
          form.Check2();
          needRun = false;
          break;
        ...
      }
    }
    if (needRun)
    {
        Application.Run(form);
    }

В случае, если при запуске в GUI не планируется вообще никаких параметров, можно просто проверить их отсутствие:

if (args.Length == 0)
  Application.Run(form);

args.Contains("/h") == false проверяет, что в массиве аргументов командной строки не было передано "/h".

Answer 2

Могу только подсказать в каком направлении двигаться. Вообще любые деревья if-условий нужно менять на ассоциативные массивы (массивы пар ключ-значение). В качестве ключа у тебя string из args.Contains(), в качестве значения либо отдельные объекты, которые вызывают FormCheck(). Либо разные экземпляры одного класса, с разными параметрами. В зависимости от того, насколько не однотипные команды.

Получается что-то типа:

//объекты, вставляемые в "значения"
interface Command {
  public void Run(Form1 form);
}
public class Command1 implements Command {
    public void Run(Form1 form){
       form.FormCheck1();
    }
}
public class Command2 implements Command {
    public void Run(Form1 form){
        form.FormCheck2();
    }
}
//это ассоциативный массив
Dictionary<string, Command> commands = new Dictionary<string, Command>();
//таким образом вбиваются пары ключ-значение
commands.Add("/h", new Command1());
commands.Add("/s", new Command2());
//или объекты одного класса с разными параметрами
var form = new Form1();
bool needRun = true;
//далее упрощаем все дерево условий в одну строку
foreach (string arg in args) {
  if (commands.ContainsKey(arg)) {
    commands[arg].Run(form);
    needRun = false;
  }
}
if (needRun) {
  Application.Run(form);
}
READ ALSO
Перемещение камеры в unity3d после нажатия

Перемещение камеры в unity3d после нажатия

Подскажите пожалуйста, как это можно осуществить(скрипт)Мне нужно что-бы камера в unity перемещалась на определенные координаты по осям x и y (например...

310
Как скрыть элекмент по условию в xaml?

Как скрыть элекмент по условию в xaml?

Есть свойство cnt, как я могу скрыть элемент когда cnt > 5?

351
Сессия asp .net

Сессия asp .net

Имеется проект на технологии aspnet

279
Удаление элемента из TreeView

Удаление элемента из TreeView

Подскажите как сделать удаление выделенного элемента из TreeView? (находящегося не на самом верхнем уровне)

463