Ответ вслух Middle SOLID и принципы обновлено

L - подстановка Лисков

Вопрос

Что такое принцип подстановки Лисков? Как он нарушается в React?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Если код работает с базовым типом, он должен продолжать работать с любым наследником, ничего о нём не зная. Наследник не вправе требовать больше на входе и обещать меньше на выходе.

Что должно прозвучать в ответе

  • наследника можно подставить вместо базового, не сломав поведение

  • контракт нельзя ужесточать на входе и ослаблять на выходе

  • нарушение: обёртка над button, которая глотает часть пропсов

  • нарушение: компонент, который принимает onClick, но вызывает его не всегда

  • починка: пробрасывать ...rest и ref, не менять смысл пропсов

  • принцип про контракт, а не про наследование классов

Что могут спросить следом

  • Зачем forwardRef в компонентах дизайн-системы
  • Как типизировать компонент, расширяющий пропсы button
  • Где это правило пересекается с принципом наименьшего удивления

Разбор

Если код работает с базовым типом, он должен продолжать работать с любым наследником, ничего о нём не зная. Наследник не вправе требовать больше на входе и обещать меньше на выходе.

В React наследования нет, но контракты есть. Своя <Button>, которая принимает пропсы нативной кнопки, но втихую не пробрасывает disabled, type или ref, - прямое нарушение: вызывающий код рассчитывает на поведение кнопки и получает сюрприз.

То же с onChange, который вызывается не на каждое изменение, или с компонентом, который при value="" подставляет своё значение по умолчанию.

Починка: ...rest и forwardRef по умолчанию, а если поведение действительно другое - другое имя, а не «почти кнопка».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.