设计控制台应用程序的架构考虑

时间:2009-05-03 18:24:52

标签: architecture oop console

我最近编写了一个控制台应用程序,并且我在很多方面都经历了很多痛苦,特别是在C#中,考虑到它的纯OO范例。我面临的问题包括如何将选项传递给如何将问题返回到入口点类,以及许多其他问题。

我的问题是:你们中的任何人都会知道OO范例中的控制台应用程序的优秀设计,以便我可以向他们学习吗?良好实施的代码是特别欢迎。

编辑:我不是在使用命令行API之后,而是在良好的设计原则之后,特别是我可以从中学到的良好实现。

编辑2:应用程序中存在简单的用户交互,但它不是完整的CLI / REPL排序。可以将其视为TeX命令,或多或少。有趣的是,即使有好的理论浮动(与X没有区别,使用模式Y,你应该知道OO原则...... [你的计算机科学教授会非常自豪!]),没有真正的代码我可以采取看看这些概念在行动中。同样,我应该在纯OO范例中查找(代码!)以获得良好的命令行应用程序吗?

5 个答案:

答案 0 :(得分:7)

听起来好像你正在构建一个接口,它在每次调用时执行几个不同的操作之一。我不确定您是指“命令行”应用程序(执行一个操作,然后退出)还是CLI应用程序(显示提示并反复响应用户输入)。一般来说,前者比后者更容易建造;我认为如果您的应用程序需要一些通过多个命令演变的持久状态,那么使用CLI才有意义。如果你正在处理这样的事情,那么alphazero是正确的 - 你应该了解REPL并复制一个好的。

在任何情况下,执行的操作将取决于命令行上传递的参数,因此我将集体讨论该部分......

将应用程序视为一组不同的“命令”对象是合理的,每种类型的操作都有一个。因此,应用程序的入口点应该是某种CommandLineDispatcher对象,它将请求分派给相应的Command对象。

要进行模块化,应该为调度程序配置抽象映射(例如,Hashtable),以将每个命令令牌(通常是命令行字符串的第一个单词)与处理它的Command对象相关联。调度程序也可以处理常见的选项解析,可能使用一些现成的“getopts”库来完成繁重的工作。

简单地说,每个Command对象都可以实现一致的接口来完成它的工作;也许是这样的:

public void execute(List<String> args)

这样,入口点调度程序只找到被请求的命令,并executes它。

关于错误处理:execute()方法可能只是抛出异常来传达错误...异常可能被调度程序捕获并处理,或者只是记录到屏幕上。或者,失败的命令可以调用一些共享的usage函数来将错误消息与一般指令组合在一起。我不认为必须按照你的建议让“切入点”意识到问题;如果您需要强大的错误处理(例如,用于记录或警报功能),这似乎属于可以提供给Command对象的单独组件。

通常,命令行应用程序与响应用户输入的任何其他应用程序没有什么不同 - 您需要一个调度程序来解析和路由输入,以及处理程序(也称为“控制器”)来执行支持操作。如果您需要其他服务(日志记录,警报,数据库连接等),您最好创建单独的组件来隔离此逻辑并使用干净的接口公开它。

答案 1 :(得分:4)

当涉及到日志记录,错误和异常处理,安全性等关键的交叉问题时,控制台应用程序与常规的win表单或Web应用程序没有什么不同,

话虽如此,请您详细说明我们关注的关键领域在哪里?

您可以从Microsoft的App Architecture Guide中获取许多模式。

答案 2 :(得分:1)

在Java中,我经常使用Apache CLI,我用谷歌搜索“CLI for .NET”,但它似乎还没有任何实现。也许对于您阅读用于接收控制台参数的Java方法很有用。

对于应用程序的体系结构,它应该与您在Web App中使用的体系结构没有太大区别,不同之处在于控制台是表示层的接口。也许你可以定义一些'ConsoleControllers'来接收从业务层到控制台的模型,反之亦然。将每个用户输入视为请求;)。

答案 3 :(得分:1)

在最常见的(极端)意义上,控制台应用程序是一种REPL:

http://en.wikipedia.org/wiki/REPL

显然,特定于域的(控制台)应用程序不支持图灵完整语言,但许多问题重叠,良好的REPL需要是一个非常强大的命令行应用程序。我相信你可以学到很多关于典型REPL的设计和实现的知识。 (大多数REPL都是开源的。(尝试使用ruby或python进行OO REPL))

答案 4 :(得分:0)

对于具有良好建筑设计的程序,特别是在C#中,您应该熟悉OO设计概念,以充分利用OO范例