Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
* @Contract\Ensure("$this->balance == $__old->balance+$amount")
* @Contract\Ensure("$__result == $this->balance"), потому как не могу понять их смысл. Если в случае с * @Contract\Verify("$amount>0 && is_numeric($amount)") понятно назначение этого контракта (проверить правильность параметра, соответствие бизнес-модели), то в приведенных выше я не понимаю, зачем они нужны. Иными словами, как может случиться, что $old = $value;
$value += $add;
$value == $old + $add; // зачем проверять это?Ассерты не должны использоваться как окончательные проверкиПока не дочитаешь до конца — это не очевидно, и может сбить с толку.
… Хочу обратить внимание на то, что предусловия в рамках контрактов служат для проверки логки работы программы и не отвечают за валидность параметров, переданных от клиента. Контракты отвечают только за взаимодействие внутри самой системы. Поэтому пользовательский ввод должен всегда фильтроваться с помощью фильтров, так как утверждения могут быть отключены.
assert('$amount>0 && is_numeric($amount);');
assert($amount>0 && is_numeric($amount));
Invalid amount of money).Assertions should be used as a debugging feature only.
class BankAccount
{
/**
* Deposits fixed amount of money to the account
*
* @param float $amount
*
* @Contract\Verify("Given some precondition and some other precondition")
* @Contract\Ensure("When some action by the actor and some other action, then some result is returned")
*/
public function deposit($amount) {}
}
.Ну что же, мое мнение таково, что рано или поздно аннотации будут реализованы на уровне ядра PHP, все к этому идет.
/**
* @Route("/{id}/comments")
* @ParamConverter("cafe", class="AppUserBundle:User")
* @Template()
*/
public function indexCommentsAction(User $user)
{
return ['user' => $user];
}
public function indexCommentsAction($id)
{
$user = $this->getDoctrine()->getManager()->getRepository('AppUserBundle:User')->findOneById($id);
if ($user === null) {
throw $this->createNotFoundException('There is no users with id = ' . $id);
}
return $this->render('AppCommentBundle:Index:index.html.twig', ['user' => $user]);
}
не кажется ли вам, что перенос логики исполнения в комментарии — это перебор?
Можно считать продвинутым аналогом статической типизации или тайп-хинтинга.
Не кажется, потому что по сути это декларативное объявление для программиста.
Слишком сильно влияет на производительность в худшую сторонуВы уже проверили? :)
Абсолютно никакой поддержки IDEЗдесь да, согласен. Без кофмортной подсветки синтаксиса крайне неудобно работать. Можно только помечтать о том, чтобы написать плагин к шторму.
Абсолютно никакой поддержки IDE
@Contract\Verify("$amount>0 && is_numeric($amount)")
* @Contract\Ensure("$this->balance == $__old->balance+$amount")$this->getBalance() == $__old->getBalance() Или контракт делать в трєйте реализующем интерфейс, в общем обход синтаксиса.
Контрактное программирование в PHP