В замечательном чате Валентина Удальцова «Пыхтелка» заметили релиз одной из библиотек 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;
Почему так:
- Используется статический анализ через Psalm.
- @psalm-immutable не даст присваивать что-либо этим свойствам, если его добавить в continuous integration.
- В будущем легче будет мигрировать на read only properties.
- Никакой логики здесь нет, это plain object. С аннотациями меньше кода.
Неплохо. Я бы согласился, если бы речь шла исключительно про код внутри коммерческого проекта, который я контролирую полностью. В случае же публичного пакета:
- Мы не контролируем то, как пакет используется.
- Мы не можем гарантировать, что будет использоваться именно Psalm, что он будет запускаться в процессе CI, что вообще будет использоваться хоть какой-то статический анализ.
То есть полагаться на статический анализ полностью и выкинуть часть кода в публичных пакетах, к сожалению, не получится.