Domanda

Ecco un semplice metodo di manipolazione del grafico che ho decorato con contratti di codice.

L'affermazione non si dimostrerà, ma non riesco a capire perché! Credo che sostenga che dopo aver chiamato Rimuove (), o il bordo non è più nell'elenco dei bordi o il risultato è falso. Non rivendica nulla sullo stato del grafico se il risultato è vero. Al controllo statico non piace e non ho ottenuto PEX per dirmi come (anche se probabilmente non so come usarlo).

Il blocco è estraneo per questo esempio, credo, ma lo lascerò per ogni evenienza. Inoltre, il delegato di OnRemoveEdge non ha garanzie, ma per ora assumerò implicitamente che non sia rientrante nel codice grafico. Inoltre, il presupposto è dopo di esso.

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;
}

AGGIORNAMENTO: ho cambiato il codice per spostare il gestore di eventi, onRemoveEdge (), (ma non il delegato, OnBeForeMoveEdge) fuori dal blocco. Ma poi, cosa fa questo per l'assunzione del contratto relativo ai thread? I contratti di codice assumono un modello a thread singolo? Hmmm.

È stato utile?

Soluzione

Da La risposta di Jack Leitch a una domanda simile:

Il Contratti di codice Manuale utente afferma che "il controllo del contratto statico non si occupa ancora di quantificatori per tutti o esiste".

VERO. VERO.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top