`restricted` member variables

Mike Parker aldacron at gmail.com
Thu Jun 23 03:10:46 UTC 2022


On Thursday, 23 June 2022 at 01:45:22 UTC, Paul Backus wrote:

> Your proposal would lead to the following situation:
>
>     struct EvenNumber
>     {
>         private int n;
>         invariant (n & 1 == 0);
>
>         this(int n) { this.n = n; }
>
>         void addTwoMethod() { this.n++; this.n++; } // ok
>     }
>
>     void addTwoUFCS(ref EvenNumber this_)
>     {
>         this_.n++; this_.n++; // error - violates invariant
>     }

I could live with that particular inconsistency. The bigger 
downside I see is that you'd potentially have multiple invariant 
checks for the same class on a single function call. And whether 
that's acceptable depends on how common this is in practice.

>
> IMO the correct way to view this is that code in the same 
> module as a class is part of the class's implementation, just 
> as much as code in the actual class body. (Or if you prefer, 
> they are both part of the module's implementation, since the 
> module is the fundamental unit of decomposition here, not the 
> class.)
>

As long as the invariant checks only run on those functions that 
actually touch a private member. There would potentially be 
checks for multiple classes running before and after each 
function call, so doing it on every function call in the module 
is overkill.

And that would also have to include any public member functions 
of any classes that access any private members of other classes 
in the same module. It seems more complex to implement than just 
doing a rewrite to getters/setters.

An even simpler option would be to disallow access to any private 
members in a module on classes that have invariants. Not 
something I'd advocate, but a possibility.





More information about the Digitalmars-d mailing list