(и, вероятно, нажить себе врагов в техническом сообществе)

Да… так что на этот раз я буду делать что-то немного другое.

Думаю, у меня есть способ объяснить, как SOLID работает с LEGO! И… я уже готовлюсь к тому, что люди сделают из меня врага из-за этого.

Что такое ТВЕРДЫЙ?

Определение учебника (также известного как Википедия):

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

Его продвигал дядя Боб, а аббревиатуру ввел Майкл Фезерс.

И даже без использования всех принципов SOLID ваш код всегда будет лучше.

Кстати… Знаю ли я все, что нужно знать о SOLID? Неееет.

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

Чтобы понять, о чем я говорю, я предполагаю, что вы знаете, что такое LEGO, потому что если вы не знаете… что ж… мне вас жаль… (или Добро пожаловать на Землю!)

S: Принцип единоличной ответственности

Не должно быть более одной причины для изменения класса.

Взгляните еще раз на обложку… почему так много разных частей? Потому что каждый… делает ОДНУ вещь.

Допустим, вы делаете что-то из LEGO. Если вам нужен желтый кирпич, вам не нужно вырезать еще один, больший кусок, вам просто нужен один кусок, который вы хотите. Вам нужен другой цвет? Не нужно его перекрашивать, просто возьмите соответствующий кусок.

Сами части никогда не меняются!

O: Принцип открытого-закрытого.

Программные объекты должны быть открыты для расширения, но закрыты для модификации.

Можете ли вы изменить кирпич LEGO? Нет, ты не можешь.

Но что, если вам нужен кусок побольше? Вы либо возьмете уже больший кусок, либо «сделаете один», объединив кусочки поменьше.

Каждый кирпич неизменен сам по себе, как вы это делаете? Вы используете ручки и трубки, чтобы соединить их друг с другом… вы расширяете их, не изменяя их!

L: принцип подстановки Лисков

Функции, использующие указатели или ссылки на базовые классы, должны иметь возможность использовать объекты производных классов, не зная об этом.

Это небольшой трюк только с LEGO… Но подумайте так: что, если я напечатаю деталь в 3D?

Ручки и трубки в любом из них не заботятся о том, есть ли бренд (или правильный бренд), их заботит только то, подходит он или нет.

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

Многие клиентские интерфейсы лучше, чем один интерфейс общего назначения.

Опять же… посмотрите на обложку. Было бы вообще возможно сделать что-нибудь, если бы части хотели быть ВСЕМИ частями?

У вас был бы один большой кусок, которого было бы слишком много на все случаи жизни. Может быть, все, что вы хотели, это маленький кирпич с одной ручкой, но вместо этого у вас есть гигантская вещь, которая… просто не подходит. Если он не будет использовать все… вы просто используете правильный элемент для работы.

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

Зависит от абстракций, а не от конкретики.

Это больше, чем просто пластиковые детали, у вас есть вещи, сделанные из LEGO, в которые вы не поверите! Электрические игрушки, протезы конечностей, дроны…

И как это возможно? Вы когда-нибудь видели двигатели, батареи, печатные платы с ручками и трубками? Нет, потому что они вам не нужны.

Вы «прячете» их за абстракцией, в которой будут ручки и трубки, и эта абстракция соединяется со всем остальным. Вам не нужны специальные детали, которые подходят к LEGO, вам просто нужно инкапсулировать его таким образом, чтобы вы могли использовать его вместо этого.

Маленькие кусочки, которые вы собираете, один за другим, умножаете на кратные, и из них получаются более крупные и сложные вещи… LEGO и программирование… кто же знал?

Фото на обложке Xavi Cabrera на Unsplash