配置相关行为的最佳和常见做法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了配置相关行为的最佳和常见做法相关的知识,希望对你有一定的参考价值。
我正在处理一个大型的工业规模系统。它有数百个具有多个重叠组合的配置设置。
恩。方法: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();
...
}
这是我尝试解耦代码并使其可维护。这也意味着重复,冗余,并且对于每个新设置,都应该声明一种新方法。
这是一种可接受的方法吗?实施这些设置的最佳方法是什么?是否有像解决这个问题的软件架构或设计模式?
答案
您可以避免使用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();
}
}
以上是关于配置相关行为的最佳和常见做法的主要内容,如果未能解决你的问题,请参考以下文章