首页 > 解决方案 > 组合冲突选项的实用方法

问题描述

我有一个脚本,它接受多个选项作为参数。有效选项列表可能很大 (>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被执行,因为startstop是两个相反的动作。

另一个冲突的操作: ./sript -start Task -logFile C:\out.tmp -deleteLog C:\out.tmp,它会创建一个日志文件并同时删除它

现在,如果选项是start, stop, logFile, deleteLog

以下将是相互矛盾的:[start, stop], [logFile, deleteLog]

以下内容不会冲突:[start, logFile], [stop, deleteLog]

标签: algorithmlistlogiccombinations

解决方案


让我们假设,当您编写源代码时,您可以决定如何组织您的参数以进行解析时间。例如(使用 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参数。
  • 如果在解析时检测到冲突选项,则通过抱怨来检测简单的冲突。

请注意,可能存在其他冲突,在解析阶段可能不值得检测。例如,如果 option 的值foo必须大于bar+ baz,最好在解析后编写代码检查这个事实,而不是让解析器复杂化以处理选项值之间的任意关系。


推荐阅读