配置相关行为的最佳和常见做法

问题描述 投票:0回答:1

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

恩。方法:SendMessage(MessageObject)设置: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个回答
0
投票

您可以避免使用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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.