SOLID в PHP

Эти пять принципов разработки программного обеспечения являются руководством, которому нужно следовать при создании программного обеспечения, чтобы его было легче масштабировать и поддерживать. Они были сделаны популярными инженером-программистом Робертом К. Мартином.

Само определение SOLID — это аббревиатура, состоящая из таких сокращений:

  • S — Принцип единственной ответственности (Single Responsibility Principle)
  • O — Принцип открытости/закрытости (Open-closed Principle)
  • L — Принцип подстановки Барбары Лисков (Liskov Substitution Principle)
  • I — Принцип разделения интерфейса (Interface Segregation Principle)
  • D — Принцип инверсии зависимостей (Dependency Inversion Principle)

Принцип единственной ответственности

Этот принцип является базовым, и одним из ключевых. Если вы поймёте идею этого принципа сейчас, и начнете разработку, держа её в голове, это, вероятно избавит вас от рефакторинга кода в будущем. Главная идея, проходит нитью по названию этого принципа, она состоит в том, что каждый класс должен выполнять только одну задачу, и только одну.

Каждый класс должен получать информацию из системы ровно столько, сколько достаточно для работы логики этого класса. А так же, класс не должен быть мастером на все руки, выполняя множество разноплановых задач. Он должен выполнять только одну конкретную задачу. Класс может содержать много методов, но все они должны быть направлены на решение одной и только одной задачи.

Принцип Открытости/Закрытости

Следующий принцип — Принцип Открытости/Закрытости, который, по мнению идейного прародителя SOLID-а, является одним из самых важных принципов, с чем, впрочем, сложно спорить.

Этот принцип гласит, что классы должны быть открыты к расширению, и закрыты к модификации. Это значит, что ваш код должен быть написан так, чтобы другие разработчики (а, возможно, и вы, в будущем) могли изменить поведение существующего кода, при этом, не изменяя основной код. То есть, ваши классы должны быть такими, чтобы каждый мог дописать что-то своё, не меняя при этом содержимого исходного кода.

Принцип подстановки Барбары Лисков

Принцип подстановки Барбары Лисков (именуемый как LISP) это важная концепция, придуманная ещё в далёком 1987-м.

Когда дочерний класс не может выполнять те же действия, что и его родительский класс, это может привести к ошибкам.

Если вы имеете класс и создаете другой класс из него, он становится родителем, а новый класс становится дочерним. Дочерний класс должен быть в состоянии сделать все, что может сделать родительский класс. Этот процесс называется Наследованием.

Дочерний класс должен быть способен обрабатывать те же самые запросы и выдавать тот же самый результат, что и родительский класс, или он может выдать результат, который имеет тот же самый тип.

Принцип разделения интерфейса

Когда от Класса требуется выполнение действий, которые он не должен делать, или не может, это расточительно и может привести к неожиданным ошибкам. Очень часто бывает, что Класс не имеет возможности выполнить эти действия, хотя интерфейс обязует что-то с этим делать.

Класс должен выполнять только те действия, которые необходимы для выполнения его функции. Любое другое действие должно быть полностью удалено или перемещено куда-либо еще, если оно может быть использовано другим классом в будущем.

То есть, главный посыл в этом — разделение толстых интерфейсов, которые «делают всё», на более узконаправленные интерфейсы, решающие узконаправленную задачу.

Принцип инверсии зависимостей

Это мой самый любимый принцип, который помогает поддерживать бОльшую чистоту кода, который легче тестировать и изменять в будущем.

Если вы имеете несколько клиентских классов которые предполагают работу с базой данных, вы могли бы создать класс под названием MysqlDBConnection. Но что будет, если вы захотите изменить ваш драйвер БД на SQLite? Вы будете делать новую реализацию класса так: class SQLiteDBConnection extends MysqlDBConnection?
Нет, более чисто и правильно было бы создать интерфейс DBConnectionInterface, а уже на основе него, создать соответствующие реализации классов для работы с Mysql и SQLite. После чего, в вашем приложении (для примера, в сервис-контейнере) просто нужно будет выполнить биндинг реализации к классу-интерфейсу.

После чего, вы можете иметь несколько реализаций на основе этого интерфейса, легко переключаемых между собой. При этом, замена реализаций исключает изменение основного клиентского кода.

Для того, чтобы научиться писать по SOLID-у, вам нужно просто практиковаться писать всё больше и больше, постоянно держа в голове эти принципы и стараясь их внедрять в нужные места. После чего, полное понимание и умение их применять придёт само собой.