【问题标题】:Best and common practices for config dependent behaviours配置依赖行为的最佳和常见实践
【发布时间】:2018-08-13 20:31:39
【问题描述】:

我正在处理一个大型工业规模的系统。它有数百种配置设置,具有多种重叠组合。

例如。方法:发送消息(消息对象) 设置:MessageType (1,2,3,4)

消息类型改变了 sendMessage 的行为: 我经常遇到这样的代码:

sendMessage(MessageObject)
{
  switch(messageType)
  case 1: code for Behaviour1
  case 2: code for Behaviour1 + some other behavior
  case 3: code for Behaviour3
  case 4: code for case 2 + some other behaviour
  ...
}

所以当我清理它时,我这样做了。

sendMessage(MessageObject)
{
  switch(messageType)
  case 1: sendMessageType1();
  case 2: sendMessageType2();
  case 3: sendMessageType3();
  case 4: sendMessageType4();
  ...
}

这是我试图解耦代码并使其可维护的尝试。这也意味着重复、冗余,并且对于每个新设置,都应该声明一个新方法。

这是一种可接受的方法吗?实现这些设置的最佳方法是什么?有没有解决这个问题的软件架构或设计模式?

【问题讨论】:

    标签: design-patterns configuration architecture settings


    【解决方案1】:

    您可以通过以下方法避免使用switch 语句,这似乎过于工程化。

    public interface IMessageSender
    {
        int MessageType { get; }
    
        void Send();
    }
    
    public class TypeOneMessageSender : IMessageSender
    {
        public int MessageType => 1;
        public void Send()
        {
            //logic here for sending 1 type of message
        }
    }
    
    public class TypeTwoMessageSender : IMessageSender
    {
        public int MessageType => 2;
        public void Send()
        {
            //logic here for sending 2 type of message
        }
    }
    
    public class MessageSender
    {
        private readonly IReadOnlyList<IMessageSender> _senders;
    
        /*inject IReadOnlyList<IMessageSender> with DI*/
        public MessageSender(IReadOnlyList<IMessageSender> senders)
        {
            _senders = senders;
        }
    
        public void Send(int messageType)
        {
            var sender = _senders.FirstOrDefault(it => it.MessageType == messageType);
            if(sender == null)
                throw new InvalidOperationException($"Unable to send message of type {messageType}")  ;
            sender.Send();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-10
      • 2011-06-11
      • 2010-12-11
      • 2012-10-09
      • 2011-10-15
      • 1970-01-01
      • 2015-07-29
      相关资源
      最近更新 更多