bearophile wrote: > Jens Mueller: > > > I have a rectangle and one of its methods moves the upper left > > of the rectangle. I have two invariants when moving a rectangle: The > > width and the height do not change. I could do something like the > > following: > > > > void move(...) { > > int currentWidth = width; > > int currentHeight = height; > > // moving the rectangle here > > assert(currentWidth == width); > > assert(currentHeight == height); > > } > > Probably you need one basic feature of DesignByContract that is missing still > in D2, the "old" that allows at the end of a method to know the originals. It > was discussed two or more times: > > http://www.digitalmars.com/d/archives/digitalmars/D/why_no_old_operator_in_function_postconditions_as_in_Eiffel_54654.html > > http://www.digitalmars.com/d/archives/digitalmars/D/Communicating_between_in_and_out_contracts_98252.html > > Once the feature is implemented you may solve your problem like this (minus > syntax changes, but other solutions are possible):
Oh. I should have done better research. I don't like the "old" approach. > void move(...) > in { > // ... > } out { > assert(width == old.width); > assert(height == old.height); > } body { > // moving the rectangle here > } > > > The problem of implementing the old was solved in C#4, it is named > PrestateValues(OldValue), see page 8 here: > http://research.microsoft.com/en-us/projects/contracts/userdoc.pdf > So probably this problem may be solved in D2 too. > > To solve this problem currently you may need to use ghost fields in your > struct/class that memorize the older values... ghost fields wrapped in > version(unittest) {...} or some version(debug). This is a bad solution. Don't get your point here. You neither like the ghost fields (old) nor the debug {} approach as Andrei suggested? I mean after all the problem is not that important that one should bother too much. Maybe I'm too pragmatic. I'll try using it and see how it feels. Jens