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

Der*_*unk 8 architecture oop console

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

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

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

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

jos*_*hng 7

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

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

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

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

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

public void execute(List<String> args)
Run Code Online (Sandbox Code Playgroud)

这样,入口点调度程序只需找到所请求的命令即可executes.

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

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


Sri*_*ddi 5

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

话虽如此,您能否详细说明我们的问题,即他们关注的关键领域在哪里?

您可以借鉴Microsoft 的App Architecture Guide 中的许多模式。