SOLID - это 5 принципов ООП
S: Single Responsibility Principle (Принцип единственной ответственности).
O: Open-Closed Principle (Принцип открытости-закрытости).
L: Liskov Substitution Principle (Принцип подстановки Барбары Лисков).
I: Interface Segregation Principle (Принцип разделения интерфейса).
D: Dependency Inversion Principle (Принцип инверсии зависимостей).
К чёрту программирование, объясняем на примере армии и военно-морского флота!
Для начала договоримся, что есть базовый тип военного человека - солдат. А есть рядовой Иванов, рядовой Петров, ефрейтор Сидоров, и майор Фролов - они тоже солдаты, но имеют индивидуальные отличия. Ещё есть военные специальности, например, танкист или разведчик. Это тоже солдаты, но танкистом может быть как рядовой, так и майор.
Принцип единственной ответственности
Правильный солдат должен уметь родину защищать, и более ничего. Правильный танкист - управлять танком, и более ничего. Ну и т.д.
Если нарушить этот принцип и нагрузить солдата дополнительной ответственностью (например, покраска травы), то это будет не солдат, а вооружённый маляр-садовод. Отсюда в армии разброд и шатание.
Но как научить конкретного рядового Иванова красить траву? Всё просто: когда надо родину защищать, будем считать Иванова солдатом; если надо красить траву - считаем его маляром.
И, соответственно, обращаться будем так: "Рядовой Иванов, как солдату приказываю защищать родину". Либо "Рядовой Иванов, ты маляр, крась траву". И родина спит спокойно, и трава зеленеет даже зимой.
Принцип открытости-закрытости
Хочешь переучить танкиста на разведчика? Не порть танкиста, лучше сделай нового солдата-разведчика.
Итак, у нас есть солдаты: пулеметчик и водитель танка. Хорошо бы определить, как они идут в атаку, например.
Неправильным решением будет завести специально обученного майора, которому мы скажем: "веди всех в атаку", и он будет командовать пулеметчику: "стреляй из пулемета", а водителю танка: "куды прёшь, враг в другой стороне!". А ну как нам понадобится лётчик? Придётся тогда майора учить отдельной команде "от винта!", а он уже устал.
Правильно будет обучить каждого солдата по-своему исполнять команду "в атаку", а майору дать громкоговоритель и научить команде "солдаты, в атаку". Тогда все, кто услышит эту команду, пойдут в атаку как умеют.
Принцип подстановки Барбары Лисков
Любой, кто является солдатом, должен уметь вести себя как солдат, неважно рядовой он или танкист.
Это значит, что товарищ генерал, для которого все солдаты на одно лицо, всё равно сможет командовать вообще любым солдатом. Если бы это было не так, то товарищ генерал не смог бы воевать по карте, ему пришлось бы подходить к каждому и объяснять, что от него требуется.
Принцип разделения интерфейса
Не надо учить солдата слишком разнообразным командам, иначе найдётся майор, который не будет знать все команды, и не сможет управлять солдатом.
То есть, пулеметчик, танкист и повар знают очень специфические команды (стреляй, газуй, вари), которые не обязан знать базовый солдат. Но чтобы повар смог приготовить обед, заведём начальника столовой, которому можно сказать "защищай родину", а тот транслирует приказ повару: "вари обед". И все.
Принцип инверсии зависимостей
Базовый солдат не должен знать про рядовых или разведчиков, но и рядовой и разведчик должны знать, что они солдаты. Причём рядовой-разведчик и майор-разведчик должны знать, что они разведчики и солдаты, а базовый разведчик знает что он солдат и не более того.
Другими словами, если надо отправить кого-то в разведку, то правильно взять любого разведчика и отправить его в разведку. Неправильно требовать для этого именно майора-разведчика, потому что кого дадут, того дадут, и нечего тут. Тем более, знаки различия снимут во избежание.
Кстати, сохраняется и принцип подстановки Барбары Лисков. Ведь все разведчики, независимо от звания, ведут себя как разведчики.