Каких принципов ты придерживаешься при написании кода?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Принципы чистого кода
Мой подход основан на нескольких ключевых принципах, которые делают код понятным, поддерживаемым и расширяемым.
DRY (Don't Repeat Yourself)
Избегаю дублирования кода, выношу повторяющуюся логику в отдельные функции и модули:
# ❌ Плохо
def calculate_total_for_user_a():
items = get_items()
return sum(item.price * item.quantity for item in items)
def calculate_total_for_user_b():
items = get_items()
return sum(item.price * item.quantity for item in items)
# ✅ Хорошо
def calculate_total(items):
return sum(item.price * item.quantity for item in items)
total_a = calculate_total(get_items())
total_b = calculate_total(get_items())
KISS (Keep It Simple, Stupid)
Приоритет простоте над сложностью. Нет оверинжиниринга:
# ❌ Сложное - не нужен класс для простой операции
class Calculator:
def __init__(self):
self.result = 0
def add(self, a, b):
self.result = a + b
return self.result
# ✅ Просто
def add(a, b):
return a + b
YAGNI (You Aren't Gonna Need It)
Не добавляю функционал "на будущее". Разрабатываю только то, что нужно сейчас:
# Не создаю универсальную систему плагинов, если нужна просто функция
# Не добавляю параметры, которые может когда-то потребоваться
Meaningful Names
Имена переменных, функций и классов должны быть явными и понятными:
# ❌ Непонятно
def process(d):
return [x for x in d if x[1] > 18]
# ✅ Понятно
def get_adult_users(users):
return [user for user in users if user.age > 18]
Small Functions
Функции должны быть небольшими и делать одно:
# ❌ Большая функция с множеством ответственности
def process_user_registration(user_data):
validate_email(user_data["email"])
hash_password(user_data["password"])
send_confirmation_email(user_data["email"])
save_to_database(user_data)
log_registration(user_data)
# ✅ Маленькие, сфокусированные функции
def validate_user(user_data):
return validator.validate(user_data)
def create_user(user_data):
user = User(**user_data)
user.set_password(user_data["password"])
return user
def register_user(user_data):
validate_user(user_data)
user = create_user(user_data)
user.save()
send_confirmation_email(user.email)
Type Hints
Использую type hints для улучшения читаемости и ловли ошибок:
from typing import List, Optional, Dict
def get_user_emails(users: List[User]) -> List[str]:
return [user.email for user in users]
def find_user(user_id: int) -> Optional[User]:
return User.query.get(user_id)
PEP 8
Следую стандартам Python: 4 пробела отступа, snake_case для переменных, PascalCase для классов:
class UserRepository: # PascalCase
def get_user_by_email(self, email: str): # snake_case
pass
Comments и Docstrings
Пишу понятные комментарии и docstrings. Хороший код не нуждается в комментариях, но документация важна:
def calculate_discount(price: float, discount_percent: float) -> float:
"""Вычисляет цену со скидкой.
Args:
price: Исходная цена
discount_percent: Процент скидки (0-100)
Returns:
Цена после применения скидки
"""
return price * (1 - discount_percent / 100)
Error Handling
Правильная обработка ошибок без игнорирования исключений:
# ❌ Плохо
try:
result = risky_operation()
except:
pass
# ✅ Хорошо
try:
result = risky_operation()
except ValueError as e:
logger.error(f"Invalid input: {e}")
raise
except DatabaseError as e:
logger.error(f"Database error: {e}")
raise
Testing First
Пишу тесты перед кодом (TDD подход) для гарантии качества и правильности:
def test_calculate_discount():
assert calculate_discount(100, 10) == 90.0
assert calculate_discount(200, 50) == 100.0
Эти принципы помогают создавать код, который легко читать, тестировать и поддерживать долгие годы.