Информация
- В рейтинге
- Не участвует
- Откуда
- Ставрополь, Ставропольский край, Россия
- Дата рождения
- Зарегистрирован
- Активность
Специализация
Бэкенд разработчик
Старший
PostgreSQL
Apache Kafka
Elasticsearch
MongoDB
Scala
Java
PHP
Redis
ClickHouse
RabbitMQ
Поменял на Entry в 3.0.0. Рассматривал ещё вариант с массивом, но из-за того, что деструктуризация не работает как например в
foreach ($pairs as [$key, $value]), то сделал Entry класс, объекты которого живут только в рамках одной итерации.Для каждой операции над коллекцией написана дока в соответствующем интерфейсе с суффиксом Ops. Например LinkedList -> Seq -> SeqOps.
Там есть короткие примеры использования в формате REPL.
В конкретных реализациях коллекций просто используется ссылка на доку из интерфейса с помощью inheritDoc, чтобы избежать дублирования документации.
Что касается порядка аргументов, то чаще всего в операциях типа map и фильтр используется именно значение. Ключ можно использовать, но это редкий кейс.
Такой порядок аргументов позволяет в вашем примере написать вот так и не указывать вообще ключ как второй аргумент.
1) У непустых коллекций отличается сигнатура некоторых методов. Например, возвразаемый тип head и reduce не содержит ни
null, ниOptionт.к. непустая коллекция гарантирует, что хотя бы один элемент в коллекции присутствует. Непустые коллекции позволяют пользоваться такими операциями без каких-либо проверок на null. clear - это по сути тот жеfilter(fn() => false). В статье есть пример, где после операцииfilterNonEmptyпрефикс коллекции пропадает из-за того, что коллекция может стать пустой.3) Такое поведение array_filter лично мне кажется не особо явным
4) Ковариантность сама по себе опасна с точки зрения типов. Из-за этого псалм требует иммутабельности класса, чтобы иметь возможность использовать темплейт-параметры в качестве типа передаваемых аргументов методов. Обоснование есть в документации псалма. Доктриновские коллекции мутабельны и в них не получится использовать ковариантность.
5) Увеличенный расход по памяти конечно стоит учитывать при работе с иммутабельными коллекциями. Но в первую очередь библиотека пропагандирует функциональный подход, а иммутабельность - это один из главных столпов.
6) С помощью
SplObjectStorageне получится чейнить операции и там нельзя хранить скалярные типы. Так же,HashMapиспользуется внутриHashSet.composer.lock содержит зафиксированные версии пакетов. composer install в первую очередь смотрит на composer.lock файл. Если его нет, тогда решает какие версии пакетов ставить в зависимости от того, что указано в composer.json. composer.lock файл комитят в конечных проектах, чтобы вся команда разработчиков работала с одинаковыми версиями пакетов, но в библиотеках так делать не стоит, чтобы не навязывать конкретные версии пакетов проектам, которые будут пользоваться библиотекой.
Спасибо, удалил.