← Назад к вопросам
Какие знаешь принципы программирования?
1.8 Middle🔥 111 комментариев
#Python Core#Архитектура и паттерны
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Принципы программирования
SOLID
Это 5 основных принципов объектно-ориентированного дизайна.
1. Single Responsibility Principle (SRP)
Каждый класс или функция должна иметь одну ответственность.
# Плохо - класс имеет несколько ответственностей
class User:
def __init__(self, name, email):
self.name = name
self.email = email
def save_to_database(self):
pass
def send_email_notification(self):
pass
def generate_report(self):
pass
# Хорошо - разделяем ответственность
class User:
def __init__(self, name, email):
self.name = name
self.email = email
class UserRepository:
def save(self, user):
pass
class EmailService:
def send_notification(self, user):
pass
2. Open/Closed Principle (OCP)
Класс открыт для расширения, но закрыт для модификации.
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 PayPalPayment(PaymentMethod):
def process(self, amount: float) -> bool:
return True
class PaymentProcessor:
def process(self, payment: PaymentMethod, amount: float):
return payment.process(amount)
3. Liskov Substitution Principle (LSP)
Объекты подтипов должны корректно заменять объекты базовых типов.
class Bird:
def eat(self):
pass
class FlyingBird(Bird):
def fly(self):
pass
class Eagle(FlyingBird):
def fly(self):
return "Eagle is flying"
class Penguin(Bird):
def swim(self):
return "Penguin is swimming"
4. Interface Segregation Principle (ISP)
Интерфейсы должны быть специфичными для клиентов.
from abc import ABC, abstractmethod
class Workable(ABC):
@abstractmethod
def work(self):
pass
class Eatable(ABC):
@abstractmethod
def eat_lunch(self):
pass
class Developer(Workable, Eatable):
def work(self):
return "Writing code"
def eat_lunch(self):
return "Eating"
5. Dependency Inversion Principle (DIP)
Зависимости должны быть на абстракции.
from abc import ABC, abstractmethod
class DatabaseInterface(ABC):
@abstractmethod
def save(self, data):
pass
class UserService:
def __init__(self, db: DatabaseInterface):
self.db = db
def create_user(self, name):
self.db.save({"name": name})
DRY (Dont Repeat Yourself)
Не повторяй код - выноси в функции и классы.
def get_full_name(first: str, last: str) -> str:
return f"{first} {last}"
def get_user_full_name(user_id):
user = database.get_user(user_id)
return get_full_name(user["first_name"], user["last_name"]) if user else ""
KISS (Keep It Simple, Stupid)
Простое решение лучше сложного.
class DataProcessor:
def process(self, data: list) -> list:
return [item * 2 for item in data]
YAGNI (You Arent Gonna Need It)
Не добавляй функционал на будущее.
class User:
def __init__(self, name: str):
self.name = name
Composition over Inheritance
Предпочитай композицию наследованию.
class MovementBehavior:
def move(self):
pass
class Bird:
def __init__(self, behavior: MovementBehavior):
self.behavior = behavior
def move(self):
return self.behavior.move()
Explicit is Better Than Implicit
Явное лучше скрытого.
def process_numbers(numbers) -> list:
return [num * 2 for num in numbers if num != 0]
Принцип единственной ответственности в функциях
Каждая функция должна делать одно и делать это хорошо.
def validate_user_data(data: dict) -> tuple:
if not data.get("email"):
return False, "Email required"
return True, ""
def create_user(data: dict):
return User(name=data["name"], email=data["email"])
def handle_user_signup(data: dict) -> dict:
is_valid, error = validate_user_data(data)
if not is_valid:
return {"error": error}
user = create_user(data)
return {"success": True}
Главное — пиши код, который:
- Читаем
- Поддерживаем
- Тестируем
- Масштабируем
- Простой