C#: validación de argumentos: cadenas nulas/vacías
string argument-validation (3)
No sé cuántas veces he tenido que escribir código para validar argumentos de cadena:
public RoomName(string name)
{
if (string.IsNullOrEmpty(name))
{
throw new ArgumentException("Cannot be empty", "name");
}
}
¿Hay alguna manera de evitar esto? ¿Hay algún atributo o mecanismo de diseño por contrato para evitar esto? ¿No hay manera de decir:
public RoomName(NotNullOrEmptyString name)
{
¿Sin tener que crear realmente ese tipo?
Aunque la pregunta ha sido respondida hace un tiempo, últimamente he estado pensando en el mismo problema. Los contratos de código formalizados (con verificación automática o verificaciones) parecen ser una buena idea, pero en general, su capacidad de verificación es bastante limitada, y para verificaciones simples como la verificación de cadenas vacías o nulas, requieren tanto código (o más) ) que los cheques pasados de moda.
Irónicamente, la mejor respuesta en mi opinión para el caso de cadena es, de hecho, una o dos clases que envuelven una cadena que se ha comprobado para que no sea nula, esté vacía o en blanco, y pase esta instancia:
public class NonEmptyString : IComparable<NonEmptyString>, ...
{
private readonly string _value;
public NonEmptyString(string value)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
if (value.Length == 0)
{
throw NewStringIsEmptyException("value");
}
_value = value;
}
public string Value
{
get { return _value; }
}
...
}
public class NonWhiteSpaceString : NonEmptyString
{
....
}
Claro, pasar por alto estos casos no te impide tener que comprobar si son nulos, pero tiene algunas grandes ventajas:
- No tiene que verificar las cadenas vacías o de espacios en blanco una y otra vez, lo que puede ser propenso a errores en situaciones en las que la cadena se transmite mucho.
- Como lo he hecho en mi implementación, la comprobación de nulos es algo diferente a la comprobación de un valor vacío (o valor de espacio en blanco), porque desea lanzar una excepción ArgumentNullException específica en el primer caso, y alguna ArgumentException en el segundo.
- Señala claramente la restricción en el valor de la cadena, al igual que se supone que debe hacer cualquier clase de ajuste. De hecho, si tiene una cadena que tiene restricciones y se la pasa mucho, siempre recomiendo envolverla en una clase que encapsule el cheque y mantenga el resto del código fuera de problemas. Un buen ejemplo de esto son las cadenas que deben satisfacer una cierta expresión regular. Sin embargo, me estoy desviando de la pregunta aquí ...
Puedes hacerlo a través de la inyección de código con atributos.
Otra opción para ahorrar algo de tiempo de codificación, pero que aún te dé mucho control, sería usar algo como CuttingEdge.Conditions . Esto proporciona una interfaz fluida para la verificación de argumentos, por lo que puede escribir:
name.Requires().IsNotNull();
Vea también C #: Cómo implementar y usar un atributo NotNull y CanBeNull para obtener más información sobre los contratos de código, cómo se pueden implementar hoy en día en VS2008 y cómo se integrarán en VS2010.