Pull to refresh

Comments 20

DSL для удобной работы с html

— это ужасно. Как забавный эксперимент годится, но активно работать с этим невозможно. С другой стороны я как то видел сайт, где HTML генерился хранимыми процедурами, — это было хуже (но код выглядел даже проще чем у Вас)
Вы считаете что это хуже jsp?
Подскажите как вы наполняете html страницу с стороны сервера?
ИМХО, вам имеет смысл посмотреть в сторону шаблонизаторов. Какой-нибудь Velocity или Groovy template engine.
UFO just landed and posted this here
Согласен, что это полезно только если нет разделения на frontend и backend разработку. Но если разделения нет можно делать очень удобные компоненты, например
Кусок кода, который можно вызвать внутри table и он заполнит его
   fun <T>TABLE.generate(arr: Collection<T>, vararg rowArgs: Pair<String, KProperty1<T, Any>>) {
        thead {
            tr {
            for (el in rowArgs) {

                    td {
                        +el.first
                    }
                }
            }
        }
        for (arrElement in arr) {
            tr {
                for (el in rowArgs) {
                    td {
                        +el.second.get(arrElement).toString()
                    }

                }
            }
        }
    }


В результате, теперь в любом месте table можно передать коллекцию для отображения, и пару из названия колонки и откуда эту колонку брать. При этом сохраняется статическая типизация и компилятор будет следить за тем, чтобы брались только существующие колонки и элемента Collection.
это только на первый взгляд выглядит удобно, но становится адом и лапшой при совершенно незначительном росте проекта
UFO just landed and posted this here
Выглядит так
table("table table-striped table-bordered") {
    generate(AnimalStorage().get(),
            Pair("Название вида",Animal::name),
            Pair("Сколько детей",Animal::numberOfChildren),
            Pair("Место обитания",Animal::place))
}


Тест чего именно показать?
Верстка меняется обычным hot swap.
Конкретно сейчас занимаюсь разработкой чистого бэка, но раньше… ) — CGI/Perl, ASP, PHP, сервлеты, JSP/JSTL, JSF, Thymeleaf, GWT, Vaadin, JS/REST, может еще чего забыл. Но если говорить о простоте — то Вам нужен PHP)
Это может и не хуже, но это совсем другое. И сравнивать их некорректно. При работе с разметкой есть два базовых подхода: начинать с html и начинать с DSL. Совместить их воедино и сделать это хорошо удается очень редко кому (лично у меня не было претензий только к Flex и его mxml, и их интеграции в AS3).

Ровно тоже самое, что вы нарисовали, может быть сделано (и делалось еще лет 10 назад) на javascript. Такой же точно DSL. Десятки их я только лично видел, подобных. Только вся разница в том, что:

* это при отключении js не работает
* это нельзя редактировать html редактором, про wisiwig можно забыть

Ну и у вас недостатки (и достоинства) примерно те же самые. Оно не статическое, и без выполнения кода на котлине вы вообще ничего не видите. Иногда это нормально и удобно. Но иногда — ужасно. Но в целом этот подход вполне живой (хотя и не новый). То что вы изобрели, ровно в таком же виде существует в groovy под названием MarkupBuilder. Уже тоже лет 10 как наверное.
Вы считаете что это хуже jsp?

Да, хуже. Верстальщик отдаст не html, который сделан специально под этот dsl. Он отдаст произвольный текст, в котором могут быть такие теги, о существовании которых вы даже не подозреваете. В jsp эти теги можно просто скопировать, а с dsl придётся отжиматься.

Я уже соглашался выше — при жестком разделении front и back в этом нет смысла, так как front живет в своем стеке.
Насчет отжиматься, все не так грустно
Прелесть этого подхода как раз в том, что не нужно сидеть в окнах jsp и контроллера одновременно. Все что будет написано, в плане подстановки данных, будет 100% валидно, ибо за этим следит компилятор. Кстати, если нужно, можно комбинировать jsp и dsl отдавая в jsp куски html сделанного dsl.
Я не знаток java, но не ужели там нету никаких шаблонизаторов по типу pug или jade?
да есть все, дайте человеку по-велосипедить

Недостаток такого подхода по сравнению с JSP вот в чём:


HelloWorld.class
HelloWorld$mainPage$1.class
HelloWorld$mainPage$1$1.class
HelloWorld$mainPage$1$1$1.class
HelloWorld$mainPage$1$1$1$1.class
HelloWorld$mainPage$1$1$1$1$1.class
HelloWorld$mainPage$1$1$1$1$1$1.class
HelloWorld$mainPage$1$1$2.class
HelloWorld$mainPage$1$2.class
HelloWorld$mainPage$1$2$1.class
HelloWorld$mainPage$1$2$1$1.class
HelloWorld$mainPage$1$2$1$1$1.class
HelloWorld$mainPage$1$2$1$1$1$1.class
HelloWorld$mainPage$1$2$1$1$1$2.class
HelloWorld$mainPage$1$2$1$2.class
HelloWorld$mainPage$1$2$1$2$1.class
HelloWorld$mainPage$1$2$1$2$2.class

Хренова туча мелких анонимных классов. JSP обычно компилируется в один класс.

Потыкав палочкой в Kotlin я увидел недоделанный долгострой. Первое что обнаружил: кросс-платформенный Reflect API отсутствует, хотя который год обещают.

Классический «for(;;)» убит (лучше бы убили «while» и «do/while»). Некоторые вещи пишутся громоздко.

Для HelloWorld работает хорошо. В прод не катит.
Прошу НЛО удалить мой комментарий, а то фанаты заминусовали (да и статья, действительно, не про это).

Непонятно, как такие шаблоны верстать. Когда-то Thymeleaf мне очень понравился тем, что его шаблоны можно открыть в браузере в исходном виде и они будут выглядеть правильно.

Такой DSL аналог JSX и активно используется в React. Я бы использовал его для отдельных компонент, которые бы собирал привычным верстальщику шаблоном.

Sign up to leave a comment.

Articles