Ответ 1
Как вы уже упоминали, реализация Access
была изменена, чтобы использовать Поведения вместо протоколов. Аргументация была производительность.
- Протоколы являются полиморфизмом типа/данных и являются эксклюзивными для Elixir. Это означает, что позволяет отправлять на основе структуры данных
- Поведения - это механизм без типов, который полагается не на структуру данных, а на модуль в качестве аргумента. Они также встроены прямо в экосистему Erlang/OTP и намного более производительны.
Несмотря на то, что протоколы выполняют большую работу для вас при распределении данных по типам данных, они все равно никогда не будут достаточно быстрыми для Access
из-за способа их реализации (консолидация),
Таким образом, хотя вы всегда должны использовать протоколы, когда вам нужно привязать некоторые функциональные возможности к структуре данных, а не к модулю, Access
является особым случаем.
Поскольку протокол
Access
опирается на сервер программного кода в режиме разработки и тестирования (когда консолидация протокола не применяется), мы слышали множество сообщений о том, что система сильно страдает от производительности, так как сервер программного кода становится узким местом с несколькими процессами.Это происходит потому, что протокол
Access
вызывается тысячи раз, и мы мало что можем сделать, чтобы улучшить его (в отличие от протокола Enumerable, где большинство случаев списка встроено).
Дальнейшее чтение:
- Github: избавьтесь от протокола доступа
- Форум Elixir: почему доступ - это поведение, а не протокол
- Stackoverflow: разница между протоколом и поведением в эликсире
- Список рассылки: понимание протоколов и поведения
- Сообщение в блоге: поведение против протоколов