On 2011-03-26 08:55, Don wrote: > spir wrote: > > On 03/25/2011 11:20 PM, Jonathan M Davis wrote: > >> In the case of something like dividing by 0 or other math functions > >> that could > >> be given bad values, the typical solution is to either use an > >> assertion (or > >> check nothing) and then let the caller worry about it. It would be > >> extremely > >> wasteful to have to constantly check whether the arguments to typical > >> math > >> functions are valid. They almost always are, and those types of > >> functions needto be really efficient. > > > > But catching wrong arguments to math functions at *runtime* is precisely > > > > what D itself does (as well as all languages I know): > > auto a = 1, b = 0; > > auto c = a/b; > > > > ==> > > > > Floating point exception > > > > There is no way out, or do I miss a point? > > > > Denis > > That one is done by the CPU, as mentioned in another post. But it does > illustrate something interesting: the contract programming makes you > think there is a symmetry between in and out contracts, whereas in fact > they have very little in common. If an out contract fails, it ALWAYS > indicates a bug in the function. So it should ALWAYS be an assert. > But 'in' contracts are completely different, since they indicate a > problem in the calling code. (Personally I cannot see the value of 'out' > contracts, except as information for verifying later 'in' contracts).
Whereas I _rarely_ use in contracts. In most cases, I favor exceptions, treating my functions as API functions pretty much as long as they're public. That's not always the best approach, but it's generally what I end up using. invariants, I use fairly frequently (and in fact have run into trouble due to issues with them - e.g. http://d.puremagic.com/issues/show_bug.cgi?id=5058 ). out, on the other hand, I don't use as much. It's not terribly common that there's a good test to run on the return value of a function in my experience. Upon occasion, it's useful, but rarely. Unit tests generally solve the problem better with regards to testing output. They're still useful though - just not commonly so. So, honestly, other than invariants, I don't use D's DbC much. in contracts get used upon occasion, but I tend to favor exceptions over assertions in most cases, so I don't use in all that often, and while out is occasionally useful, unit tests generally do a better job of verifying that a function's return value is correct. I'm _very_ glad to have invariants though. - Jonathan M Davis