Skip to content
IRC-CodingIRC-Coding
SOLIDSRPOCPLSPISPDIPClean CodeOOPКачество кода

SOLID принципы: SRP, OCP, LSP, ISP и DIP

SOLID принципы: Single Responsibility, Open-Closed, Liskov, Interface Segregation и Dependency Inversion с примерами.

S

schutzgeist

3 min read
SOLID принципы: SRP, OCP, LSP, ISP и DIP

Основы принципов SOLID

SOLID — это аббревиатура пяти принципов объектно-ориентированного проектирования, которые помогают создавать поддерживаемый, расширяемый и надёжный код.

Краткий обзор

SOLID: Single Responsibility, Open-Closed, Liskov Substitution, Interface Segregation, Dependency Inversion.

S — Single Responsibility (SRP)

Класс должен иметь только одну причину для изменения.

// Плохо: множество ответственности
class User {
  saveToDatabase() { /* DB */ }
  sendEmail() { /* E-Mail */ }
  validateEmail() { /* Validierung */ }
}

// Хорошо: разделение
class User {}
class UserRepository { save(u: User) {} }
class EmailService { send(u: User, msg: string) {} }

O — Open-Closed (OCP)

Открыт для расширения, закрыт для модификации.

// Плохо: нужно менять switch при новом типе
class DiscountCalculator {
  calculate(type: string): number {
    if (type === 'premium') return 0.8;
    if (type === 'vip') return 0.7;
    return 1.0;
  }
}

// Хорошо: Strategy Pattern
interface DiscountStrategy { getFactor(): number; }
class PremiumDiscount implements DiscountStrategy { getFactor() { return 0.8; } }
class VipDiscount implements DiscountStrategy { getFactor() { return 0.7; } }

L — Liskov Substitution (LSP)

Подтипы должны правильно заменять базовые типы.

// Плохо: пингвин не может летать
class Bird { fly() {} }
class Penguin extends Bird { fly() { throw new Error('Cannot fly'); } }

// Хорошо: правильная иерархия
interface Bird { layEgg(): void; }
interface FlyingBird extends Bird { fly(): void; }

I — Interface Segregation (ISP)

Клиент не должен зависеть от методов, которые он не использует.

// Плохо: толстый интерфейс
interface Worker { work(): void; eat(): void; sleep(): void; }

// Хорошо: разделённые интерфейсы
interface Workable { work(): void; }
interface Eatable { eat(): void; }

D — Dependency Inversion (DIP)

Зависеть от абстракций, а не от конкретных реализаций.

// Плохо: прямая зависимость
class OrderService {
  private repo = new MySQLDatabase();
}

// Хорошо: Dependency Injection
interface OrderRepository { save(order: Order): void; }
class OrderService {
  constructor(private repo: OrderRepository) {}
}

Обзор SOLID

ПринципЗначениеЦель
SRPSingle ResponsibilityОдин класс, одна ответственность
OCPOpen-ClosedРасширяемость без изменения кода
LSPLiskov SubstitutionПодтипы корректно заменяют базовые типы
ISPInterface SegregationМаленькие, специфичные интерфейсы
DIPDependency InversionАбстракция вместо конкретных реализаций

Ключевые моменты

  • SOLID как аббревиатура пяти принципов OOP-проектирования
  • SRP: одна причина для изменения на класс
  • OCP: расширение без модификации (Strategy Pattern)
  • LSP: подтипы должны соблюдать контракты
  • ISP: много маленьких интерфейсов
  • DIP: Dependency Injection, абстракция как зависимость

FAQ

1. За что стоит аббревиатура SOLID?

SRP, OCP, LSP, ISP, DIP.

2. Что говорит SRP?

Один класс, одна ответственность.

3. Что говорит OCP?

Открыт для расширения, закрыт для модификации.

4. Что говорит LSP?

Подтипы заменяют базовые типы.

5. Что говорит ISP?

Маленькие интерфейсы.

6. Что говорит DIP?

Абстракции вместо конкретных реализаций.

7. Кто придумал SOLID?

Robert C. Martin.

8. Пример нарушения LSP?

Penguin наследует от Bird, но не может летать.

9. Как реализовать OCP?

Strategy Pattern.

10. Что такое DI?

Внедрение зависимостей.

11. SOLID и Clean Code?

SOLID = проектирование, Clean Code = ещё и стиль.

12. Что такое Fat Interface?

Слишком много методов, нарушение ISP.

13. Когда применять SOLID?

При растущих проектах.

14. Можно ли переусложнить?

Да, в маленьких проектах может быть overengineering.

15. SOLID и тестирование?

DIP упрощает mocking, SRP делает тесты сфокусированными.

Продолжение в курсе SOLID

Следующий материал в серии SOLID посвящен анализу и проектированию: UML, GRASP, SOLID и качественные цели — как UML-диаграммы, GRASP-паттерны и принципы SOLID работают вместе в архитектуре программного обеспечения.

Источники

  1. https://en.wikipedia.org/wiki/SOLID
  2. https://www.oreilly.com/library/view/clean-code/9780134661742/
  3. https://refactoring.guru/design-patterns/solid-principles

Рекомендуемые книги по качеству кода

Если ты хочешь больше узнать о SOLID, Clean Code и качестве программного обеспечения, мы рекомендуем следующие книги:

Keine Bücher für Kategorie "software-engineering" gefunden.

Назад к блогу
Share:

Nächster Artikel in Качество программного обеспечения

Weiterlesen
AI Prompts для Clean Code: избегайте Spaghetti кода

Похожие статьи