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

Какие знаешь признаки нечистого кода?

1.0 Junior🔥 111 комментариев
#Python Core

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

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

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

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

Нечистый код — это, в первую очередь, код, который сложно поддерживать. Вот основные красные флаги, на которые я смотрю:

1. Нарушение SOLID принципов

Single Responsibility Principle (SRP)

Функция или класс делают слишком много:

# ❌ Плохо — одна функция делает всё
def process_user(user_data):
    # Валидация
    if not user_data.get("email"):
        raise ValueError("Email required")
    
    # Обработка БД
    db.save_user(user_data)
    
    # Отправка письма
    send_email(user_data["email"], "Welcome!")
    
    # Логирование
    logger.info(f"User created: {user_data}")

# ✅ Хорошо — разделена ответственность
def validate_user(user_data) -> bool:
    return bool(user_data.get("email"))

def save_user(user_data) -> User:
    return db.save_user(user_data)

def notify_user(email: str) -> None:
    send_email(email, "Welcome!")

def process_user(user_data):
    validate_user(user_data)
    user = save_user(user_data)
    notify_user(user.email)

2. Дублирование кода (DRY нарушение)

Одинаковый код повторяется в разных местах:

# ❌ Плохо — дублирование
def get_user_data(user_id):
    connection = get_db_connection()
    result = connection.execute(f"SELECT * FROM users WHERE id = {user_id}")
    connection.close()
    return result

def get_product_data(product_id):
    connection = get_db_connection()
    result = connection.execute(f"SELECT * FROM products WHERE id = {product_id}")
    connection.close()
    return result

# ✅ Хорошо — общая функция
def get_data(table: str, id: int):
    with get_db_connection() as connection:
        return connection.execute(f"SELECT * FROM {table} WHERE id = {id}")

3. Магические числа и строки

Жесткодированные значения без объяснения:

# ❌ Плохо
if user.age > 18 and user.balance > 1000:
    grant_access()

# ✅ Хорошо
MIN_AGE = 18
MIN_BALANCE = 1000

if user.age > MIN_AGE and user.balance > MIN_BALANCE:
    grant_access()

4. Слишком длинные функции

Функции больше 20-30 строк — часто признак нарушения SRP:

# ❌ Плохо — функция в 50+ строк
def create_report():
    # 10 строк на получение данных
    # 15 строк на обработку
    # 20 строк на форматирование
    # 5 строк на отправку
    pass

# ✅ Хорошо — маленькие, понятные функции
def create_report():
    data = fetch_data()
    processed = process_data(data)
    formatted = format_report(processed)
    send_report(formatted)

5. Плохие имена переменных

# ❌ Плохо — непонятные имена
def calc(x, y):
    temp = x * 2 + y
    result = temp / 100
    return result * 0.85

# ✅ Хорошо — ясные имена
def calculate_discounted_price(base_price: float, quantity: int) -> float:
    subtotal = base_price * quantity
    tax = subtotal / 100  # 1% налог
    discount_rate = 0.85  # 15% скидка
    return subtotal * discount_rate

6. Глубокие вложенности

# ❌ Плохо — 5+ уровней вложенности
if user:
    if user.is_active:
        if user.has_permission("admin"):
            if check_time():
                if validate_data():
                    do_something()

# ✅ Хорошо — Guard clauses
def perform_action():
    if not user or not user.is_active:
        return
    if not user.has_permission("admin"):
        return
    if not check_time():
        return
    if not validate_data():
        return
    do_something()

7. Побочные эффекты

Функция не только возвращает результат, но и изменяет состояние:

# ❌ Плохо — побочный эффект
global counter

def get_next_id():
    global counter
    counter += 1  # Побочный эффект!
    return counter

# ✅ Хорошо — pure function
def get_next_id(current_id: int) -> int:
    return current_id + 1

8. Игнорирование ошибок

# ❌ Плохо — silent failures
try:
    save_to_database(data)
except:
    pass  # Что-то пошло не так, но мы не знаем что

# ✅ Хорошо — обработка ошибок
try:
    save_to_database(data)
except DatabaseError as e:
    logger.error(f"Failed to save user: {e}", exc_info=True)
    raise

9. Отсутствие типизации

# ❌ Плохо
def process(data):
    return data.get("value") * 2

# ✅ Хорошо
def process(data: Dict[str, int]) -> int:
    return data.get("value", 0) * 2

10. Комментарии вместо кода

# ❌ Плохо — нужны комментарии, чтобы понять
# Проверяем, что пользователь минимум 18 лет
# и не заблокирован в системе
if u.a > 18 and not u.b:
    grant()

# ✅ Хорошо — код сам себя описывает
if user.is_adult() and not user.is_blocked():
    grant_access()

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

  • pylint — проверяет код на соответствие стилям
  • flake8 — проверяет PEP8
  • black — автоформатирование
  • mypy — проверка типов
  • complexity — сложность функций

Итог

Чистый код — это код, который:

  • Легко читать — нетривиальный разработчик поймёт за несколько секунд
  • Легко изменять — можно добавить фичу без переписывания половины системы
  • Легко тестировать — нет побочных эффектов, можно изолировать
  • Легко масштабировать — не запутается при добавлении новых требований