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

Какие знаешь подходы написания кода?

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

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

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

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

Подходы написания кода в Python

Существует множество методологий и подходов к организации разработки и написанию кода. Каждый имеет свои преимущества и подходит для разных сценариев.

1. Imperative Programming (Императивное программирование)

# Описываем ШТО нужно делать и КАК это делать

def sum_numbers(numbers):
    """Пошаговое описание процесса"""
    total = 0
    for num in numbers:
        total = total + num  # Явно описываем как складывать
    return total

result = sum_numbers([1, 2, 3, 4, 5])
print(result)  # 15

# ✅ Плюсы:
# - Прямолинейно и понятно
# - Полный контроль над процессом
# - Хорошо для новичков

# ❌ Минусы:
# - Много кода
# - Сложнее переиспользовать
# - Сложнее тестировать

2. Declarative Programming (Декларативное программирование)

# Описываем ЧТО нужно, а не КАК это делать

def sum_numbers(numbers):
    """Описываем желаемый результат"""
    return sum(numbers)  # Используем встроенную функцию

result = sum_numbers([1, 2, 3, 4, 5])
print(result)  # 15

# Декларативный стиль с list comprehension
even_numbers = [x for x in range(10) if x % 2 == 0]
print(even_numbers)  # [0, 2, 4, 6, 8]

# Декларативный стиль с map и filter
from functools import reduce

result = list(map(lambda x: x * 2, filter(lambda x: x % 2 == 0, range(10))))
print(result)  # [0, 4, 8, 12, 16]

# ✅ Плюсы:
# - Меньше кода
# - Более читаемо
# - Проще тестировать

# ❌ Минусы:
# - Требует хорошего знания стандартной библиотеки
# - Иногда менее очевидно

3. Object-Oriented Programming (ООП)

# Организуем код в классы и объекты

class Animal:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age
    
    def speak(self) -> str:
        return f"{self.name} makes a sound"

class Dog(Animal):
    def speak(self) -> str:
        return f"{self.name} barks"

class Cat(Animal):
    def speak(self) -> str:
        return f"{self.name} meows"

dog = Dog("Rex", 5)
cat = Cat("Whiskers", 3)

print(dog.speak())  # Rex barks
print(cat.speak())  # Whiskers meows

# ✅ Плюсы:
# - Инкапсуляция
# - Наследование
# - Полиморфизм
# - Модульность

# ❌ Минусы:
# - Может быть оверинжиниринг для простых задач
# - Более сложный код

4. Functional Programming (Функциональное программирование)

# Функции как first-class объекты
from functools import reduce
from typing import Callable

# Чистые функции (без побочных эффектов)
def pure_add(a: int, b: int) -> int:
    return a + b

def pure_multiply(a: int, b: int) -> int:
    return a * b

# Функции высшего порядка
def apply_operation(a: int, b: int, op: Callable) -> int:
    return op(a, b)

print(apply_operation(3, 4, pure_add))      # 7
print(apply_operation(3, 4, pure_multiply)) # 12

# map, filter, reduce
numbers = [1, 2, 3, 4, 5]
result = reduce(lambda a, b: a + b, map(lambda x: x * 2, numbers))
print(result)  # 30

# ✅ Плюсы:
# - Легче тестировать
# - Нет побочных эффектов
# - Параллелизм проще

# ❌ Минусы:
# - Требует другого мышления
# - Иногда менее производительно

5. Procedural Programming (Процедурное программирование)

# Организация кода в процедуры/функции

def read_file(filename: str) -> list:
    with open(filename, 'r') as f:
        return f.readlines()

def process_data(data: list) -> list:
    return [line.strip() for line in data if line.strip()]

def save_result(filename: str, data: list) -> None:
    with open(filename, 'w') as f:
        f.writelines(data)

def main():
    data = read_file("input.txt")
    processed = process_data(data)
    save_result("output.txt", processed)

if __name__ == "__main__":
    main()

# ✅ Плюсы:
# - Простой и понятный
# - Легко отладить
# - Хорошо для скриптов

# ❌ Минусы:
# - Сложнее масштабировать
# - Переиспользование кода затруднено

6. Test-Driven Development (TDD)

# 1. Написать тест (RED)
import pytest

def test_add():
    assert add(2, 3) == 5
    assert add(-1, 1) == 0

# 2. Написать минимальный код (GREEN)
def add(a, b):
    return a + b

# 3. Улучшить код (REFACTOR)
def add(a: int, b: int) -> int:
    """Сумма двух чисел."""
    return a + b

# ✅ Плюсы:
# - Код покрыт тестами
# - Меньше багов
# - Документация через тесты

# ❌ Минусы:
# - Требует времени
# - Нужно планировать

7. Domain-Driven Design (DDD)

# Организуем код вокруг предметной области

# Domain Model
class User:
    def __init__(self, user_id: int, email: str):
        self.user_id = user_id
        self.email = email
    
    def change_email(self, new_email: str) -> None:
        if not self._is_valid_email(new_email):
            raise ValueError("Invalid email")
        self.email = new_email
    
    @staticmethod
    def _is_valid_email(email: str) -> bool:
        return "@" in email and "." in email

# Application Service
class ChangeUserEmailService:
    def __init__(self, user_repository):
        self.user_repository = user_repository
    
    def execute(self, user_id: int, new_email: str) -> None:
        user = self.user_repository.find_by_id(user_id)
        user.change_email(new_email)
        self.user_repository.save(user)

# ✅ Плюсы:
# - Фокус на бизнес-логике
# - Простота поддержки
# - Модульность

# ❌ Минусы:
# - Больше кода
# - Требует опыта

8. SOLID Principles

# S — Single Responsibility Principle
class EmailService:  # Только отправка email
    def send(self, to: str, subject: str, body: str) -> None:
        pass

# O — Open/Closed Principle
class PaymentProcessor:
    def process(self, payment, method):
        if isinstance(method, CreditCard):
            # Обработка
            pass
        elif isinstance(method, PayPal):
            # Обработка
            pass
        # Плохо! Нужен else для каждого нового метода

# Лучше:
class PaymentProcessor:
    def process(self, payment, method):
        method.pay(payment)  # Метод сам знает как себя обработать

# L — Liskov Substitution
class Bird:
    def fly(self): pass

class Penguin(Bird):
    def fly(self):
        raise NotImplementedError()  # Плохо! Нарушает контракт

# I — Interface Segregation
class Worker:
    def work(self) -> None: pass
    def eat(self) -> None: pass  # Робот не ест!

# Лучше:
class Workable:
    def work(self) -> None: pass

class Eatable:
    def eat(self) -> None: pass

class Human(Workable, Eatable):
    pass

class Robot(Workable):
    pass

# D — Dependency Inversion
class UserService:
    def __init__(self, db):  # Зависит от абстракции
        self.db = db  # Может быть любой реализацией

9. KISS (Keep It Simple, Stupid)

# ❌ Сложно
def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

# ✅ Просто
from sympy import isprime
print(isprime(17))  # True

# Правило: используй встроенные и проверенные решения

10. DRY (Don't Repeat Yourself)

# ❌ Повтор кода
def validate_email(email):
    if "@" not in email:
        return False
    return True

def validate_phone(phone):
    if len(phone) < 10:
        return False
    return True

def validate_name(name):
    if len(name) < 2:
        return False
    return True

# ✅ Переиспользуемый код
from typing import Callable

def validate(value: str, validator: Callable[[str], bool]) -> bool:
    return validator(value)

validate_email = lambda e: "@" in e
validate_phone = lambda p: len(p) >= 10
validate_name = lambda n: len(n) >= 2

11. Clean Code Principles

# ❌ Нечитаемо
def calc(a, b, c):
    return a + b * c

# ✅ Читаемо
def calculate_total_price(base_price, quantity, tax_rate):
    subtotal = base_price * quantity
    tax = subtotal * tax_rate
    return subtotal + tax

# Правила:
# - Хорошие имена переменных
# - Короткие функции (одна ответственность)
# - Избегать магических чисел
# - Комментарии только где нужно
# - Консистентное форматирование

12. Agile Development

# Итеративная разработка с частыми релизами

# Sprint 1: MVP
# - Базовая функциональность
# - Быстрый выпуск

# Sprint 2: Доработка
# - Улучшения по feedback'у
# - Новые feature'ы

# Sprint 3: Оптимизация
# - Performance
# - Стабильность

# ✅ Плюсы:
# - Быстрая обратная связь
# - Адаптивность
# - Регулярные релизы

Сравнительная таблица

Подход              | Сложность | Тестируемость | Масштабируемость
==================================================================
Imperative          | Низкая    | Средняя       | Низкая
Declarative         | Средняя   | Средняя       | Средняя
OOP                 | Высокая   | Высокая       | Высокая
Functional          | Высокая   | Очень высокая | Средняя
Procedural          | Низкая    | Средняя       | Низкая
TDD                 | Средняя   | Высокая       | Высокая
DDD                 | Высокая   | Высокая       | Высокая
SOLID + Clean Code  | Высокая   | Высокая       | Высокая

Как выбрать подход?

# Скрипт или простая задача
→ Imperative + Procedural

# Web приложение
→ OOP + SOLID + Clean Code

# Обработка данных
→ Declarative + Functional

# Критичное приложение
→ TDD + DDD

# Стартап
→ Agile + MVP подход

# Крупный проект
→ DDD + SOLID + TDD

Итоги

Основные подходы:

  • Imperative — как делать
  • Declarative — что нужно
  • OOP — классы и объекты
  • Functional — функции и преобразования
  • TDD — тест сначала
  • DDD — бизнес в центре
  • SOLID/Clean Code — хороший дизайн
  • Agile — итеративный процесс

Лучший подход — комбинация нескольких в зависимости от контекста