Рубрики
Без рубрики

Читаемость для реального – использование значимых имен для запросов баз данных

Как избежать использования комментариев для описания неиспорченного запроса БД. Помечено Python, читабельность.

Любой, который на некоторое время запрограммировал и должен был разобраться с кем-то другим кодом, знает его (особенно когда этот кто-то сам, шесть месяцев назад). Может быть расстраиваемым попытаться понять, казалось бы, невинную кучу строк кода, но в конечном итоге думать «Что такое этот человек, подумал тогда?».

Я столкнулся с сценарием, похожим на тот, который мне удалось иметь неясные бизнес-правила, подверженные воздействию кода без использования комментариев. Вы видите, я сильно против использования комментариев. Для меня они должны использоваться в качестве последнего курорта, с ремонтом в качестве основного аргумента для этого. Мы все знаем, насколько легко комментарии могут выйти из синхронизации с кодом.

Представьте себе, что у вас есть дело на основе подписки, где ваши клиенты подписывают на разные планы, которые можно выплатить ежемесячно или ежегодно. Эта система сейчас работает на пару лет, и вам нужно выполнить несколько пакетных процессов для подписок на шесть часов, прежде чем они будут обновляться. Но это не должно быть для всех планов, вам нужно исключить подписки на планы «Partner Plus», как ежегодно, так и ежемесячные рецидивы.

Сначала это может показаться простым, но реальность в том, что в течение последних лет все время развивалось довольно свободно, и у вас нет простого удостоверения личности для каждого плана. На самом деле, вся концепция того, что такое «партнер плюс», зависит от разных вещей. Название плана должно иметь «партнер» на нем, но он не ограничен этим, только: «Партнер Agile Expo 15», «Партнер плюс», «Новый партнер плюс» и т. Д. Кроме того, цена является переменной, но, по крайней мере, всегда больше 249,00 для ежемесячно и 2490,00 для ежегодно.

Имея в виду, вы можете в конечном итоге с кодом, похожим на это (это код Python для приложения Django):

    subscriptions = Subscription.objects.filter(
        period_end__lte=datetime.now(timezone.utc) + timedelta(hours=6),
        active=True,
    ).exclude(
        "plan__plan_id__contains": "partner",
        "plan__recurrence": "MONTHLY",
        "plan__price__gt": Decimal('249.00')
    ).exclude(
        "plan__plan_id__contains": "partner",
        "plan__recurrence": "ANNUALLY",
        "plan__price__gt": Decimal('2490.00')
    )

Ну, основываясь на том, что я описал ранее, этот код красиво делает работу. Он смотрит на шесть часов и исключает планы, которые соответствуют партнеру плюс определение, верно?

Но, что, если через шесть месяцев, но новый член команды поручено изменить этот код. Сможет ли она понять Почему Это исключение делается? И какие предметы исключены? Скорее всего, ей нужно будет спросить немного.

Но теперь посмотрите на этот рефакторованный код:

    next_6_hours = datetime.now(timezone.utc) + timedelta(hours=6)

    partner_plus_monthly = {
        "plan__plan_id__contains": "partner",
        "plan__recurrence": "MONTHLY",
        "plan__price__gt": Decimal('249.00')
    }
    partner_plus_annually = {
        "plan__plan_id__contains": "partner",
        "plan__recurrence": "ANNUALLY",
        "plan__price__gt": Decimal('2490.00')
    }

    subscriptions = Subscription.objects.filter(
        period_end__lte=next_6_hours,
        active=True,
    ).exclude(
        **partner_plus_monthly
    ).exclude(
        **partner_plus_annually
    )

Теперь переменные несут контекст, и даже если новенький член команды не полностью его полностью получает, по крайней мере, она может быть более информирована, когда просим, она может начать с «Почему нам нужно исключить партнер плюс планы из этого запроса? “.

Дело с рефакторингами, ориентированными на чтение, состоит в том, что они склонны упускать из виду из-за, казалось бы, «низким воздействием», потому что вы знаете: «Это почти тот же код», – все в команде знает, что это означает «,« комментарий » линия будет делать это “и т. Д.

Ну, к тому, что я говорю: вызов себе! Писать о связи. Либо записывать прозу или код!

Прежде чем идти, я собираюсь покинуть следующую ссылку здесь (и во всех моих будущих статьях читаемости), потому что это была одна статья, которая открыла мой разум по этому вопросу И я продолжаю возвращаться к нему каждый сейчас, а затем: Функциональная длина Martin Fowler

Оригинал: “https://dev.to/alvarocavalcanti/readability-for-real—using-meaningful-names-for-database-queries-doc”