Am 14.04.2019 um 23:48 schrieb Martin Frb:
As for "documentation". I disagree with the way it is done in oxygen. But I am not sure I have any good alternative.
For me a class contract (require/ensure) is part of the interface.

So it would have to be like (and similar for plain procedures, no class) // can be all on one line....

type
  TFoo= class
     function DoTheFooThing(Foo1, Foo2: TFoo): Tbar;
        requires
           assigned(Foo1) or assigned(Foo2): 'Need at least 1 foo, for the connection';
        guarantees // better than ensure
           assigned(result);
           result.KnowsMyFoo = true: 'Connection exists';  // the =true is redundant
    procedure DoTheBar;
  end;

So reading this declaration, you immediately know what is valid. And if custom messages are give, they may tell you way

It is to be noted, that requires and guarantees contain conditions (expressions), not pascal code. So technically it is ok, that they are in the interface and not implementation. If I want something in the implementation, I can use normal "assert" (which by the way, have often great documenting value)
The problem is that both "require" and "ensure" can check for fields as well (think of a setter for example or something that changes the state). Thus you could use a field name that the compiler does not yet know. So you would need to order your methods in a order dictated by the compiler due to the method's implementation instead of an order of your own choosing.

And yes, that would also be a problem with "class invariants", though there it's more clear if we say that only identifiers can be used that have been declared before as it's the same with properties and their setters/getters.

Regards,
Sven
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to