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

Что такое чистый код?

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

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

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

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

Чистый код (Clean Code)

Чистый код — это хорошо организованный, легко читаемый, понятный и поддерживаемый код, который решает проблему эффективно и безопасно. Это не только о том, что код работает, но и о том, КАК он написан и КАК его поддерживать в будущем.

Принципы чистого кода

1. Понятные имена

Имена переменных, функций и классов должны ясно описывать их назначение:

# Плохо
def calc(d):
    return d * 0.2

# Хорошо
def calculate_discount(price):
    return price * 0.2

# Плохо
x = [1, 2, 3, 4, 5]
for i in x:
    print(i ** 2)

# Хорошо
numbers = [1, 2, 3, 4, 5]
for number in numbers:
    print(number ** 2)

2. Функции должны быть маленькими и иметь одну ответственность

# Плохо — функция делает слишком много
def process_user_data(user_id):
    user = db.query(user_id)
    if not user:
        raise ValueError("User not found")
    user.last_login = datetime.now()
    db.save(user)
    send_email(user.email, "Login notification")
    log_action(user_id, "login")
    update_cache(user_id, user)
    return user

# Хорошо — каждая функция отвечает за одно
def get_user(user_id):
    user = db.query(user_id)
    if not user:
        raise ValueError("User not found")
    return user

def update_last_login(user):
    user.last_login = datetime.now()
    db.save(user)

def notify_login(user):
    send_email(user.email, "Login notification")
    log_action(user.id, "login")

def process_user_login(user_id):
    user = get_user(user_id)
    update_last_login(user)
    notify_login(user)
    update_cache(user_id, user)
    return user

3. Избегай дублирования кода (DRY)

# Плохо — дублирование
def validate_email(email):
    if not email or '@' not in email:
        return False
    return True

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

# Хорошо — реиспользуемая функция
def is_valid(value, validator_func):
    if not value:
        return False
    return validator_func(value)

def has_at_symbol(email):
    return '@' in email

def has_min_length_10(phone):
    return len(phone) >= 10

if is_valid(email, has_at_symbol):
    pass

4. Комментарии должны объяснять ПОЧЕМУ, а не ЧТО

# Плохо
def calc_total(items):
    # Умножаем цену на количество
    total = sum(item.price * item.quantity for item in items)
    # Добавляем налог (20%)
    total = total * 1.2
    return total

# Хорошо
def calculate_total_with_tax(items):
    total = sum(item.price * item.quantity for item in items)
    # Добавляем налог 20% в соответствии с правилами РФ
    tax_rate = 0.2
    return total * (1 + tax_rate)

5. Обработка ошибок

# Плохо
try:
    result = do_something()
except:
    pass  # Игнорируем любые ошибки

# Хорошо
try:
    result = do_something()
except ValueError as e:
    logger.error(f"Invalid input: {e}")
    raise
except ConnectionError as e:
    logger.error(f"Database connection failed: {e}")
    raise

6. Форматирование и структура

# Плохо
def foo(x, y, z, a, b, c):
    d = x * y + z
    e = a + b
    f = d * e
    return f

# Хорошо
def calculate_total_cost(quantity, price, tax_rate, discount_rate):
    subtotal = quantity * price
    tax = subtotal * tax_rate
    discount = subtotal * discount_rate
    total = subtotal + tax - discount
    return total

7. SOLID принципы

# S — Single Responsibility
class UserRepository:
    def get_user(self, user_id):
        pass

class UserEmailNotifier:
    def notify(self, user):
        pass

# O — Open/Closed
class PaymentProcessor:
    def process(self, payment, strategy):
        return strategy.process(payment)

class CreditCardStrategy:
    def process(self, payment):
        pass

class PayPalStrategy:
    def process(self, payment):
        pass

# L — Liskov Substitution
class Animal:
    def make_sound(self):
        pass

class Dog(Animal):
    def make_sound(self):
        return "Woof"

# I — Interface Segregation
class Reader:
    def read(self):
        pass

class Writer:
    def write(self, data):
        pass

# D — Dependency Inversion
class UserService:
    def __init__(self, repository):
        self.repository = repository
    
    def get_user(self, user_id):
        return self.repository.get_user(user_id)

8. Тесты

# Чистый код должен быть легко тестируемым
def add(a, b):
    return a + b

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

9. Типизация

# Плохо — неясно, какие типы принимает функция
def process(data):
    return data.upper()

# Хорошо — ясно, какие типы и что возвращает
from typing import List, Dict

def process(text: str) -> str:
    return text.upper()

def process_items(items: List[Dict[str, int]]) -> int:
    return sum(item['value'] for item in items)

Признаки нечистого кода

  • Длинные функции (более 30 строк)
  • Функции с множеством параметров (более 3-4)
  • Вложенность более 3 уровней
  • Дублирование кода
  • Отсутствие типизации
  • Плохие имена переменных
  • Отсутствие или неправильная обработка ошибок
  • Код без тестов
  • Magic numbers и string константы
  • Побочные эффекты в неожиданных местах

Инструменты для проверки чистоты кода

  • pylint — статический анализ
  • flake8 — проверка стиля
  • black — автоматическое форматирование
  • mypy — проверка типов
  • pytest — тестирование
  • coverage — покрытие тестами

Выводы

Чистый код:

  • Легче читать и понимать
  • Проще поддерживать и модифицировать
  • Содержит меньше ошибок
  • Проще тестировать
  • Быстрее разрабатывается в долгосрочной перспективе

Книга "Clean Code" Роберта Мартина — обязательное чтение для профессионального разработчика. Чистый код — это не просто красивый код, это уважение к тем, кто будет его поддерживать.