<rmcreative>

RSS

Границы применимости статического анализа в публичных пакетах

16 июня 2021

В замечательном чате Валентина Удальцова «Пыхтелка» заметили релиз одной из библиотек Yii 3, Rate limiter и предложили вполне справедливые улучшения. kafkiansky сделал pull request, в который кроме, собственно, улучшений попало одно очень интересное изменение: вместо геттеров-сеттеров сделать свойства класса CounterState публичными и добавить на класс аннотацию @psalm-immutable:

/**
 * @psalm-immutable
 */
final class CounterState
{
    public int $limit;
    public int $remaining;
    public int $resetTime;
    public bool $isLimitReached;

Почему так:

  1. Используется статический анализ через Psalm.
  2. @psalm-immutable не даст присваивать что-либо этим свойствам, если его добавить в continuous integration.
  3. В будущем легче будет мигрировать на read only properties.
  4. Никакой логики здесь нет, это plain object. С аннотациями меньше кода.

Неплохо. Я бы согласился, если бы речь шла исключительно про код внутри коммерческого проекта, который я контролирую полностью. В случае же публичного пакета:

  1. Мы не контролируем то, как пакет используется.
  2. Мы не можем гарантировать, что будет использоваться именно Psalm, что он будет запускаться в процессе CI, что вообще будет использоваться хоть какой-то статический анализ.

То есть полагаться на статический анализ полностью и выкинуть часть кода в публичных пакетах, к сожалению, не получится.

Комментарии RSS

  1. №12186
    Boom
    Boom 16 июня 2021 г., 18:30:50

    Иными словами: если что-то может быть использовано неверно, то оно будет использовано неверно.

  2. №12187
    Андрей
    Андрей 21 июня 2021 г., 8:58:52

    Это типичная ситуация. Чтобы переключиться в мышлении с "индивидуального" проекта на "коробочное" решение - необходимо немного повернуть мозг. Из-за такой универсальности в "коробках" порой больше не очень приятного кода.

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.