сериализаторы и валидаторы. Как без бойлерплейта кастить url query string в го-типы? Хорошо ли то, чтобы url qs загонять в структуру?
2. В питон-мире есть очередь задач и celery. Что есть в го? Как распрелелять тяжелые задачки по воркерам? Rabbitmq тут вообше к месту будет?
1. это не кастинг, это парсинг 2. что ещё за тяжёлые задачки?
Наверное он просто очереди имеет ввиду
для этого у нас горутины
ну celery еще позволяет получить статус таски, перезапускать и тд
Дык это стейтфул. Если главный процесс того же веб-сервиса дохнет (kill), то дохнут и потоки. По логике надо разделить ответственность между приёмом “заявки” на вычисление и самими вычислениями. Это гуд делается через очереди. Грубо говоря, вычисление задачи занимает минуту. web-клиент не будет ждать минуту. Но он может придти позднее за результатом… Как-то такй
В го есть похожая на celery штука https://github.com/RichardKnop/machinery
значит речь о job scheduling system
1. Парсинг да (назовём десериализацией), но ещё нужно: демаршализация и валидация.
это делается в Parse
Есть 2 Query param: start-date | end-date Парсим по маске 2006-01-01, тут ясно. Красивее пока не нашёл. Валидация (псеводкод): * start-date < end-date * ! end-date > now * ! start-date > now - 1 day Куда по коду лучше помещать эти правила валидации пары значений. Сделать структуру типа DateRange и сделать к структуре функцию DateRange.Validate()? Или есть хорошие места, куда можно класть валидаторы? Имеется в виду http web server, ванильный сервер.
в обработчик запроса
ну можно конечно и func (DateRange) Validate(timeNow time.Time) error
Ох, такиж спагетти. Цепочка длинная. main -> handler -> parse QS |> parse Date |> validateDateRange -> validate end-date |> validate range |> validate start-date Пардон за обозначения -> — это цепь вызовов по коллтрейсу |> — это последовательные вызовы
этого я боялся увидеть / услышать…
Попробую, спасибо!
ничего не понял почему спагетти то? 1. парсим URL 2. парсим start date 3. парсим end date 4. валидируем date range
Страдает responsibility структуры как таковой. Задача структуры — инкапсуляция примитивных типов. Я на сокрытие данных структуры не уповаю (а некоторые могут и геттеры-сеттеры писать к структурам), но это что, получается, что я могу к структуре пририсовать мешанину методов разного уровня ответственности? И бизнес-валидация, и валидация данных? Эти привязки методов к структуре, конечно, хорошо… Но это ведь большие степени свободы гомнокодить (пардон)...
Возможно, у меня джанго мозга. Надеюсь, лечится. Мне стыдно =)
func ValidateDateRange(start, end time.Time, now time.Time) error вуаля
Да, так и сделал. timenow может вынести из параметров? (хотя, зависит от задач и логики)
не стоит выносить, тестинг облегчает
До тестинга не дошёл. А есть глобальные моки time.Now()?
зачем вам глобальные моки, если можно просто сказать функции какое сейчас время? Зачем усложнять?)
Жесть. Совсем другой мир. =))) Спасибо! >Зачем усложнять?) облегчение сигнатуры функции
облегчение сигнатуры функции засчёт усложнения всего))) невыгодный размен
усложнения тестов или глобального стейта
меня сейчас убьют? А что если создавать “контекст,” куда инъекцировать, например, текущее время реквеста на веб-сервисе, например? И эту жирную махину передавать в функции? 😱 Пардон, думаю, что бред.
Ну облегчение сигнатур.
ПОнял=)
ИМХО: оно того не стоит
KISS.
Обсуждают сегодня