Is there a reason why you think that Design by Contract (DbC) should be
implemented via annotations/attributes?

I personally think that such a system should be implemented directly in
the language, like Eiffel has it. I even think that it would be easy to
add it without any BC. It might be a bit more complicated to implement
thought.

  [assert]
  assert.active    = 1
  assert.invariant = 1
  assert.require   = 1 ; preconditions
  assert.ensure    = 1 ; postconditions

  class PreconditionError extends AssertionError {}
  class PostconditionError extends AssertionError {}

  function hello(string $who): string {
    return "Hello {$who}\n";
  }
  require {
    # argument must have content
    $who !== '';
    # argument cannot contain unprintable characters
    ctype_print($who);
  }

  hello('');
  // PHP Warning: require(): argument must have content: "$who !== ''"
  // failed in ...

  hello("\0");
  // PHP Warning: require(): argument cannot contain unprintable
  // characters: "ctype_print($who)" failed in ...

  class A {

    private DateTimeImmutable $created;
    private DateTimeImmutable $changed;

    function f() {}
    require {}
    // Special scope "old" available...
    ensure {
      # error message
      $this->x = old::$x - 42;
    }

  }
  ensure {
    # created cannot be less than changed time
    $this->created <= $this->changed;
  }

-- 
Richard "Fleshgrinder" Fussenegger

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to