algorithm - 组合冲突选项的实用方法
问题描述
我有一个脚本,它接受多个选项作为参数。有效选项列表可能很大 (>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]
解决方案
让我们假设,当您编写源代码时,您可以决定如何组织您的参数以进行解析时间。例如(使用 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
,最好在解析后编写代码检查这个事实,而不是让解析器复杂化以处理选项值之间的任意关系。
推荐阅读
- json - How to get specific data on a unit of dict in json
- html - 背景模糊效果,在过渡期间创建“插入阴影”问题
- reactjs - 可以用 useMemo 代替 useEffect 来调用副作用函数
- memory-management - 如何在内核启动时找出伙伴分配器分配了每个订单的多少块内存?
- python - 如何在python中阅读单词(docx)?
- c++ - cv::Point3f 的构造函数是如何工作的?
- python - Jupyter Hub:启动器中的致命错误,...系统找不到指定的文件
- mysql - 如何在包含不同数据的相同列的两个不同表上创建视图
- angular - 从多选择角反应形式中删除选定的值
- c# - 在具有不同大小写的 switch-case 块中比较 C# 中的字符串