Frage

(auch posted on das Forum MSDN -. aber das bedeutet nicht viel Verkehr erhalten, soweit ich sehen kann)

Ich habe versucht, ein Beispiel für Assert und Assume bereitzustellen. Hier ist der Code, den ich habe:

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

(Das Geschäft über die Möglichkeit, in einer Null-Referenz zu übergeben, anstatt eine bestehende Random Referenz rein pädagogisches, natürlich.)

Ich hatte gehofft, dass, wenn der Prüfer, dass firstRoll kennt und secondRoll waren jeweils im Bereich [1, 6], wäre es in der Lage sein zu arbeiten, dass die Summe im Bereich [2, 12] war.

Ist das eine unzumutbare Hoffnung? Ich weiß, es ist eine heikle Angelegenheit, genau ausarbeitet, was passieren könnte ... aber ich hatte gehofft, dass der Kontrolleur intelligent genug sein würde:)

Wenn dies jetzt nicht unterstützt wird, weiß jemand hier, wenn es wahrscheinlich in der nahen Zukunft ish unterstützt werden?

EDIT: Ich habe jetzt festgestellt, dass es für die Arithmetik in dem statischen checker sehr komplizierte Optionen. das „Erweitert“ im Textfeld kann ich sie von Visual Studio ausprobieren, aber es gibt keine anständige Erklärung das, was sie tun, soweit ich das beurteilen kann.

War es hilfreich?

Lösung

Ich habe eine Antwort auf dem MSDN-Forum hat. Es stellt sich heraus, dass ich fast da war. Grundsätzlich ist die statischen Checker funktionieren besser, wenn Sie spalten out „und-ed“ Verträge. Also, wenn wir den Code dies zu ändern:

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

Das funktioniert ohne Probleme. Es bedeutet auch, das Beispiel ist noch nützlicher, da sie den sehr Punkt heben hervor, dass der Kontrolleur hat Arbeit besser mit ausgesondert Verträgen.

Andere Tipps

Ich weiß nicht, über die MS-Kontrakte Checker-Tool, sondern Bereichsanalyse ist eine Standard-statische Analysetechnik; es ist weit verbreitet in kommerziellen statischen Analysetool verwendet, um sicherzustellen, dass der Index Ausdrücke legal ist.

MS-Forschung hat einen guten Track Record bei dieser Art der statischen Analyse, und so würde ich erwarten, dass ein solcher Bereich Analyse tun ein Ziel der Verträge Checker zu sein, auch wenn derzeit nicht geprüft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top