Сейчас обсуждается RFC для PHP с предложением сделать в интерфейсах возможность реализовывать методы, чтобы с подключением интерфейса появлялся не только контракт но и реализация по умолчанию.
PHP RFC: Interface Default Methods
Я против и вот почему:
Архитектурные границы
Вся суть интерфейса в том, чтобы наложить ограничения на архитектуру.
Через интерфейс мы определяем как наш код взаимодействует с “внешним кодом”: любым кодом, который не знает о деталях реализации. Возможно это система которая использует нашу библиотеку, или просто другой модуль из нашего проекта отделённый от части кода, закрытой интерфейсом.
Интерфейс это архитектурная граница, чтобы разделить то что должно быть разделено и защитить код от неожиданных изменений.
Защита кода и свобода изменений
Для “внешнего мира” мы предоставляем только интерфейсы, это даёт нам свободу менять реализацию так как мы захотим.
До тех пор пока мы не меняем сам интерфейс, “внешний” код не понадобится менять. Поэтому “внешний” код изолирован и мы извлекаем из этого пользу — чем меньше приходится менять код, тем меньше мы сделаем ошибок и меньше затратим времени на работу.
В этом заключается суперсила и настоящая причина существования интерфейсов.
Реализация методов по умолчанию
А что если предоставить реализацию по умолчанию в интерфейсах?
Интерфейс больше не будет просто контрактом, он получит знания о деталях реализации. Значит, когда мы будем менять детали реализации — необязательно даже менять сам интерфейс при этом, достаточно будет изменить класс к которому он обращается — то изменится интерфейс, а значит придётся учесть эти изменения в любом внешнем коде, который использует этот интерфейс.
Изменения в интерфейсе смогут поменять и в некоторых случаях даже сломать внешний код. Изоляции больше нет. Меняя детали реализации в нашем коде мы можем сломать внешний код.
Интерфейсы в миг потеряли свою суперсилу.
Из инструмента выстраивания архитектуры интерфейс превратился в опасное и непредсказуемое создание.
Поэтому — нет. Я против этого RFC.
Бонус