Invariants for methods
Jonathan M Davis
jmdavisProg at gmx.com
Thu Nov 18 10:07:59 PST 2010
On Thursday, November 18, 2010 10:03:16 Jonathan M Davis wrote:
> On Thursday, November 18, 2010 09:48:08 Jens Mueller wrote:
> > Does it make more sense to talk about an invariant for a member
> > function? I mean the member function changes the state of the instance
> > but there may be some invariant when changing it. Basically some change
> > is allowed but the other isn't.
> > struct Rectangle {
> >
> > // state is only allowed to change in a certain way
> > // width and height of this Rectangle need to be preserved
> >
> > public void move(...) {
> > }
> >
> > private:
> > State state;
> >
> > }
> >
> > I'm very thankful for your feedback. At the moment I'm not sure whether
> > you see my point.
> > I think of an member function invariant as something more fine-grained
> > than a class invariant. Of course calling move() needs to preserve the
> > class invariant but actually in case of move() it should also do
> > something more, namely before calling and after the call the width and
> > height should be the same. That's an invariant for the computation of
> > move(). How do I express it such that it will be compiled away when
> > disabling contracts (i.e. in release mode)?
>
> Ah. I think I get what you're getting at. That strikes me as a bit weird,
> and I wouldn't encourage having that sort of requirement on a function
> normally, but there is no way to have a test which is automatically tested
> both before and after a function call and yet not be in the invariant. You
> _can_ just put the test in both the pre-condition and post-condition. And
> if that's more code duplication than you want, you can create a function
> which does the test and call it in both (or which returns a bool whether
> the test passed and still youn do the assertion in the pre and
> post-conditions). But regardless, there is no way to have a "function
> invariant" like you're looking for. And generally- speaking, I wouldn't
> advise requiring that the member variables of the class/struct be required
> to be in a specific state before a calling a particular member function.
> Sometimes, it's required, but that sort of dependency is likely to cause
> problems more often than not - particularly if it's common for functions
> to have that sort of requirement.
>
> In any case, just put the tests in the in and out blocks, and create a
> helper function if it's too much code duplication.
Ah. Only closer inspection. I see that I still misunderstood what you meant. I
thought that you meant that you wanted a particular thing to be true before and
after the function call but not necessarily be true for all function calls in
the class/struct. I should have read more carefully.
Andrei's suggestion is a good one.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list