您将如何从现有的面向对象的API创建控制台应用程序?

时间:2009-06-02 16:04:16

标签: c# c++ delphi console

我有:

  • 现有面向对象的本机代码API(非GUI)
  • 适用于此API的GUI应用程序

目标:   创建一个额外的控制台应用程序,通过键入命令,用户可以执行一些工作流程(类似于上面的GUI应用程序)。此应用程序应为“有状态” - 可用命令及其结果取决于先前发出的命令。

问题:   我不想“重新发明轮子”。是否存在构建应用程序和定义“词汇表”的现有模式?目前,在我看来,最好的选择是“从头开始”编写一组帮助程序和命令解析器。

P.S。如果我的API在.Net中,我会考虑PowerShell的方向,但是API很大并且将它包装到.Net非常耗时。

6 个答案:

答案 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

InfiniteReda good writeup如何在Ruby中执行此操作。

就实施而言,你有正确的想法。但也不要在这里重新发明轮子。封装Command个对象中的工作,并使用Chain of Responsibility模式进行查看; Commons Chain效果很好。还有.NET Chain port

如果不能使用这些框架,请查看它们是如何实现的。另外,如果你在使用其中一些选项进行互操作时遇到问题,Ruby对于做这类事情来说真是一把不错的瑞士军刀。它相对便携,代码最终可以非常干净,易于维护。

更新:JCommander看起来也很有趣。

答案 4 :(得分:1)

使用SIPSWIG等自动工具包装您的API,将它们作为python模块导入ipython会话,从命令行执行对象操作。完成工作。

如果失败,那将是因为:

  • 您的对象/ API不适合自动换行(但让它们进入可换行状态的过程通常意味着改进它们。)
  • Python并不是您对命令行的想法(即使使用ipython增强功能)。

答案 5 :(得分:0)

我非常同意xOn的回答,但为了维持调用之间的状态,只需将其设为单个实例com对象,然后编写一个“登录”函数来调用AddRef和一个“注销”函数来调用Release。这样,对象将在调用之间保持不变。唯一的风险是在多个登录的同一个盒子上多次运行......所以你会想要陷阱。

根据您需要的状态,如果它不多,并且可以轻松地流式传输到磁盘文件或数据库,那么多实例com对象的行为会更好,并且不需要addref或release调用。