处理命令行参数的设计模式是什么

Sam*_*fee 46 language-agnostic command-line arguments design-patterns

如果您正在编写可从命令行执行的程序,您通常希望为用户提供多个选项或标志,以及可能的多个参数.我偶然发现了这么多次,但是有没有某种设计模式可以循环遍历args并调用适当的处理函数?

考虑:

myprogram -f filename -d directory -r regex
Run Code Online (Sandbox Code Playgroud)

在使用您的语言的任何内置函数检索参数后,如何组织处理函数?(欢迎语言特定的答案,如果这有助于你明确答案)

小智 15

我认为以下答案更符合您的要求:

您应该看一下应用模板模式("设计模式"中的模板方法[Gamma,el​​ al])

简而言之,它的整体处理如下:

If the arguments to the program are valid then
    Do necessary pre-processing
    For every line in the input
        Do necessary input processing
    Do necessary post-processing
Otherwise
    Show the user a friendly usage message
Run Code Online (Sandbox Code Playgroud)

简而言之,实现一个ConsoleEngineBase类,该类具有以下方法:

PreProcess()
ProcessLine()
PostProcess()
Usage()
Main()
Run Code Online (Sandbox Code Playgroud)

然后创建一个机箱,实例化一个ConsoleEngine()实例并发送Main()消息以启动它.

要查看如何将其应用于控制台或命令行程序的一个很好的示例,请查看以下链接:http: //msdn.microsoft.com/en-us/magazine/cc164014.aspx

这个例子是在C#中,但这些想法很容易在任何其他环境中实现.

您可以将GetOpt()视为适合参数处理(预处理)的部分.

希望这可以帮助.

  • 赞成坚持概念而不是实施.我觉得这应该是选择的答案. (2认同)

Pet*_*hie 14

我不知道任何有关处理的文件"模式".

我相信用于处理参数的最古老的库/ API之一是getopt.谷歌搜索"getopt"显示了很多手册页和实现链接.

通常,我的应用程序中有一个首选项或设置服务,参数处理器知道如何与之通信.然后将参数转换为此服务中的某个应用程序,而不是查询.这可以像设置字典一样简单(比如名为"filename"的字符串设置).


Jas*_*hen 5

你没有提到这种语言,但对于Java,我们很喜欢Apache Commons CLI.对于C/C++,getopt.


ama*_*jee 5

嗯,这是一个旧帖子,但我仍然想贡献。这个问题是关于设计模式的选择,但是我可以看到很多关于使用哪个库的讨论。我已经按照 lindsay 检查了 microsoft 链接,其中讨论了要使用的模板设计模式。

但是,我不相信这篇文章。模板模式的意图是定义一个模板,该模板将由各种其他类实现以具有统一的行为。我不认为解析命令行适合它。

我宁愿使用“命令”设计模式。这种模式最适合菜单驱动的选项。

http://www.blackwasp.co.uk/Command.aspx

因此,在您的情况下,-f、-d 和 -r 都成为定义了公共或单独接收器的命令。这样将来可以定义更多的接收器。下一步将链接命令的这些职责,以防需要处理链。我会选择的。

http://www.blackwasp.co.uk/ChainOfResponsibility.aspx

我想这两者的组合最适合组织用于命令行处理或任何菜单驱动方法的代码。