我有:
目标: 创建一个额外的控制台应用程序,通过键入命令,用户可以执行一些工作流程(类似于上面的GUI应用程序)。此应用程序应为“有状态” - 可用命令及其结果取决于先前发出的命令。
问题: 我不想“重新发明轮子”。是否存在构建应用程序和定义“词汇表”的现有模式?目前,在我看来,最好的选择是“从头开始”编写一组帮助程序和命令解析器。
P.S。如果我的API在.Net中,我会考虑PowerShell的方向,但是API很大并且将它包装到.Net非常耗时。
答案 0 :(得分:3)
您描述的使用模式听起来像是Read-Eval-Print循环(REPL),这是解释语言的常见交互模式。
事实上,您似乎在描述命令语言和解释器,因此我建议检查该域是否与您现有的API绑定模式匹配。
答案 1 :(得分:1)
你有COM接口吗? PowerShell可以无缝编写COM,WMI或.NET脚本;你甚至可以用纯脚本进行运行时p / invoke调用;原型制作的时间要少得多。一旦巩固了设计,您可以选择以较快的速度包装为本机Cmdlet。
-Oisin
答案 2 :(得分:1)
如果你最终使用.net,也许你可以看看@ Mono.Options库:http://tirania.org/blog/archive/2008/Oct-14.html
“Mono.Options是一个美丽的命令 行解析库。它很小, 简洁,快乐,易用 强大,一体化。“
答案 3 :(得分:1)
要开始使用命令行,首先不要重新发明轮子。有很多选项来解析命令。
在Java中,Commons CLI为您提供所需的一切。还有.NET CLI port。
InfiniteRed有a good writeup如何在Ruby中执行此操作。
就实施而言,你有正确的想法。但也不要在这里重新发明轮子。封装Command
个对象中的工作,并使用Chain of Responsibility模式进行查看; Commons Chain效果很好。还有.NET Chain port。
如果不能使用这些框架,请查看它们是如何实现的。另外,如果你在使用其中一些选项进行互操作时遇到问题,Ruby对于做这类事情来说真是一把不错的瑞士军刀。它相对便携,代码最终可以非常干净,易于维护。
更新:JCommander看起来也很有趣。
答案 4 :(得分:1)
使用SIP或SWIG等自动工具包装您的API,将它们作为python模块导入ipython会话,从命令行执行对象操作。完成工作。
如果失败,那将是因为:
答案 5 :(得分:0)
我非常同意xOn的回答,但为了维持调用之间的状态,只需将其设为单个实例com对象,然后编写一个“登录”函数来调用AddRef和一个“注销”函数来调用Release。这样,对象将在调用之间保持不变。唯一的风险是在多个登录的同一个盒子上多次运行......所以你会想要陷阱。
根据您需要的状态,如果它不多,并且可以轻松地流式传输到磁盘文件或数据库,那么多实例com对象的行为会更好,并且不需要addref或release调用。