Что такое HATEOAS

Ответ

Ответ не найден

Ответ 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'ов бабушке. А то получится как у того Герасима: и Муму утопить, и сад полить, и ещё перед барыней отчитаться — в итоге нихуя не выходит нормально, одна трагедия, блядь.