【问题标题】:Patterns and coding style to avoid using Switch statements in coding [duplicate]避免在编码中使用 Switch 语句的模式和编码风格[重复]
【发布时间】:2016-05-12 03:44:12
【问题描述】:

考虑下面的代码。我想根据bindingtype 创建一个service。我已经为它创建了一个switch 案例,但我对这种方法不满意,我想避免 switch 声明以实现未来的可扩展性。请提出更好的模式或设计来做到这一点。

   public static object CreateBinding(string binding, object service)
   {
       switch (binding)
       {
           case "ServiceA":
               ChannelFactory<IServiceA> ServiceFactoryA = new ChannelFactory<IServiceA> (binding);
               service = ServiceFactoryA.CreateChannel();
               break;

           case "ServiceB":
               ChannelFactory<IServiceB> ServiceFactoryB = new ChannelFactory<IServiceB> (binding);
               service = ServiceFactoryB.CreateChannel();
               break;

           default:
               ChannelFactory<IServiceC> ServiceFactoryC = new ChannelFactory<IServiceC> (binding);
               service = ServiceFactoryC.CreateChannel();
               break;
       }

       OpenChannel(service);

       return service;
   }

【问题讨论】:

  • 有很多关于重构switch语句的问题/文章。展示你已经尝试过的东西是个好主意。确实很高兴为您的案例获得量身定制的代码,但这并不是 SO 的真正目标。
  • 这是一个有据可查的重构模式的常见问题:refactoring.com/catalog/replaceConditionalWithPolymorphism.html

标签: c# design-patterns coding-style


【解决方案1】:

对我来说删除switch 语句最明显的方法是使用Dictionary

方法如下:

private static Dictionary<string, Func<string, object>> _bindingFactory = new Dictionary<string, Func<string, object>>()
{
    { "ServiceA", binding => new ChannelFactory<IServiceA>(binding).CreateChannel() },
    { "ServiceB", binding => new ChannelFactory<IServiceB>(binding).CreateChannel() },
    { "", binding => new ChannelFactory<IServiceC>(binding).CreateChannel() },
};

public static object CreateBinding(string binding, object service)
{
    service = _bindingFactory[_bindingFactory.ContainsKey(binding) ? binding : ""](binding);
    OpenChannel(service);
    return service;
}

您将object service 作为CreateBinding 的参数有点奇怪,但我保持原样。

现在您完全可以在运行时更改 _bindingFactory 以产生您喜欢的任何类型的可扩展性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多