Как применять SOLID в динамических языках?
Принципы S.O.L.I.D
В динамических языках SOLID не отменяется, но опирается на соглашения и утиную типизацию вместо интерфейсов компилятора: контракт фиксируют тесты, протоколы и документация.
Что меняется
- ISP: вместо формального
implements— неформальные роли вроде «объект с методом read»; формализуют через Protocol или ABC, но проверка опциональна. - DIP: зависимость от абстракции — просто ожидание объекта нужной формы; подстановка мока в тестах бесплатна.
- OCP и Strategy: функции первого класса заменяют целые иерархии стратегий — паттерны «тают» в языке.
Что остаётся
- LSP как поведенческий контракт: наследник не должен ломать ожидания — компилятор не спасёт, спасают контрактные тесты.
- SRP вообще не зависит от языка.
Риски
Лёгкость подмены провоцирует monkey-patching вместо явных точек расширения — предсказуемость кода падает.
Коротко для собеседования
Принципы остаются, но контракт держится на утиной типизации, соглашениях и тестах, а не на компиляторе. Функции первого класса заменяют многие иерархии стратегий, LSP страхуют контрактными тестами; главный риск — monkey-patching вместо явных точек расширения.