lunes, 15 de abril de 2019

Switch, factoría, tester/doer

Ejemplo de como quitar un switch y sustituirlo por una factoria:

public void ProcessCustomer(CustomerMessage message)
{
  switch (message.CustomerCategory)
  {
    case Category.Gold:
      ProcessGoldCustomer(message);
      break;
    case Category.Silver:
      ProcessSilverCustomer(message);
      break;
    case Category.Bronze:
      ProcessBronzeCustomer(message);
      break;
  }
}
 
Ejemplo con factoría:
 
public interface ICustomerProcessor
{
  void Process(CustomerMessage message);
}
 
public class GoldCustomerProcessor : ICustomerProcessor {...}
public class SilverCustomerProcessor : ICustomerProcessor {...}
public class BronzeCustomerProcessor : ICustomerProcessor {...}
 
public class CustomerProcessorFactory
{
  public ICustomerProcessor Create(Category category) {
    switch (category) {   
      case Category.Gold: 
        return new GoldCustomerProcessor();
    }
    ...
  }
}
 
public void ProcessCustomer(CustomerMessage message)
{
  var factory = new CustomerProcessorFactory();
  var processor = factory.Create(message.CustomerCategory);
  processor.Process(message);
}
 
Ejemplo patrón Tester/Doer:
 
public interface ICustomerProcessor
{
  bool CanProcess(CustomerMessage message);
  void Process(CustomerMessage message);
}
 
public class GoldCustomerProcessor : ICustomerProcessor
{
  public bool CanProcess(CustomerMessage message)
  {
    return message.CustomerCategory == Category.Gold;
  }
   
  public void Process(CustomerMessage message) {...}
}
 
public class SilverCustomerProcessor : ICustomerProcessor {...}
public class BronzeCustomerProcessor : ICustomerProcessor {...}
 
public void ProcessCustomer(CustomerMessage message)
{
  var processor = this.processors.Single(x => x.CanProcess(message));
  processor.Process(message);
}