Invariants are useless the way they are defined

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sun Aug 25 09:22:06 PDT 2013


On 8/25/13 5:16 AM, deadalnix wrote:
> As they are defined now, invariant are plain useless. I find myself
> disabling them one by one in my code as soon as cases get outside simple
> trivia.
>
> The problem is that invariant are checked at the beginning/end on public
> function calls. As a consequence, it is impossible to use any public
> method in an invariant.

But this is what they are for - check the state of an object upon access 
through the client-accessible interface. Simple code factorization (use 
a private method forwarded to by the public one) takes care of this 
situation.

> For instance, just right now I did refactor a struct to use bitfields,
> in order to make it more compact. Now I have to remove the invariant as
> field access are now function calls.

I don't get this case. Code?

> Another typical situation is when you want to assert certain properties
> in a class hierarchy, where calling virtual method is part of the
> invariant check.
>
> invariant should (and must to be useful) be inserted at callee point,
> when the callee isn't itself subject to invariant insertion, and around
> public memeber manipulation (when the manipulator isn't subject to
> invariant insertion).
>
> Any other pattern it doomed to create infinite recursion for non trivial
> invariant checks.

There might be something here, but more like a performance problem. I do 
see how calls of public methods from an invariant could cause trouble, 
but I'd say that's a problem with the invariant design.


Andrei



More information about the Digitalmars-d mailing list