[plt-scheme] contracts.ss: Can you disable them at runtime?
Joe Marshall wrote:
> These tests were *amazingly* useful to us, but our customers loved
> them as well. They would run these self-tests before submitting bug
> reports and send the output along with the bug report (anyone who
> fields customer support complaints will tell you how wonderful *that*
> is!) We had logging diagnostics that were intended to be `turned off'
> at the customer site. We never turned those off, either.
>
> If you have tests, assertions, and contracts that you `turn off' when
> shipping, then the code the customer gets is *not* the same as the
> code you use in-house. It may be your intention that it be, but you
> probably intended to ship bug-free software, too. In a complex
> system, you should ship *exactly* the same bits to your customer as
> you use in-house.
I agree that this is a good model to aspire to. But there are also
cases where, during development, you want to ensure that some condition
holds that isn't practical to test during every run of the live system.
If a mechanism that could be used to express such a condition doesn't
support being turned off, you can either not check for it, or figure out
some other way to turn it off - conditional code, macros, conditional
builds, etc. Which of course is done all the time in practice.
In any case, this shouldn't be a binary choice. For example, typical
logging tools offer levels of logging, and it's common to run live
systems at some level below the full "debug" level. Full debug logging
can easily become prohibitively expensive.
Having the ability to support logging levels which can be turned off
encourages use of the logging tool; without that, certain kinds of
logging would have to be avoided entirely, or done some other way.
One bottom line is that unintended consequences are a factor here.
Anton