Pull to refresh
11
0
Нефедьев Георгий @gnefedev

Программист

Send message
Спасибо!
Сейчас подправлю код и уберу пункт из «побочных эффектов»
Та портянка кода конечно сложно, но просто надо разбивать все на слои и небольшие функции.

Конечно, в прод. коде я всё разбиваю на уровни и т.д… Но в случае корутин, такой необходимости нет.

Вот такой подход он неверный, тк он не реактивный.

Как раз метод объявлен как public Mono findByUniqueKey(...) {...}

Мне нужно выйти из метода без ошибки, если вернулся пустой Mono.
Буду благодарен, если расскажете как это сделать без Optional

Наоборот, оборачивание повсюду try...catch забирает кучу сил, а так есть разные методы как реагировать на ошибку и на каком уровне.

Это, конечно, дело вкуса, но для меня наоборот. Потому что надо возвращаться глазами и искать с какого места начинает работать обработка ошибки. Буквально на этой неделе нашёл у себя багу, что не все ошибки из метода логировались, как раз потому что не сразу видно на что навешен обработчик.
У нас в проекте такие же билдеры с наследованием как в статье. И они валидны, потому что родитель абстрактный. А в одном месте наслдеование только в билдерах, стоят они один и тот же immutable объект но с разным наполнением.
Недавно именно это понадобилось при написании DSL для тестов (factory тестовых данных).
class ApprenticeCustomization {
    var group: Group? = null
    var groupCustom: GroupCustomization.() -> Unit = {}
    fun group(custom: GroupCustomization.() -> Unit) {
        groupCustom = custom
    }
}

В итоге выходит синтаксис, где
var customGroup = factory.group { }
var apprentice = factory.apprentice {
    group = customGroup
}

это присвоение уже гового, а вот такой вызов
var apprentice = factory.apprentice {
    group {
        price = BigDecimal(3_000)
    }
}

это уже дефротная группа, но с переопределенной стоимостью занятий
Если что, в конфиг gradle можно вставлять любой код, который тебе заблогорассудится, потому что это просто groove код.

Именно жесткое сужение функционала делает ДСЛ полезным


Это действительно так. Но это же его минус. Сколько шаблонизаторов HTML? Сколько попыток сделать BDD фреймфорк? Все они имеют проблемы из-за того, что рано или поздно им требуется поддержка регулярного языка. От этого возникают специфичные конструкции для for, if и подобного (я боюсь считать сколько РАЗНЫХ вариантов for я видел на этом фоне, иногда по два в одном DSL).

С другой стороны оптимально спроектированный DSL будет иметь серьезные ограничения по использованию. На DSL по HTML от JetBrains, как я понял, нельзя нарисовать HTML, который не будет являться XHTML. В DSL по React не меньше ограничений, что и при использовании typeScript + React. И использование этих DSL в перемешку с регулярноым кодом будет просто дурным тоном, как дурной тон не отделять stateless компоненты в React и переносить логику в шаблонизаторы.
1) и как мне это комент вставлять, если я на react всё нарисовал?
3) спасибо за информацию. Категорическое нет для использования этой библиотеки в таком случае. Я и так не смог в своем вариенте символ рубля распечатать, но это я поленился нужный шрифт найти. А тут с кириллицей бороться.
Вы хотите сказать, что HTML — это не DSL? Или конфиг gradle — не DSL?
Вас, наверное, смущает слово language. Думаю, отличие DSL от набора функций в наличии своего синтакисиса/семантики. Так, возможность вызова тех или иных функций возможна только в опрделенном контексте. Код, написанный в это статье не позволяет вставить текст в tr или tr в td. К этому прибавляется минимизация чего-либо не связанного с доменной моделью.
Как яркий пример, можно написать DSL для тестирования в стиле BDD, который будет выглядеть вот так:
val button = ...
on click button check { ... }

Если это не новый маленький язык, то тогда DSL не существует.

Но генерирую для этого html на лету, а не беру со страницы

Так я ровно тоже самое делаю. Только бек у меня на java, а не node.

т.е. мне надо будет отпавить всю текущую страницу на бек с настроеными стилями для печати? А как пробросить стили?
А это уже не сочетается с page-break-before и page-break-inside. Скорее всего, эта библиотека переводит HTML в canvas и превращает это в pdf
Я, если честно, не знал, что есть page-break-before и page-break-inside.
К сожалению, это не решит всех проблем в моем случае. У меня упертый заказчик и ему нужна кнопка по которой скачивается PDF, а не открывается окно печати. Кроме того, не во всех браузерах получится конролировать ориентацию страницы.

PS Я не фронтендер на самом деле. Просто в этом проекте сложная админка и я его делаю один.
gradle kotlin frontend plugin не стал использовать. Шаг влево, шаг вправо — расстрел. Да и версии используемых компонент не контролируешь. Когда буду писать статью о настройке всей этой конструкции, попробую получить оптимальное время
У меня bundle отрабатывает за 6-7 секунд на подхват изменений. Наверняка можно сделать быстрее. Стартует, правда, долго изначально, но это не имеет значения вообще.
Список зависимостей
  "dependencies": {
    "react": "15.6.1",
    "react-dom": "15.6.1",
    "react-router-dom": "4.2.2",
    "react-sticky": "6.0.1",
    "primereact": "1.4.0",
    "chart.js": "2.7.2",
    "react-transition-group": "^2.2.1",
    "font-awesome": "^4.7.0",
    "classnames": "^2.2.5",
    "bigdecimal": "^0.6",
    "moment": "^2.20",
    "file-saver": "1.3.3"
  }


При этом перезапуск java сервера у меня с минуту идет (база, liqubase, spring...).
У вас 1.5 секунды с учетем перекомпиляции (хоть и инкрементной) запуска jvm и подобного?
Хороший пример, спасибо, я подумаю над этим.

И что такого плохого в лишнем слое абстракции?

То, что это новая библиотека, новые термины, новые ограничения, которые надо увязать со всем остальным. Чем меньше движущихся частей, тем легче поддерживать и писать новый код.
Представьте себе, что на вас регистрируют багу: на странице где-нибудь отрисовалось undefined. Вы смотрите на код — всё ок, вы пытаететь воспроизвести — не воспроизводится. И только через пару часов Вы выясняете, что это коллега Вася в это время выкатывал новый релиз без обратной совместимости и что надо просто Васе голову скрутить, а бага была только в процесе релиза.

Если бы была проверка на валидность json, то Вы бы не потратили несколько часов в такой ситуации.

Это не отрицает необходимость обратной совместимости api
Например показывать текущую страницу из основного списка на странице в заголовке, определяемым в Layout'e.

В своем проекте я это решил через наследование, что больше соответствовало моему случаю (header отличается для разных страниц). Вот пример

Про разделенные состояния я писал выше, что можно использовать синглетоны. Хотя, конечно, у меня были простые случаи. Если дадите реалистичный пример, когда это нужно, я подумаю более конкретно.

Удалить и проверить тесты… просто удаляйте пока компилируется

Я часто на работе сталкиваюсь с вопросом «а можем ли мы сделать то-то» и если я смогу получить ответ только изменяя код и тем более запуская тесты, то это будет слишком долго.
Именно так. Но такие синглетоны формируются вокруг точки применения, а не вокруг факта того, что они хранят глобальное состояние (что подразумевает «единая точка входа»). И они не добавляют новый слой абстракции
Спасибо за объяснения от Вас и от VolCh
У меня подобные проблемы встречались пару раз, но не в слишком сложной форме. Объявление пары синглетонов полностью решало задачу. Но у меня простой интерфейс, возможно, при более сложных взаимосвязях это и имеет смысл.
Да мне стоило по-другому сформулировать мысль. «практически ничего не вносит принципиально нового»

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity