DEV Community

Cover image for 🏰 Легенда о пяти рыцарях SOLID
Olga Lugacheva
Olga Lugacheva

Posted on

🏰 Легенда о пяти рыцарях SOLID

Говорят, в Королевстве Кода однажды поселился страшный дракон Спагеттиус. Он пожирал проекты и превращал их в хаос ошибок. Тогда Великий Архитектор созвал пятерых рыцарей, которые поклялись защищать программистов. Каждый рыцарь нёс свой закон.

S — Sir Single Responsibility (Принцип единственной ответственности)

sir s

В королевстве жил Класс-Повар, который и готовил еду, и собирал налоги, и управлял армией:

class RoyalManager {
    public void cookFood() {
        System.out.println("Готовлю еду...");
    }

    public void collectTaxes() {
        System.out.println("Собираю налоги...");
    }

    public void leadArmy() {
        System.out.println("Веду армию в бой!");
    }
}

Enter fullscreen mode Exit fullscreen mode

Но когда дракон напал, повар забыл о супе, налогах и войне одновременно. Королевство погрузилось в хаос.

Тогда рыцарь объявил:
— Каждый должен делать своё дело.

class Chef {
    public void cookFood() {
        System.out.println("Готовлю еду...");
    }
}

class TaxCollector {
    public void collectTaxes() {
        System.out.println("Собираю налоги...");
    }
}

class General {
    public void leadArmy() {
        System.out.println("Веду армию в бой!");
    }
}

Enter fullscreen mode Exit fullscreen mode

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

⚔️ 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;
        }
    }
}

Enter fullscreen mode Exit fullscreen mode

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);
    }
}

Enter fullscreen mode Exit fullscreen mode

Теперь появлялись новые налоги без переписывания старых.

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

dsir L

Однажды решили заменить боевого коня на страуса. Но страус не мог скакать!

class Horse {
    public void ride() {
        System.out.println("Скачу в бой!");
    }
}

class Ostrich extends Horse {
    @Override
    public void ride() {
        throw new UnsupportedOperationException("Я не умею скакать!");
    }
}

Enter fullscreen mode Exit fullscreen mode

Армия осталась без кавалерии.

Рыцарь сказал:
— Если заменяешь наследника на родителя — всё должно работать так же.

interface Rideable {
    void ride();
}

class Horse implements Rideable {
    public void ride() {
        System.out.println("Скачу в бой!");
    }
}

class Camel implements Rideable {
    public void ride() {
        System.out.println("Спокойно иду по пустыне.");
    }
}

Enter fullscreen mode Exit fullscreen mode

Теперь любого скакуна можно заменить другим — армия не теряет строй.

⚙️ I — Lady Interface Segregation (Принцип разделения интерфейсов)

В королевстве был свиток “Все-Законы”. Каждый подданный должен был читать его целиком: и про магию, и про налоги, и про войну.

interface KingdomDuties {
    void cookFood();
    void fight();
    void collectTaxes();
}

Enter fullscreen mode Exit fullscreen mode

Даже мирные крестьяне должны были уметь сражаться и собирать налоги.

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("Сражаюсь с врагами!");
    }
}

Enter fullscreen mode Exit fullscreen mode

Теперь каждый выполнял лишь свою обязанность.

🧙 D — Lord Dependency Inversion (Принцип инверсии зависимостей)

lord d

Программисты писали коды-заклинания, которые зависели от конкретных мечей. Но если меч ломался — всё рушилось.

class Sword {
    public void attack() {
        System.out.println("Удар мечом!");
    }
}

class Warrior {
    private Sword sword = new Sword();

    public void fight() {
        sword.attack();
    }
}

Enter fullscreen mode Exit fullscreen mode

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();
    }
}

Enter fullscreen mode Exit fullscreen mode

Теперь воин мог взять меч, лук или копьё — и быть готовым к битве.

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

И до сих пор программисты вспоминают: SOLID — это не сухая теория, а пять рыцарей, которые хранят наш код от хаоса.

Top comments (0)