Практичный способ сочетания противоречивых вариантов - PullRequest
0 голосов
/ 10 октября 2018

У меня есть скрипт, который принимает несколько параметров в качестве аргументов.Список допустимых параметров может быть большим (> 20), что может привести к конфликтам.Существует ли практический способ объединить конфликтующие вместе и не конфликтовать в другой без создания нескольких списков, групп и т. Д. Изменения в одной группе приведут к изменениям в других группах.

Например, списокдоступных параметров: -a, -b, -c, -d

Конфликт следующих параметров: [-a, -c], [-a, -d]

Следующие параметры не конфликтуют: [-a, -b], [-c, -d]

РЕДАКТИРОВАТЬ, более точный пример:

Например, скрипт позволяет запускать / останавливать определенную задачу и имеет дополнительные параметры для создания / удаления журналов.

Обычный запуск будет выглядеть следующим образом: ./script -start Task -logFile C:\out.tmp

И сценарий должен уведомить пользователя в случае, если выполнено что-то вроде: ./script -start Task -stop Task, поскольку start и stop - это два противоположных действия.

Еще одно конфликтующее действие: ./sript -start Task -logFile C:\out.tmp -deleteLog C:\out.tmp, которое может создатьфайл журнала и удалить его одновременно

Теперь, если параметры start, stop, logFile, deleteLog,

Следующее может быть конфликтующим: [start, stop], [logFile, deleteLog]

Следующее будетне быть противоречивым: [start, logFile], [stop, deleteLog]

1 Ответ

0 голосов
/ 11 октября 2018

Предположим, что, когда вы пишете источник, вы можете решить, как организовать ваши аргументы для анализа времени.Например (используя нотацию JSON, вы можете легко адаптировать это к структурам C, перечислениям Java или что-то еще), вы можете аннотировать доступные опции, чтобы явно указать , какие из них конфликтуют:

const options = [
  {
    name: "start",
    description: "starts foobaring the fizzbuzz",
    parameters: [
      { 
        name: "task",
        type: "string",
        optional: false,
        description: "the type of task to foobar"
      }
    ]
    conflicts: ["stop"] // <-- explicit simple conflict detection
  },
  { ... }
]

Это будет использоваться модулем синтаксического анализа командной строки для

  • создания красивого справочного экрана, возможно, с конфликтующими опциями
  • , возвращающего карту параметров командной строкискажем, parsedArgs, чтобы parsedArgs['start'] соответствовал параметрам start параметра, если он был указан.
  • обнаруживает простые конфликты, выдавая жалобы, если конфликтующие опции обнаруживаются во время анализа.

Обратите внимание, что могут быть дополнительные конфликты, которые не стоит обнаруживать на этапе анализа.Например, если значение параметра foo должно быть больше, чем bar + baz, лучше выполнить код для проверки этого факта после анализа, а не усложнять синтаксический анализатор для обработки произвольных отношений между значениями параметра.

...