Найти в Дзене
XotGames

Мегагном и SOLID: как Gravity Falls полезен для начинающих программистов

Когда я только начал разбираться в архитектуре, принципы SOLID казались мне не совсем понятны. Пять букв, пять идей, часть я понял сразу, часть сильно позже. Когда же я уже окончательно понял ее, меня остнило, что Мегагном из мультсериала Gravity Falls, монстр, собранного из гномов, каждый из которых выполняет свою роль - отличный пример данного принципа. Каждый гном в составе Мегагнома выполняет только одну задачу. Никто не делает всё сразу. Один гном — одна обязанность. Так и в хорошем коде: класс должен заниматься только тем, для чего он создан. Гномы в Мегагноме — это как модули. Если один из гномов устал или вышел из строя, его можно заменить другим, не трогая при этом всю систему. Хочешь вместо ноги, что ходит ту, что прыгает? Просто ставь нового гнома в слот "нога". Поведение расширяется, а старый код не переписывается. Хочешь, чтобы рука при команде "бей", сделала хук, а не джеб, поставь нужного гнома, и не парься. Или еще дальше. Скажи руке "действуй", и один тип руки ударит
Оглавление

Когда я только начал разбираться в архитектуре, принципы SOLID казались мне не совсем понятны. Пять букв, пять идей, часть я понял сразу, часть сильно позже. Когда же я уже окончательно понял ее, меня остнило, что Мегагном из мультсериала Gravity Falls, монстр, собранного из гномов, каждый из которых выполняет свою роль - отличный пример данного принципа.

S — Single Responsibility (Единственная ответственность)

Каждый гном в составе Мегагнома выполняет только одну задачу.

  • Гном-рука — бьёт.
  • Гном-нога — двигается.
  • Гном-глава — управляет.

Никто не делает всё сразу. Один гном — одна обязанность. Так и в хорошем коде: класс должен заниматься только тем, для чего он создан.

O — Open/Closed (Открыт для расширения, закрыт для изменения)

Гномы в Мегагноме — это как модули.

Если один из гномов устал или вышел из строя, его можно заменить другим, не трогая при этом всю систему. Хочешь вместо ноги, что ходит ту, что прыгает? Просто ставь нового гнома в слот "нога". Поведение расширяется, а старый код не переписывается. Хочешь, чтобы рука при команде "бей", сделала хук, а не джеб, поставь нужного гнома, и не парься. Или еще дальше. Скажи руке "действуй", и один тип руки ударит джебом, другой - хуком, а третий почешет спину.

L — Liskov Substitution (Принцип подстановки Лисков)

Как описано выше, головному гному все равно что за рука, главное, что она понимает команду "бей" или "действуй".

Это и есть принцип Лисков: все подклассы (гномы) должны работать так, чтобы их можно было подставить на место базового (руки), не ломая логику.

I — Interface Segregation (Разделение интерфейсов)

Когда головной гном говорит: "прыгай!" — не все гномы обязаны уметь прыгать. Это делает только гном-нога, у которого есть "интерфейс прыжка".

Важно, что гномы реализуют только нужные способности, не перегружая себя лишними знаниями. Ведь дога не нанесет хук, а рука не будет бегать. Никто не страдает от того, что его заставили делать лишнее. В коде это значит: не лепи в интерфейс всё подряд.

D — Dependency Inversion (Инверсия зависимостей)

Голова не знает, кто именно играет роль руки. Она просто отдаёт команду: "действуй" — и какая-то рука (любая) её выполняет: бьет или спинку чешет.

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

Вывод

Мегагном — это буквально наглядный пример SOLID-архитект