C#: Contratos de código vs. validación de parámetros normales
.net .net-4.0 (1)
Para deshacerse de las advertencias, puede usar Contract.Assume
considere las siguientes dos piezas de código:
public static Time Parse(string value)
{
string regXExpres =
"^([0-9]|[0-1][0-9]|2[0-3]):([0-9]|[0-5][0-9])$|^24:(0|00)$";
Contract.Requires(value != null);
Contract.Requires(new Regex(regXExpres).IsMatch(value));
string[] tokens = value.Split('':'');
int hour = Convert.ToInt32(tokens[0], CultureInfo.InvariantCulture);
int minute = Convert.ToInt32(tokens[1], CultureInfo.InvariantCulture);
return new Time(hour, minute);
}
y
public static Time Parse(string value)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
string[] tokens = value.Split('':'');
if (tokens.Length != 2)
{
throw new FormatException("value must be h:m");
}
int hour = Convert.ToInt32(tokens[0], CultureInfo.InvariantCulture);
if (!(0 <= hour && hour <= 24))
{
throw new FormatException("hour must be between 0 and 24");
}
int minute = Convert.ToInt32(tokens[1], CultureInfo.InvariantCulture);
if (!(0 <= minute && minute <= 59))
{
throw new FormatException("minute must be between 0 and 59");
}
return new Time(hour, minute);
}
Personalmente prefiero la primera versión porque el código es mucho más claro y más pequeño, y los contratos se pueden desactivar fácilmente. Pero la desventaja es que Visual Studio Code Analysis culpa de que debería verificar el valor del parámetro para null y los contratos del constructor no se dan cuenta de que la expresión regular asegura que el minuto y la hora están dentro de los límites establecidos.
Así que termino teniendo muchas advertencias erróneas y no veo ninguna forma de validar valores de cadena con contratos sin terminar arrojando FormatExceptions que no sea una validación de RegEx.
¿Alguna sugerencia de cómo resolvería esto y situaciones equivalentes utilizando los contratos del Código?