En caso de que los contratos de código de electricidad estática poder comprobar la aritmética obligado?
-
12-09-2019 - |
Pregunta
(también rel="noreferrer"> -. pero eso no es mucho tráfico, por lo que yo puedo ver)
He estado tratando de proporcionar un ejemplo de Assert
y Assume
. Aquí está el código que tengo:
public static int RollDice(Random rng)
{
Contract.Ensures(Contract.Result<int>() >= 2 &&
Contract.Result<int>() <= 12);
if (rng == null)
{
rng = new Random();
}
Contract.Assert(rng != null);
int firstRoll = rng.Next(1, 7);
Contract.Assume(firstRoll >= 1 && firstRoll <= 6);
int secondRoll = rng.Next(1, 7);
Contract.Assume(secondRoll >= 1 && secondRoll <= 6);
return firstRoll + secondRoll;
}
(El negocio de ser capaz de pasar en una referencia nula en lugar de una referencia Random
existente es puramente pedagógica, por supuesto.)
Yo esperaba que si el corrector sabía que firstRoll
y secondRoll
estaban cada uno en el rango [1, 6]
, sería capaz de trabajar que la suma estaba en el rango [2, 12]
.
¿Es esta una esperanza razonable? Me doy cuenta de que es un negocio difícil, trabajando exactamente lo que podría suceder ... pero yo estaba esperando el corrector sería lo suficientemente inteligente como:)
Si esto no es apoyado ahora, ¿alguien aquí sabe si es probable que sea apoyado en un futuro próximo-ish?
EDIT: Ahora he encontrado que hay opciones muy complicados para la aritmética en el de electricidad estática. Mediante el cuadro de texto "avanzado" que puede tratar a cabo desde Visual Studio, pero no hay ninguna explicación decente de lo que hacen, por lo que yo puedo decir.
Solución
He tenido una respuesta en el foro de MSDN. Resulta que yo estaba muy cerca de allí. Básicamente, el de electricidad estática funciona mejor si se divide fuera "y de opinión" contratos. Por lo tanto, si cambiamos el código para esto:
public static int RollDice(Random rng)
{
Contract.Ensures(Contract.Result<int>() >= 2);
Contract.Ensures(Contract.Result<int>() <= 12);
if (rng == null)
{
rng = new Random();
}
Contract.Assert(rng != null);
int firstRoll = rng.Next(1, 7);
Contract.Assume(firstRoll >= 1);
Contract.Assume(firstRoll <= 6);
int secondRoll = rng.Next(1, 7);
Contract.Assume(secondRoll >= 1);
Contract.Assume(secondRoll <= 6);
return firstRoll + secondRoll;
}
que funciona sin ningún problema. También significa que el ejemplo es aún más útil, ya que pone de relieve el mismo punto que el corrector hace trabajo mejor con contratos separados hacia fuera.
Otros consejos
No sé acerca de la MS Contratos herramienta Comprobador, pero el análisis gama es una técnica de análisis estático estándar; que es ampliamente utilizado en herramientas de análisis estático comerciales para verificar que las expresiones subíndice son legales.
Investigación MS tiene un buen historial en este tipo de análisis estático, por lo que yo esperaría de hacer este tipo de análisis gama a ser un objetivo de los contratos del inspector, aunque actualmente no marcada.