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;
    }
}

> 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.

>
> 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.

>
> 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.

>
> 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 :)

Thanks. Dmitry.

>
> Regards,
>
> P.S. If anyone finds issues with DbC as class definition, please let me
know.
>
> --
> Yasuo Ohgaki
> yohg...@ohgaki.net
>

Reply via email to