【问题标题】:Perform Command For List of commands without using IF Statement C#在不使用 IF 语句 C# 的情况下执行命令列表的命令
【发布时间】:2015-05-07 15:03:44
【问题描述】:

我有一个TcpListener 监听一个NetworkStream 来执行一个命令示例。 “复制、移动、删除……”

switch(command)
{
   case "copy":
   // do copy
   break;
   case "delete":
   // do delete
   break;
   case "move":
   // do move
   break;
   .......................................
}

我已经使用 switch - caseif 语句实现了它,但是在维护或添加新命令时,特别是当命令列表超过 100 个命令时,它变得非常困难和乏味,那么有没有办法有效地做到这一点,我已经尝试在 Google 上进行搜索,但我似乎无法正确理解它的术语
任何帮助:) Yaser

【问题讨论】:

  • 您是否考虑过使用字典
  • @ZoharPeled 你能详细说明一下还是给我一个例子
  • @GrantWinney 我已经创建了分离的方法,但我想要一种更有效的方法,比if else更专业的方法@

标签: c# .net command


【解决方案1】:

您正在寻找Command Pattern。您必须创建一个接口 ICommand 并为每个命令实现一个接口。

例如:CopyCommandDeleteCommandMoveCommand

然后你需要一个factory method,它根据提供的字符串创建各个ICommand 的实例。

最后你会打电话给ICommand.Execute。这使得它具有可读性、可维护性、清洁性等等......

你的代码会变成

ICommand command = commandFactory.Create(commandString);
command.Execute();

其中commandFactory 是“工厂”的一个实例,它将创建适当的ICommand 的实例。

如果您愿意,可以使用一个巨大的开关盒或Dictionary<string, Func<ICommand>> 来实现您的工厂类。

【讨论】:

    【解决方案2】:

    正如@Zohar Peled 已经提到的那样,字典对于这个问题来说是一个非常便宜的解决方案,不是那么优雅,但真的很便宜:

            //Initialize command lists
            Dictionary<string, Action> commands = new Dictionary<string, Action>();
    
            commands.Add("move", DoMyMove);
            commands.Add("add", ()=> Console.WriteLine(""));
            commands.Add("remove", DoMyRemove);
            commands.Add("close", DoMyClose);
    

    委托

            private void DoMyMove()
            {
                 // TODO
            }
    

    用法:

            commands[command].Invoke();
    

    basic 开发人员可以轻松、清晰地扩展它...

    【讨论】:

    • 我给你 -1 是因为窃取了我的想法 :-) ,但 +1 是为了编写代码示例,另一个 +1 是为了在应得的情况下给予信用。 :-)
    • 你温柔又害羞... :(
    【解决方案3】:

    一种选择是在类级别定义一个Dictionary&lt;string,action&gt;,它将保存命令的名称和需要执行的实际方法的操作委托。然后在您的 main 方法中,您不需要使用开关,只需使用字典的 TryGetValue Method 从字典中获取 action 委托,如果它返回 true,只需调用操作委托。

    【讨论】:

      猜你喜欢
      • 2016-07-10
      • 2015-04-22
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多