Introduce Null Object
- Problema: Verificaciones repetidas de null.
- Solución: Crear un objeto "nulo" que implemente la misma interfaz.
- Code Smells que resuelve: Comprobaciones Repetidas de Null, Envidia de Características
public void ProcessCustomer(Customer customer)
{
if (customer != null)
{
string name = customer.Name;
if (name != null)
{
Console.WriteLine("Processing customer: " + name);
}
else
{
Console.WriteLine("Processing unnamed customer");
}
if (customer.HasDiscount())
{
ApplyDiscount(customer);
}
}
else
{
Console.WriteLine("No customer to process");
}
}
public interface ICustomer
{
string Name { get; }
bool HasDiscount();
void ApplyDiscount(double amount);
}
public class Customer : ICustomer
{
public string Name { get; set; }
public bool HasDiscount()
{
// Implementación real
}
public void ApplyDiscount(double amount)
{
// Implementación real
}
}
public class NullCustomer : ICustomer
{
public string Name => "Guest";
public bool HasDiscount()
{
return false;
}
public void ApplyDiscount(double amount)
{
// No hace nada
}
}
// Uso:
public void ProcessCustomer(ICustomer customer)
{
// No se necesita verificar null
Console.WriteLine("Processing customer: " + customer.Name);
if (customer.HasDiscount())
{
ApplyDiscount(customer);
}
}
// Al llamar:
ICustomer customer = GetCustomer() ?? new NullCustomer();
ProcessCustomer(customer);