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

Reply via email to