Programming by Contract
Ethan Furman
ethan at stoneleaf.us
Tue Aug 11 17:20:18 EDT 2009
Charles Yeomans wrote:
>
> On Aug 11, 2009, at 3:30 PM, Ethan Furman wrote:
>
>> Ethan Furman wrote:
>>
>>> Greetings!
>>> I have seen posts about the assert statement and PbC (or maybe it
>>> was DbC), and I just took a very brief look at pycontract
>>> (http://www.wayforward.net/pycontract/ ) and now I have at least one
>>> question: Is this basically another way of thinking about unit
>>> testing, or is the idea of PbC more along the lines of *always*
>>> checking the input/output of functions to ensure they are correct?
>>> (*Contstant vigilance!* as Prof Moody would say ;)
>>> I know asserts can be turned off, so they obviously won't work for
>>> the latter case, and having seen the sample of pycontract it seems
>>> it only does its thing during debugging.
>>> So is Design (Programming) by Contract a fancy way of saying
>>> "Document your inputs/outputs!" or is there more to it?
>>> ~Ethan~
>>
>>
>> Hmmm...
>>
>> Well, from the (apparently) complete lack of interest, I shall take
>> away the (better?) documentation ideas and unit testing ideas, and
>> not worry about the rest. :)
>>
>>
>
>
>
>
> Design by contract is complementary to unit testing (I notice that the
> author of PEP 316 appears confused about this). DbC is, roughly
> speaking, about explicit allocation of responsibility. Consider this
> contrived example.
>
> def foo(s):
> require(s is not None)
> //code
> ensure(hasattr(returnValue, '__iter__'))
>
>
> The require condition tells you that it's the caller's responsibility
> to pass a non-nil argument to foo. The ensure condition is a guarantee
> that foo will return something suitable for iteration, if the
> precondition in the require condition is satisfied. These conditions
> can be enforced at runtime, but may not be, for reasons of performance.
>
> DbC is in fact about not *always* checking the input/output of
> functions; on the contrary, Bertrand Meyer, the inventor of DbC, claims
> that DbC allows one to eliminate such redundancy, and the resulting
> overhead.
>
> Charles Yeomans
Many thanks!
So if I understand -- Python's EAFP fits well with DbC, as DbC seems
well suited to say, "This is your responsibility, and this is mine,"
stated in programming terms (who needs comments? ;) Combined with unit
testing (which should be easier to design correctly given the DbC code),
healthy code seems more attainable.
Interesting. Thank you for the information.
~Ethan~
More information about the Python-list
mailing list