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

3
我有:
- 一个现有的面向对象的本地代码 API(非 GUI) - 与该 API 配合使用的 GUI 应用程序
目标:
创建另一个控制台应用程序,让用户通过键入命令执行一些工作流程(类似于上述 GUI 应用程序中的工作流程)。此应用程序应该是“有状态”的——可用命令及其结果将取决于之前发布的命令。
问题:
我不想“重复发明轮子”。是否存在构建应用程序和定义“词汇表”的现有模式?目前,对我来说,最好的选择似乎是从头编写一组帮助程序和命令解析器。
附言:如果我的 API 是 .Net 的,我会考虑 PowerShell 方向,但这个 API 很大,将它包装成 .Net 会非常耗时。
6个回答

3
你描述的使用模式听起来像是Read-Eval-Print loop (REPL),这是解释型语言常用的交互模式。
实际上,你似乎在描述一个命令语言和解释器,因此建议在该领域中寻找与现有API绑定匹配的模式。

1

你有任何COM接口吗?PowerShell可以无缝地脚本化COM、WMI或.NET;你甚至可以使用纯脚本进行运行时p/invoke调用;这样原型设计的时间会少得多。一旦你确定了设计,你可以选择稍后将其包装为本机Cmdlets以提高速度。

-Oisin


似乎对于“可用命令根据API状态更改”的用例来说,维护状态并不适合在像登录shell这样的轻量级环境中运行...我的印象是PowerShell的cmdlet与状态存储交互的能力不正确吗? - Tetsujin no Oni
我的想法完全一样。我强烈建议将您的API创建为COM对象。这很可能也是更快的方法。 - skamradt
@Tetsujin PowerShell具有动态参数的概念,这些参数根据后备存储状态有条件地在现有命令上提供,通常封装为提供程序。例如,文件系统提供程序通过添加“-Wait”开关到Get-Content cmdlet,可以根据当前路径进入该提供程序和/或其内部状态进行条件设置。 - x0n

1

如果您最终使用 .net,也许可以看一下 Mono.Options 库:http://tirania.org/blog/archive/2008/Oct-14.html

"Mono.Options 是一个优美的命令行解析库。它小巧、简洁、易于使用、功能强大,一应俱全。"


1

要在命令行上开始工作,首先不要重复造轮子。有很多选项可以解析命令。

在Java中,有Commons CLI提供您所需的一切。还有一个.NET CLI port

InfiniteRed对如何在Ruby中执行此操作有很好的介绍

就实现而言,您有正确的想法。但是在这里也不要重复造轮子。将工作封装在Command对象中,并考虑使用责任链模式; Commons Chain效果很好。还有一个.NET Chain port

如果不能使用这些框架,可以看看它们是如何实现的。另外,如果在与某些选项进行交互时遇到问题,Ruby 是一个非常好用的瑞士军刀,可以解决这类问题。它相对来说比较便携,并且代码可以变得非常干净和易于维护。
更新:JCommander 也很有趣。

我认为这可能是你所需要的全部。只需将您需要的所有状态推入Chain的执行上下文中即可。 - cwash

1

使用自动工具(如SIPSWIG)包装您的API,将它们作为Python模块导入到ipython会话中,从命令行操作您的对象。完成任务。

如果失败,可能是因为:

  • 您的对象/API不适合自动封装(但将它们置于可封装状态的过程通常意味着改进它们)。
  • Python并不真正符合您对命令行的想法(即使有ipython增强功能)。

0

我非常赞同xOn的回答,但为了在调用之间保持状态,只需将其作为单个实例com对象,然后编写一个“登录”函数来调用AddRef和一个“注销”函数来调用Release。这样对象将在调用之间保留下来。唯一的风险是在同一台计算机上运行多个登录的情况...因此您需要对此进行捕获。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接