class invariants and property declarations
Dmitry Olshansky
dmitry.olsh at gmail.com
Wed Feb 16 01:04:51 PST 2011
On 16.02.2011 11:03, Michael Engelhardt wrote:
> Hi,
> I just have started diving in D. Exploring the contract feature I
> stumbled upon the fact that a class invariant does not apply to properties:
Welcome on board :)
Invariant gets called on every public method call (at begin & end if I'm
not mistaken).
Now to properties, this is actually shouldn't be allowed:
@property int hours;
@property is a annotation applied to functions (getter/setter), to allow calling it with omitted () and a natural assign syntax like this:
class Time {
private:
int _hours;
public:
//...
@property int hours() {
return _hours;
}
@property void hours(int newHours) {
_hours = newHours;
}
}
auto t = new Time();
t.hours = 5; // calls void hours(5)
assert(t.hours == 5); //calls int hours()
Now given that setter and getter are public methods they'd got the invariant called.
> import std.stdio;
>
> void main(string[] args) {
> Time t = new Time();
> t.hours = 24; // works; why?
> writeln("t.hours is ", t.hours);
> t.add(1); // triggers an assertion failure as expected
> writeln("t.hours is ", t.hours);
> }
>
> class Time {
> invariant() {
> assert( 0<= hours&& hours< 13);
> }
> @property int hours;
>
> public void add(int hours) {
> this.hours += hours;
> }
> }
>
> compiled using Digital Mars DMD (2.051 on Ubuntu 10.10) is given the
> following result:
>
> t.hours is 24
> core.exception.AssertError at invarprop(13): Assertion failure
> ----------------
> ./InVariantProperty() [0x8057ade]
> ./InVariantProperty() [0x804f7e6]
> ./InVariantProperty() [0x804cba3]
> ./InVariantProperty() [0x8049856]
> ./InVariantProperty() [0x804fa86]
> ./InVariantProperty() [0x8049869]
> ./InVariantProperty() [0x8049813]
> ./InVariantProperty() [0x804f9f2]
> ./InVariantProperty() [0x804f94c]
> ./InVariantProperty() [0x804fa36]
> ./InVariantProperty() [0x804f94c]
> ./InVariantProperty() [0x804f8f4]
> /lib/libc.so.6(__libc_start_main+0xe7) [0xa5cce7]
> ./InVariantProperty() [0x8049721]
>
> Should not a class invariant apply to properties, too?
>
> Kind regards
>
> Michael
--
Dmitry Olshansky
More information about the Digitalmars-d-learn
mailing list