Stavo passando per il vecchio codice e ho notato uno schema che si ripete dappertutto - invio dinamico.
Anche se non vedo alcun problema con l'implementazione stessa, mi chiedevo se ci sono altri modi per gestire la spedizione dinamica.
Per fare un esempio - considera uno scenario in cui in fase di esecuzione vado a ricevere un messaggio - Cliente o Visitatore ed esegui alcune operazioni in base al tipo del messaggio. Per brevità, diciamo che tutto ciò che dobbiamo fare è stampare un tipo di messaggio corrispondente.
Quindi, passare dalle parole al codice
public abstract class Message
{
public abstract string Id {get;}
}
public class Customer: Message
{
public override string Id {get {return "Customer";}}
}
public class Visitor: Message
{
public override string Id {get {return "Visitor";}}
}
E gestione parte
public interface IHandleMessage
{
bool CanHandle(Message message);
void Handle(Message message);
}
public class CustomerHandler: IHandleMessage
{
public bool CanHandle(Message message)
{
return message.Id == "Customer";
}
public void Handle(Message message) {Console.WriteLine(message.Id);}
}
public class VisitorHandler: IHandleMessage
{
public bool CanHandle(Message message)
{
return message.Id == "Visitor";
}
public void Handle(Message message) {Console.WriteLine(message.Id);}
}
public class MessageHandlersFactory
{
private static readonly IEnumerable<IHandleMessage> _messageHandlers =
new List<IHandleMessage> {new CustomerHandler(), new VisitorHandler()};
public static IHandleMessage GetHandlerForMessage(Message message)
{
return _messageHandlers.FirstOrDefault(h => h.CanHandle(message));
}
}
E il codice cliente è simile a questo
public class Program
{
public static void Main(Message message)
{
IHandleMessage handler = MessageHandlersFactory.GetHandlerForMessage(message);
handler.Handle(message)
}
}
Ora come ho detto, non mi interessa questa implementazione, quello che davvero non mi piace è che questo schema si ripete dappertutto, il che mi fa pensare se questo non è un uso eccessivo di dispatch dinamico.
Generalizzare: ovunque sia necessario prendere una decisione in base al messaggio / dati / argomento in entrata, ho più o meno la stessa implementazione che ho fornito sopra.
Quindi la mia domanda è - dato l'esempio sopra ci sono altri modi per gestire questo tipo di scenari? O questo è il modo consigliato e accettato di gestire la spedizione dinamica?