代码之家  ›  专栏  ›  技术社区  ›  ReeSSult

组合冲突选项的实用方法

  •  0
  • ReeSSult  · 技术社区  · 6 年前

    我有一个脚本,它接受多个选项作为参数。有效选项列表可能很大(>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 回复  |  直到 6 年前
        1
  •  0
  •   tucuxi    6 年前

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