Комментарии (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 — сложность функций
Итог
Чистый код — это код, который:
- Легко читать — нетривиальный разработчик поймёт за несколько секунд
- Легко изменять — можно добавить фичу без переписывания половины системы
- Легко тестировать — нет побочных эффектов, можно изолировать
- Легко масштабировать — не запутается при добавлении новых требований