Ответ
Ответ не найден
Ответ 18+ 🔞
Да ты посмотри, что творится-то! Вот сидишь ты, такой весь из себя, пишешь на Python, думаешь: "Ну я ж умный, блядь, всё по канонам, всё по SOLID'у". А потом раз — и на тебе, какая-нибудь дичь в продакшене, и ты уже не умный, а просто мудак с горящими глазами и логами до хуя.
Вот, например, возьмём эту классическую, блядь, проблему. Смотри сюда, я тебе щас покажу, где собака зарыта, а точнее, где она насрала в твой красивый код.
Допустим, есть у тебя функция, которая должна данные обработать. И пишешь ты её, как полагается:
def process_data(data):
# Всё чётко, всё тип-топ
result = []
for item in data:
processed_item = do_something_complex(item)
result.append(processed_item)
return result
И вроде бы всё пиздато. Но потом приходит время, и тебе надо не просто обработать, а ещё и залогировать каждый шаг, на случай если всё пиздец как накроется. И что делает наш брат-программист? Правильно, начинает пихать print или logging.info прямо в цикл!
def process_data(data):
result = []
for index, item in enumerate(data):
logging.info(f"Начинаю обработку элемента {index}: {item}") # Первый пиздец
processed_item = do_something_complex(item)
logging.info(f"Элемент {index} обработан: {processed_item}") # Второй пиздец
result.append(processed_item)
return result
И вот она, сука, ошибка! Ты смешал, блядь, бизнес-логику (обработку данных) с кроссистемной хуйнёй (логированием). Это как Герасим, который и сад полить должен, и Муму не утопить. Получается пиздопроебищно.
Правильно-то как? А правильно — отделить мух от котлет, блядь! Пусть одна функция занимается своим делом, а другая — своим. Вот смотри, красота:
def process_item(item):
# Чистая бизнес-логика, нихуя лишнего
return do_something_complex(item)
def process_data_with_logging(data):
result = []
for index, item in enumerate(data):
logging.info(f"Начинаю обработку элемента {index}: {item}")
processed_item = process_item(item) # Вот тут чистая логика
logging.info(f"Элемент {index} обработан: {processed_item}")
result.append(processed_item)
return result
Видишь разницу? Первая функция — она простая, её проще тестировать, ебать её в сраку. Она делает одно дело и не парится. А вторая — это уже обёртка, которая добавляет своё говно в виде логов. И если завтра логирование нахуй не нужно будет, ты просто выкинешь вторую функцию и будешь использовать первую. Красота, ёпта!
А то ведь бывает так: подходит к тебе тимлид и говорит: "А давай-ка мы вместо логов в файл теперь будем в базу их писать, да ещё и метрики собирать". И если у тебя всё в одном месте завязано, ты будешь переписывать половину кода, а если разделил — поправишь одну обёртку и всё, в рот меня чих-пых, готово.
Так что запомни, чувак: самый важный принцип — это "Единственная ответственность". Одна функция — одна причина для изменения. Не пытайся впихнуть в неё всё, от обработки данных до отправки email'ов бабушке. А то получится как у того Герасима: и Муму утопить, и сад полить, и ещё перед барыней отчитаться — в итоге нихуя не выходит нормально, одна трагедия, блядь.