组合冲突选项的实用方法

时间:2018-10-10 20:01:17

标签: algorithm list logic combinations

我有一个脚本,该脚本接受多个选项作为参数。有效选项列表可能很大(> 20),可能会导致冲突。是否有一种实用的方法可以将冲突的对象合并在一起,而又不将冲突的对象合并为另一个对象,而无需创建多个列表,组等。更改一个组将导致更改其他组。

例如,可用选项列表:-a, -b, -c, -d

以下选项冲突:[-a, -c], [-a, -d]

以下选项不会冲突:[-a, -b], [-c, -d]

编辑,一个更精确的示例:

例如,该脚本允许启动/停止特定任务,并具有用于创建/删除日志的其他选项。

正常开始看起来像: ./script -start Task -logFile C:\out.tmp

如果出现以下情况,脚本应通知用户: 由于./script -start Task -stop Taskstart是两个相反的动作,因此执行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 :(得分:0)

让我们假设,在您编写源代码时,您可以决定如何组织参数以分析时间。例如(使用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,则最好在解析后对此事实进行编码检查,而不是使解析器复杂化以处理任意值。选项值之间的关系。