Hi, can I make some minor correction?
Thanks. Dmitry. On Tue, Feb 10, 2015 at 9:25 AM, Yasuo Ohgaki <yohg...@ohgaki.net> wrote: > Hi Dmitry, > > On Tue, Feb 10, 2015 at 1:43 PM, Dmitry Stogov <dmi...@zend.com> wrote: > >> On Feb 9, 2015 11:20 PM, "Yasuo Ohgaki" <yohg...@ohgaki.net> wrote: >> > >> > Hi Dmitry and Joe, >> > >> > On Mon, Feb 9, 2015 at 8:27 PM, Dmitry Stogov <dmi...@zend.com> wrote: >> >> >> >> yes. this may work. >> >> probably better to put it after extends and implements. >> >> >> >> >> >> Dmitry. >> >> >> >> On Mon, Feb 9, 2015 at 2:19 PM, Joe Watkins <pthre...@pthreads.org> >> wrote: >> >>> >> >>> Could this be described as a requirement of the class ? >> >>> >> >>> class Mine >> >>> require(invariant-expr) >> >>> extends Something >> >>> implements Someface { >> >>> >> >>> public function method($param) : return >> >>> require(input-expr), >> >>> return(output-expr) { >> >>> >> >>> } >> >>> } >> >>> >> >>> To avoid invariant keyword maybe. >> > >> > >> > This would work. >> > If users have adopted DbC in some way, 'invariant' may be used already. >> > >> > I see two issues. >> > >> > Interface works, but most classes are class without interfaces. Then >> users have to repeat >> > require()/return() many times to check class state or have to use >> interface for DbC. >> > >> >> In D classes may have "invariant" constraints. We may use "require" >> keyword for it. The constraints ineritance rules and order of calls to >> constrains must be the same s in D. >> >> class Foo { >> private $sum = 0; >> require($this->sum >= 0); // invariant constraint will be called >> before and after every method >> function add($n) { >> $this->sum += $n; >> } >> } >> > > OK. I'll update the RFC. > > >> > Since compiler does not know a method() is for DbC invariant, it will >> be compiled and exists >> > in production execution. >> > >> > Use of interface: >> > - no additional keyword (pros) >> > - requires interface for DbC, most classes does not require interface >> (cons) >> > - if interface is not used, user has to repeat invariant conditions >> over and over (cons) >> > - requires to define method that should not exist in production (cons) >> >> I didn't understand you idea. >> > > Joe's idea was to use Interface for invariant condition grouping. > If we use your idea, issue is solved. > > class Foo { >> private $sum = 0; >> require($this->sum >= 0); // invariant constraint will be called >> before and after every method >> function add($n) { >> $this->sum += $n; >> } >> } >> > Ok. > >> > >> > New keyword: >> > - does not require interface for efficient definition (pros). >> > - new keyword (cons) >> > >> > It seems we are better to choose proper keyword for 'invariant'. >> 'invariant' is not common, so 'invariant' >> > may be good enough choice. Does anyone use 'invariant' as >> function/method/class/constant names? >> > If there is better name, suggestion is appreciated. >> > >> > On place closure call like javascript is not supported in PHP, but >> function works with assert. >> > >> > <?php >> > function foo() { return FALSE; } >> > assert(foo()); >> > ?> >> > PHP Warning: assert(): Assertion failed in - on line 3 >> > >> > This wouldn't be changed for require()/return()/invariant()? >> > >> > We need a switch to change development/production. I'll use >> "dbc=On/Off" for now. >> > If you have any better idea, please let me know. (dbc will be >> INI_SYSTEM) >> >> Check the "expectations" RFC. I think, it's going to be 3 state switch, >> zero-cost disable, run-time disable, run-time enable. So, it may be >> INI_ALL, but it won't be possible to switch from/to zero-cost at run-time. >> > > Ok. > >> > >> > For CLI, there will be no command line switch for dbc. It executes >> script production mode by >> > default. If user needs development mode >> > >> > php -d dbc=1 script.php >> > >> > should be used. >> > >> > >> > And finally, are we going to allow custom assertion error message? e.g. >> > >> > require($a > 0, 'Parameter $a must be positive number'); >> >> I think, it may be useful. >> > Ok. I'll use it. > >> > >> > Since this contract is definition like "implements"/"extends", we may >> not allow >> > custom error message. I'll write the RFC not to allow custom error >> messages unless >> > you dislike it. >> > >> > I think we have enough consensus/information to start writing the RFC. >> > If I have any concern, I'll ask here. >> >> Ok, go forward :) >> > Updated wiki page. > https://wiki.php.net/rfc/dbc2 > > If you would like to change something, please let me know. > I don't think finished draft at all and I don't mind going back and forth. > > Regards, > > -- > Yasuo Ohgaki > yohg...@ohgaki.net >