← Назад к вопросам

Какие знаешь принципы разработки?

1.7 Middle🔥 161 комментариев
#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

SOLID принципы

Single Responsibility Principle (SRP) — класс должен иметь одну причину для изменения. Каждый класс отвечает за одну область функциональности.

# ❌ Плохо: класс делает слишком много
class User:
    def save_to_db(self):
        pass
    def send_email(self):
        pass
    def validate_password(self):
        pass

# ✅ Хорошо: разделена ответственность
class User:
    def validate_password(self) -> bool:
        return len(self.password) >= 8

class UserRepository:
    def save(self, user: User) -> None:
        db.commit(user)

class EmailService:
    def send(self, to: str, subject: str) -> None:
        smtp.send(to, subject)

Open/Closed Principle (OCP) — класс открыт для расширения, но закрыт для модификации. Используй наследование и абстракции.

# ❌ Плохо: нужно менять класс при добавлении нового типа
class PaymentProcessor:
    def process(self, payment_type: str, amount: float):
        if payment_type == "credit_card":
            pass
        elif payment_type == "paypal":
            pass

# ✅ Хорошо: расширяемо через наследование
from abc import ABC, abstractmethod

class PaymentMethod(ABC):
    @abstractmethod
    def process(self, amount: float) -> bool:
        pass

class CreditCardPayment(PaymentMethod):
    def process(self, amount: float) -> bool:
        return True

class PaymentProcessor:
    def process(self, method: PaymentMethod, amount: float) -> bool:
        return method.process(amount)

Liskov Substitution Principle (LSP) — подклассы должны быть заменяемы своими базовыми классами без нарушения функциональности.

Interface Segregation Principle (ISP) — клиент не должен зависеть от интерфейсов, которые он не использует.

Dependency Inversion Principle (DIP) — зависимости от абстракций, не от конкретных реализаций.

from abc import ABC, abstractmethod

class NotificationSender(ABC):
    @abstractmethod
    def send(self, to: str, body: str) -> None: pass

class EmailSender(NotificationSender):
    def send(self, to: str, body: str) -> None:
        pass

class NotificationService:
    def __init__(self, sender: NotificationSender):
        self.sender = sender

DRY, KISS, YAGNI

DRY (Don't Repeat Yourself) — не повторяй код. Выноси в функции и переиспользуй.

KISS (Keep It Simple, Stupid) — простое решение лучше сложного.

YAGNI (You Ain't Gonna Need It) — не добавляй функционал на будущее.

Clean Architecture

Слои: Domain → Application → Infrastructure → Presentation. Зависимости только внутрь. Это обеспечивает тестируемость и гибкость.