Saltar al contenido principal

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);