Los siguientes ejemplos de código proporcionan contexto a mi pregunta.
La clase Room se inicializa con un delegado. En la primera implementación de la clase Room, no hay guardias contra los delegados que arrojan excepciones. Dichas excepciones aparecerán en la propiedad Norte, donde se evalúa al delegado (nota: el método Main () demuestra cómo se usa una instancia de Room en el código del cliente):
public sealed class Room
{
private readonly Func<Room> north;
public Room(Func<Room> north)
{
this.north = north;
}
public Room North
{
get
{
return this.north();
}
}
public static void Main(string[] args)
{
Func<Room> evilDelegate = () => { throw new Exception(); };
var kitchen = new Room(north: evilDelegate);
var room = kitchen.North; //<----this will throw
}
}
Siendo que prefiero fallar en la creación de objetos en lugar de leer la propiedad North, cambio el constructor a privado e introduzco un método de fábrica estático llamado Create (). Este método detecta la excepción lanzada por el delegado y genera una excepción de contenedor, que tiene un mensaje de excepción significativo:
public sealed class Room
{
private readonly Func<Room> north;
private Room(Func<Room> north)
{
this.north = north;
}
public Room North
{
get
{
return this.north();
}
}
public static Room Create(Func<Room> north)
{
try
{
north?.Invoke();
}
catch (Exception e)
{
throw new Exception(
message: "Initialized with an evil delegate!", innerException: e);
}
return new Room(north);
}
public static void Main(string[] args)
{
Func<Room> evilDelegate = () => { throw new Exception(); };
var kitchen = Room.Create(north: evilDelegate); //<----this will throw
var room = kitchen.North;
}
}
¿El bloque try-catch hace que el método Create () sea impuro?
Create
también es impuro, porque lo llama.
Create
función no lo protege de obtener una excepción al obtener la propiedad. Si su delegado lanza, en la vida real es muy probable que lo haga solo bajo ciertas condiciones. Lo más probable es que las condiciones para el lanzamiento no estén presentes durante la construcción, pero están presentes al obtener la propiedad.