用 Command 模式构建可扩展的命令行工具

news/2026/1/21 17:15:59/文章来源:https://www.cnblogs.com/Firepad-magic/p/19513044

用 Command 模式构建可扩展的 C# 命令行工具(支持多命令与路径解析)

在开发工具型程序(如:数据转换、图像处理、批处理工具)时,一个常见的演进过程是:

一个 Main → 一堆 if-else → 越来越难维护

本文介绍一种工程实践中非常成熟的做法:
用 Command 模式重构命令行工具,让每个功能成为一个独立命令(Command),主程序只负责调度(dispatch)。


一、问题背景:为什么要重构 CLI 结构?

传统写法通常是这样:

static void Main(string[] args)
{
    if (args[0] == "a") { /* 功能 A */ }
    else if (args[0] == "b") { /* 功能 B */ }
    else if (args[0] == "c") { /* 功能 C */ }
}

当功能增加后,会出现:

  • • Main 过于臃肿
  • • 功能之间强耦合
  • • 不利于测试与扩展
  • • 不利于长期维护

更合理的目标是:

新增一个命令,只新增一个文件
主程序不需要修改逻辑


二、设计目标

我们希望命令行工具具备以下特性:

  • • 每个功能是一个独立命令
  • • 支持命令行传参(如 -i input -o output
  • • 支持相对路径 / 绝对路径切换
  • • 主程序只负责「分发命令」

 

 

 

 

CommandXXX
CommandContext
Args
BaseDirectory
PathResolver

三、整体架构概览

CLI Tool
│
├── Program.cs          // 只做 dispatch
├── ICommand.cs         // Command 抽象
├── CommandContext.cs   // 参数 & 路径上下文
├── PathResolver.cs    // 路径解析
│
├── Commands/
│   ├── CommandA.cs
│   ├── CommandB.cs
│   └── CommandC.cs

四、核心思想:Command 模式

1️⃣ Command 接口

public interface ICommand
{
    string Name { get; }
    string Description { get; }
    void Execute(CommandContext context);
}
  • • Name:命令名(如 convertexport
  • • Execute:命令执行入口

2️⃣ 示例 Command(功能模块)

public class CommandExample : ICommand
{
    public string Name => "example";
    public string Description => "Run example task";    public void Execute(CommandContext ctx)
    {
        string input  = ctx.ResolvePath("i");
        string output = ctx.ResolvePathOrDefault("o", "out.dat");        ExampleProcessor.Run(input, output);
    }
}

👉 每个命令一个类,职责单一


五、主程序:只负责 Dispatch

class Program
{
    static readonly List<ICommand> Commands = new()
    {
        new CommandExample(),
        new CommandOther()
    };    static void Main(string[] args)
    {
        var (cmdName, options) = ArgParser.Parse(args);        var command = Commands.FirstOrDefault(c => c.Name == cmdName);
        if (command == null)
        {
            PrintHelp();
            return;
        }        var context = new CommandContext(options);
        command.Execute(context);
    }
}

主程序的特点:

  • • 不包含业务逻辑
  • • 不关心参数含义
  • • 只负责:
    • • 找到 Command
    • • 调用 Execute

六、命令行参数解析(示例)

public static class ArgParser
{
    public static (string, Dictionary<string, string>) Parse(string[] args)
    {
        string command = args[0];
        var dict = new Dictionary<string, string>();        for (int i = 1; i < args.Length - 1; i++)
        {
            if (args[i].StartsWith("-"))
                dict[args[i].TrimStart('-')] = args[++i];
        }        return (command, dict);
    }
}

示例调用:

tool.exe example -i data/input.json -o result.bin

七、路径处理:支持相对 / 绝对模式

命令行工具中,路径问题非常常见。

CommandContext

public class CommandContext
{
    public Dictionary<string, string> Args { get; }
    public string BaseDir { get; }    public CommandContext(Dictionary<string, string> args)
    {
        Args = args;
        BaseDir = args.ContainsKey("absolute")
            ? Directory.GetCurrentDirectory()
            : AppContext.BaseDirectory;
    }    public string ResolvePath(string key)
    {
        return PathResolver.Resolve(Args[key], BaseDir);
    }
}

PathResolver

public static class PathResolver
{
    public static string Resolve(string path, string baseDir)
    {
        return Path.IsPathRooted(path)
            ? path
            : Path.GetFullPath(Path.Combine(baseDir, path));
    }
}

支持:

tool.exe example -i data/a.json
tool.exe example -i data/a.json --absolute

八、用到了哪些设计模式?

✅ Command Pattern(核心)

  • • 每个命令封装一个操作
  • • 主程序通过接口统一调用

✅ Strategy Pattern(弱形式)

  • • 不同 Command = 不同执行策略
  • • 运行时选择

✅ Context Object(工程实践)

  • • 参数、路径、环境信息集中管理
  • • Command 不直接依赖全局状态

九、这种结构适合什么场景?

非常适合:

  • • 数据处理工具
  • • 验证工具
  • • Unity / OpenCV / Web 辅助工具
  • • 内部工程 CLI 工具链

甚至可以无缝接入 Unity Editor 或 CI 流水线


十、总结

通过 Command 模式重构命令行工具,可以获得:

  • • 清晰的结构
  • • 易扩展、易维护
  • • 新功能零侵入
  • • 工程级可读性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1195610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍:Django与前端框架集成:Vue.js、React的完美配合

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

告别笨重 Jenkins,试试轻量级开源 CI/CD:Arbess

日常研发过程中&#xff0c;为了提高软件构建、发布、测试效率&#xff0c;快速交付系统&#xff0c;会使用一些CI/CD工具。Jenkins作为老牌的CI/CD工具&#xff0c;拥有强大的插件体系&#xff0c;但插件安装配置复杂、插件之间各种不兼容&#xff0c;Jenkins在用户权限管控方…

2026年北京美国本科留学机构服务机构解析:美国藤校申请 /美国本科申请 /美本活动规划 /美国留学招生官/美国本科前30深度解析

根据美国国际教育协会的公开数据,2024年中国留学生人数已连续多年稳居美国国际生源首位,其中本科阶段申请竞争尤为激烈。在此背景下,超过40%的申请者选择通过专业机构提升自身竞争力。北京作为全国教育资源中心,汇…

从功能到性价比,这款国产PCB设计软件值得推荐

在当前半导体产业链加速重构的背景下,国产PCB软件的重要性日益凸显。作为电子系统研发的关键环节,自主可控的EDA工具不仅关乎设计效率,更直接影响供应链安全。面对国外长期主导的市场格局,越来越多企业开始关注真正…

Day19简单和引用数据类型

<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">&…

南通红木沙发制造工厂、南通红木餐桌椅、南通缅甸花梨家具厂、南通苏作红木家具厂、小叶紫檀家具、明式家具定制工厂、清式家具工厂选择指南

2026热门红木衣柜定制优质工厂推荐行业背景与筛选维度说明据《2026-2030中国红木家具行业发展白皮书》数据显示,国内红木定制家具市场年复合增长率达12.3%,其中卧房红木衣柜定制需求年增速突破15%,成为红木家具细分…

2026年陕西省叛逆学校推荐TOP3:圆梦育德领衔,专业赋能青少年成长

在青少年成长过程中,叛逆、网瘾、厌学等问题常让家庭陷入困境。选择一所正规专业的叛逆教育学校,成为不少家长的迫切需求。本文基于办学资质、教学经验、口碑反馈等核心维度,筛选出2026年陕西省优质叛逆学校TOP3,涵…

max-num-batched-tokens计算方法

目录1️⃣ 参数本质回顾2️⃣ 理论计算方法3️⃣ 一般范围seq计算1️⃣ KV cache 本质2️⃣ 假设参数3️⃣ 代入公式4️⃣ 面试说明点 明白,你想深入了解 --max-num-batched-tokens 的范围和计算方法,不仅是经验值,…

2026年1月钛管/钛棒/钛锻件厂家Top5推荐:实力企业精选,覆盖多场景钛材需求

随着航空航天、化工、医疗等领域对高品质钛材的需求持续攀升,钛管作为核心构件,其质量稳定性与供应可靠性成为企业选型的关键。以下结合行业口碑、技术实力、产品覆盖度等多维度,精选5家优质钛管厂家,均为行业内真…

复健刷题日记

前言 因为高中毕业了,所以要打ACM了。但是刚升入西交,所以选择先花一个学期适应新生活,于是复健的任务自然而然拖到寒假才开始。 题单大部分来自300ids blog,可能会自己加一些其他的题。 争取寒假结束能回归CF正途…

丽水市莲都青田缙云遂昌松阳区英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜推荐

经教育部教育考试院备案、全国雅思教学质量评估中心独家指导,参照《2025-2026中国大陆雅思备考趋势白皮书》核心指标,结合丽水市莲都区、青田县、缙云县、遂昌县、松阳县10600份考生调研问卷、118家教育机构实地探访…

2025年汽车托运行业口碑标杆企业,汽车托运推荐榜单技术实力与市场口碑领航者

随着汽车消费市场的持续活跃与人口流动性的增强,汽车托运服务已成为连接车主与目的地的重要桥梁。面对市场上众多的托运服务商,消费者往往难以抉择。一份基于公开市场数据、用户反馈及企业综合实力评估的榜单,或能为…

2026靠谱走心机厂家 TOP8 实力排名!台群精机蝉联头部

一、行业背景与用户核心关注维度 随着 3C 电子、新能源汽车、人形机器人、航空航天等高端制造领域的快速升级,市场对精密加工设备的需求持续爆发,走心机作为小直径精密轴类零件加工的核心设备,其性能直接决定了终端…

为什么你的MCP Server无法跨域?,3个关键配置项必须检查

第一章&#xff1a;为什么你的MCP Server无法跨域&#xff1f; 当你在开发 MCP&#xff08;Microservice Communication Protocol&#xff09;Server 时&#xff0c;可能会遇到前端请求被浏览器拦截的问题。这通常不是因为服务端逻辑错误&#xff0c;而是由于浏览器的同源策略阻…

不止于存储,更在于洞察:2026年值得关注的AI知识库+智能BI一体化私有部署解决方案提供商

在数字化转型加速的2026年,越来越多企业意识到:知识是核心资产,但若缺乏系统化管理,反而会成为负担。面对知识分散、信息孤岛、数据安全风险以及通用大模型“幻觉”频发等问题,企业亟需专业、安全、高效的知识库搭…

多协议可编程USB接口适配器USB2S,全面支持UART/I2C/SPI/CAN/1-Wire

多协议可编程USB接口适配器USB2S,全面支持UART/I2C/SPI/CAN/1-WireUSB2S(USB To Serial ports)是一款多功能可编程接口适配器,支持UART、I2C、SMBus、SPI、CAN、1-Wire等多种串行协议。它允许用户通过嵌入式编程自…

【Java基础】重写equals方法详讲,零基础入门到精通,收藏这篇就够了

一、重写equals方法 【Java比较学习】重写equals方法的安全写法 1、重写equals方法的两种方式 这里提供两个比较常见的equals重写方法&#xff1a; ● 用instanceof实现重写equals方法 ● 用getClass实现重写equals方法 先说结论&#xff0c;getClass()比instanceof更安全。…

2026年1月陕西省青少年戒网瘾学校推荐:三大头部机构专业解析

在数字化浪潮席卷的当下,青少年网络成瘾、行为叛逆等问题持续引发社会关注。陕西省作为教育大省,涌现出一批专业青少年教育机构,为家庭提供科学解决方案。本文基于陕西省教育部门公开数据及各校官方资料,从品牌实力…

QBrush之材质画刷(Qt::BrushStyle::TexturePattern)

1 void Widget::paintEvent(QPaintEvent *event)2 {3 Q_UNUSED(event);4 5 QPainter painter(this);6 7 painter.fillRect(this->rect(),QBrush(QColor(255,255,255)));8 painter.setRenderHint(QP…

飞书审批表单动态渲染 + Dify LLM意图识别 = 全自动审批路由(已落地金融客户,RPA替代率提升63%)

第一章&#xff1a;飞书审批流自动化落地的业务价值与技术全景 飞书审批流自动化作为企业数字化转型的核心环节&#xff0c;正在重塑组织内部协作与流程管理的方式。通过将传统人工驱动的审批流程转化为系统自动触发、条件判断与节点流转的机制&#xff0c;企业不仅提升了运营效…