根据位置与部门实现自动化安装配置:替代Switch/Case+If的优化方案?
优化位置-部门配置的代码结构方案
你当前用嵌套Switch/Case+If的方式处理不同位置和部门的安装配置,确实会导致代码臃肿、维护困难。以下是几种更优的实现方案:
方案一:字典映射+委托(最简洁的硬编码方案)
核心思路是把「位置+部门」的组合作为键,对应的操作逻辑作为值存入字典。调用时直接通过键查找并执行逻辑,彻底消除嵌套判断。
实现步骤:
- 先把重复的操作抽成独立方法:
private void DoStuff1() { /* 实现具体逻辑 */ } private void DoStuff2() { /* 实现具体逻辑 */ } private void DoStuff3() { /* 实现具体逻辑 */ }
- 在类初始化时构建配置字典:
private readonly Dictionary<(string Location, string Sector), Action> _configActions; public YourClassName() { _configActions = new Dictionary<(string, string), Action> { // 位置10的各部门配置 { ("10", "CS"), () => { DoStuff1(); DoStuff2(); } }, { ("10", "BO"), () => { DoStuff1(); DoStuff2(); } }, { ("10", "RR"), () => { DoStuff1(); DoStuff2(); } }, { ("10", "RC"), () => { DoStuff1(); DoStuff2(); } }, // 位置20的各部门配置 { ("20", "CS"), () => { DoStuff1(); DoStuff2(); } }, { ("20", "BO"), () => { DoStuff1(); DoStuff2(); } }, { ("20", "RE"), () => { DoStuff1(); DoStuff2(); DoStuff3(); } }, { ("20", "RC"), () => { DoStuff1(); DoStuff2(); } }, // 位置21的各部门配置 { ("21", "CS"), () => { DoStuff1(); } }, { ("21", "BO"), () => { DoStuff1(); } }, { ("21", "RE"), () => { DoStuff1(); DoStuff2(); } }, { ("21", "RX"), () => { DoStuff1(); DoStuff2(); } } }; }
- 简化后的Install方法:
public void Install(string l, string s) { if (_configActions.TryGetValue((l, s), out var action)) { action.Invoke(); } else { // 处理未匹配到的情况,比如抛出异常或执行默认操作 throw new InvalidOperationException($"未找到位置{l}、部门{s}对应的配置操作"); } }
方案二:策略模式(适合复杂逻辑场景)
如果每个「位置+部门」的操作逻辑非常复杂,拆分到独立类中更符合单一职责原则,也便于单独测试和维护。
实现步骤:
- 定义策略接口:
public interface IInstallationStrategy { void Execute(); }
- 为不同组合实现策略类:
public class Location10CSBOInstallStrategy : IInstallationStrategy { public void Execute() { DoStuff1(); DoStuff2(); } } public class Location20REInstallStrategy : IInstallationStrategy { public void Execute() { DoStuff1(); DoStuff2(); DoStuff3(); } } // 其他组合的策略类以此类推...
- 用字典映射策略实例:
private readonly Dictionary<(string Location, string Sector), IInstallationStrategy> _strategies; public YourClassName() { _strategies = new Dictionary<(string, string), IInstallationStrategy> { { ("10", "CS"), new Location10CSBOInstallStrategy() }, { ("10", "BO"), new Location10CSBOInstallStrategy() }, { ("20", "RE"), new Location20REInstallStrategy() }, // ... 其他组合 }; }
- 调用逻辑:
public void Install(string l, string s) { if (_strategies.TryGetValue((l, s), out var strategy)) { strategy.Execute(); } else { // 处理未匹配情况 } }
方案三:配置表驱动(无需改代码即可调整配置)
如果配置需要频繁变更,或者要支持多环境切换,可以把「位置+部门+操作」的映射关系存入JSON/XML等配置文件,运行时解析执行。
示例JSON配置:
{ "InstallationConfigs": [ { "Location": "10", "Sectors": ["CS", "BO", "RR", "RC"], "Actions": ["Stuff1", "Stuff2"] }, { "Location": "20", "Sectors": ["CS", "BO", "RC"], "Actions": ["Stuff1", "Stuff2"] }, { "Location": "20", "Sectors": ["RE"], "Actions": ["Stuff1", "Stuff2", "Stuff3"] }, { "Location": "21", "Sectors": ["CS", "BO"], "Actions": ["Stuff1"] }, { "Location": "21", "Sectors": ["RE", "RX"], "Actions": ["Stuff1", "Stuff2"] } ] }
解析执行思路:
- 读取配置文件并反序列化为实体类
- 预存操作方法的映射字典(比如
Dictionary<string, Action> _actionMap) - 根据输入的位置和部门,找到对应的Actions列表,遍历执行
内容的提问来源于stack exchange,提问作者Raphael Aracelli
相关产品推荐
相关产品推荐

