Pregunta

Aquí hay un método simple de manipulación de gráficos que he decorado con contratos de código.

¡La reclamación asegura que no lo probará, pero no puedo ver por qué! Creo que afirma que después de llamar a Remove (), el borde ya no está en la lista de bordes o el resultado es falso. No afirma nada sobre el estado del gráfico si el resultado es cierto. A la verificación estática no le gusta y no he conseguido que PEX me diga cómo (aunque probablemente no sé cómo usarlo).

La cerradura es extraña para este ejemplo, creo, pero lo dejaré por si acaso. Además, el delegado de OnremoveEdge no tiene garantías, pero asumiré implícitamente por ahora que no es reentrante en el código gráfico. Además, la suposición lo detiene.

public bool Remove(E edge)
{
  Contract.Requires(edge != null);
  Contract.Ensures(!Contract.Exists(edges, e => e == edge) || !Contract.Result<bool>());

  lock (sync)
  {
    if (!OnBeforeRemoveEdge(edge)) return false;

    if (!edges.Remove(edge)) return false;
  }

  OnRemoveEdge(edge);

  Contract.Assume(!Contract.Exists(edges, e => e == edge));

  return true;
}

ACTUALIZACIÓN: Cambié el código para mover el controlador de eventos, onremoveEdge (), (pero no el delegado, onborereMoveEdge) fuera del bloqueo. Pero entonces, ¿qué hace esto para la suposición del contrato relacionada con los hilos? ¿Los contratos de código suponen un modelo único? Mmm.

¿Fue útil?

Solución

De La respuesta de Jack Leitch a una pregunta similar:

los Manual de usuario de contratos de código afirma: "El verificador de contratos estáticos aún no se ocupa de cuantificadores para todos o existe".

Verdadero. verdadero.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top