https://kotlinlang.org logo
#russian
Title
# russian
s

snrostov

11/03/2017, 10:09 AM
Вопрос спорный. Как мне кажется, основной выигрыш DSL в том что сразу получаем мощную поддержку IDE, с кучей рефакторингов и прочим
2
i

irus

11/03/2017, 10:13 AM
Меня немного напрягает обилие плюсов и необходимость их не забывать. В cycle.js https://cycle.js.org/ сделали топорнее и проще, но тем не менее как мне кажется не сильно уступает таким DSL
Copy code
div([
      label('Name:'),
      input('.field', {attrs: {type: 'text'}}),
      hr(),
      h1('Hello ' + name),
    ])
s

snrostov

11/03/2017, 10:15 AM
в этом случае невозможно будет использовать код для построения дочерних элементов (например вместо for или if придется использовать функциональный подход: map, filter и т.д.).
такой же подход например у Flutter
в котлине это могло бы выглядеть вот так:
Copy code
Section(
      key = "s1",
      title = "About",
      children = listOf(
        Text("About contents")
      )
    )
Меня немного напрягает обилие плюсов и необходимость их не забывать.
тут согласен, но есть тиекты на аннотации для ide, который заставят ее ругаться если компонент не используется (в том числе нет +)
и про обилие плюсиков тоже, выглядит довольно чужеродно. но, с другой стороны, помогает отличать от других вызовов функций с лямбдами. ну и позволяет занчительно упростить объявление компонентов (они тут же становятся доступными в dsl)...
i

irus

11/03/2017, 10:19 AM
Создавать странные DSL, чтобы потом поддерживать их в IDE - странно
Можно сделать что-то вроде array literal через get оператор.
s

snrostov

11/03/2017, 10:20 AM
ну, эта аннотация полезна не только для этого dsl, а, например и для Deffered из корутин
i

irus

11/03/2017, 10:20 AM
Copy code
h[
  h1,
  *func(param),
   div
]
s

snrostov

11/03/2017, 10:21 AM
интересная идея
а как тогда добавить например if внутрь?
нужно делать лямбду?
i

irus

11/03/2017, 10:21 AM
Да, похоже на JSX
s

snrostov

11/03/2017, 10:23 AM
проблема в том, что в jsx происходит своеобразное переключение режимов: в обычном js мы просто что то взываем, а в тэгах jsx, каждое упоминание тэга добавляет его в родительский элемент (впрочем как и с dsl который в anko, javafx и тд)
i

irus

11/03/2017, 10:24 AM
т.е. происходит именно то, что достигается через оператор unaryPlus
s

snrostov

11/03/2017, 10:24 AM
да
i

irus

11/03/2017, 10:36 AM
Т.е. абстрактно можно вот так дерево строить:
Copy code
fun div(children: List<Renderable> = listOf()) = Div(children)

object h {
    operator fun <K> get(vararg items: K): List<K> = arrayListOf(*items)
}

val dom = h[
    div(h[
        div()
    ])
]
s

snrostov

11/03/2017, 10:38 AM
можно было бы наверное даже так: div(class = "123") [ div() ]
но вопрос про if и for внутри [ ] остается открытым
тут либо мы находимся в режиме вставки, либо в режиме кода. в случае с [] - режим вставки, если делать {} - то режим кода
i

irus

11/03/2017, 10:39 AM
не нужно писать внутри - выносить в отдельные функции
тогда прям форсится хороший стиль кода
s

snrostov

11/03/2017, 10:40 AM
мне кажется это будет выглядеть слишком громоздко, попробую придумать пример
вот три варианта:
Copy code
fun usersList(users: List<User>) = div [
        users.map { 
            div [
                it.name
            ] 
        }
    ]

fun usersList(users: List<User>) {
    div {
        users.forEach {
            div {
                it.name
            }
        }
    }  
} 

fun usersList(users: List<User>) {
    +Div {
        users.forEach {
            +Div {
                it.name
            }
        }
    }  
}
вы имели ввиду первый?
i

irus

11/03/2017, 10:46 AM
можно на ты 🙂
s

snrostov

11/03/2017, 10:46 AM
ок). или имелось ввиду users.map вынести в функцию?
i

irus

11/03/2017, 11:03 AM
Экспереминтирую
4 Views