On Friday, 5 February 2016 at 08:45:00 UTC, Minas Mina wrote:
Use assertions when a variable's value should not depend on external factors.
For example, let's say you want to write a square root function.
The input must be >= 0, and because this depends on external factors (e.g. user input), you must check it with `enforce()`.

Or alternatively, you could place the responsibility of ensuring that precondition on the caller, in which case you'd use assert().

The output of the function must should always be >= 0 as well, but this does not depend on any external factor, so use assert for it (a negative square root is a program bug).

auto sqrt(float val)
{
    enfore(val >= 0f);

    float result = ...
    assert(result >= 0f);
    return result;
}

For assert()s about values coming from the caller or returned to it, you can use contracts, to make it clear that you're not only checking an internal invariant of your function:

auto sqrt(float val)
in {
    assert(val >= 0);
}
out(result) {
    if(val == 0)
        assert(result == 0);
    assert(result >= 0);
}
body {
    // use assert()s in the body only for implementation
    // details of your algorithm
    ...
}

Reply via email to