Говорят, в Королевстве Кода однажды поселился страшный дракон Спагеттиус. Он пожирал проекты и превращал их в хаос ошибок. Тогда Великий Архитектор созвал пятерых рыцарей, которые поклялись защищать программистов. Каждый рыцарь нёс свой закон.
S — Sir Single Responsibility (Принцип единственной ответственности)
В королевстве жил Класс-Повар, который и готовил еду, и собирал налоги, и управлял армией:
class RoyalManager {
public void cookFood() {
System.out.println("Готовлю еду...");
}
public void collectTaxes() {
System.out.println("Собираю налоги...");
}
public void leadArmy() {
System.out.println("Веду армию в бой!");
}
}
Но когда дракон напал, повар забыл о супе, налогах и войне одновременно. Королевство погрузилось в хаос.
Тогда рыцарь объявил:
— Каждый должен делать своё дело.
class Chef {
public void cookFood() {
System.out.println("Готовлю еду...");
}
}
class TaxCollector {
public void collectTaxes() {
System.out.println("Собираю налоги...");
}
}
class General {
public void leadArmy() {
System.out.println("Веду армию в бой!");
}
}
Теперь каждый выполнял только одну обязанность, и порядок был восстановлен.
⚔️ O — Lady Open-Closed (Принцип открытости/закрытости)
В замке жили заклинатели налогов. Но каждый раз, когда появлялся новый налог, они переписывали старые заклинания. Код ломался.
class TaxCalculator {
public double calculateTax(String type, double amount) {
if ("income".equals(type)) {
return amount * 0.13;
} else if ("property".equals(type)) {
return amount * 0.02;
} else {
return 0;
}
}
}
Lady Open-Closed провозгласила:
— Не разрушай то, что работает. Добавляй новое, не ломая старое.
interface Tax {
double calculate(double amount);
}
class IncomeTax implements Tax {
public double calculate(double amount) {
return amount * 0.13;
}
}
class PropertyTax implements Tax {
public double calculate(double amount) {
return amount * 0.02;
}
}
class TaxCalculator {
public double calculateTax(Tax tax, double amount) {
return tax.calculate(amount);
}
}
Теперь появлялись новые налоги без переписывания старых.
🧭 L — Sir Liskov Substitution (Принцип подстановки Барбары Лисков)
Однажды решили заменить боевого коня на страуса. Но страус не мог скакать!
class Horse {
public void ride() {
System.out.println("Скачу в бой!");
}
}
class Ostrich extends Horse {
@Override
public void ride() {
throw new UnsupportedOperationException("Я не умею скакать!");
}
}
Армия осталась без кавалерии.
Рыцарь сказал:
— Если заменяешь наследника на родителя — всё должно работать так же.
interface Rideable {
void ride();
}
class Horse implements Rideable {
public void ride() {
System.out.println("Скачу в бой!");
}
}
class Camel implements Rideable {
public void ride() {
System.out.println("Спокойно иду по пустыне.");
}
}
Теперь любого скакуна можно заменить другим — армия не теряет строй.
⚙️ I — Lady Interface Segregation (Принцип разделения интерфейсов)
В королевстве был свиток “Все-Законы”. Каждый подданный должен был читать его целиком: и про магию, и про налоги, и про войну.
interface KingdomDuties {
void cookFood();
void fight();
void collectTaxes();
}
Даже мирные крестьяне должны были уметь сражаться и собирать налоги.
Lady Interface Segregation заявила:
— Пусть каждый читает только то, что ему нужно.
interface Cook {
void cookFood();
}
interface Warrior {
void fight();
}
interface TaxCollector {
void collectTaxes();
}
class Peasant implements Cook {
public void cookFood() {
System.out.println("Варю похлёбку.");
}
}
class Soldier implements Warrior {
public void fight() {
System.out.println("Сражаюсь с врагами!");
}
}
Теперь каждый выполнял лишь свою обязанность.
🧙 D — Lord Dependency Inversion (Принцип инверсии зависимостей)
Программисты писали коды-заклинания, которые зависели от конкретных мечей. Но если меч ломался — всё рушилось.
class Sword {
public void attack() {
System.out.println("Удар мечом!");
}
}
class Warrior {
private Sword sword = new Sword();
public void fight() {
sword.attack();
}
}
Lord Dependency Inversion:
— Пусть герои зависят от идей, а не от деталей.
interface Weapon {
void attack();
}
class Sword implements Weapon {
public void attack() {
System.out.println("Удар мечом!");
}
}
class Bow implements Weapon {
public void attack() {
System.out.println("Выстрел из лука!");
}
}
class Warrior {
private Weapon weapon;
public Warrior(Weapon weapon) {
this.weapon = weapon;
}
public void fight() {
weapon.attack();
}
}
Теперь воин мог взять меч, лук или копьё — и быть готовым к битве.
Когда пять рыцарей объединили силы, Королевство Кода стало непобедимым. Дракон Спагеттиус был повержен, и каждый ученик, кто хотел стать мастером, проходил через их школу.
И до сих пор программисты вспоминают: SOLID — это не сухая теория, а пять рыцарей, которые хранят наш код от хаоса.
Top comments (0)