Когда императивность переходит в декларативность...
От: Shmj Ниоткуда  
Дата: 07.08.23 20:20
Оценка: :))) :)
Вот императивный способ создания GUI и это плохо:

Form mainForm = new Form();

Button blueButton = new Button();
blueButton.Color = Colors.Blue;

mainForm.Children.Add(blueButton);


А если всего чуток изменить, то можно без особой переделки сделать чтобы все было декларативно. А именно:

Form(
   Children: [
      Button(
         Color: Colors.Blue
      )
   ]
)


Т.е. делаем new не обязательным, создание объекта без него. И даем возможность задать в конструкторе свойства. И все! Теперь без переделки ядра и без создания нового языка — мы можем писать все декларативно. Не нужен XAML или еще что. Получается что все выглядит как JSON или подобие его — все просто и ясно, даже парсить можно парсером в 10 срок кода.

Все гениальное — просто.
Отредактировано 07.08.2023 21:11 Shmj . Предыдущая версия . Еще …
Отредактировано 07.08.2023 20:21 Shmj . Предыдущая версия .
Отредактировано 07.08.2023 20:20 Shmj . Предыдущая версия .
Re: Когда императивность переходит в декларативность...
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 07.08.23 20:28
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Вот императивный способ создания GUI и это плохо:


S>
S>Form mainForm = new Form();

S>Button blueButton = new Button();
S>blueButton.Color = Colors.Blue;

S>mainForm.Children.Add(blueButton);
S>


ты же в курсе что в современном C# можно так:
Form mainForm = new () {
    Children = {
        new Button() { Color = Colors.Blue }
    }
}

?

Причем кроме target-typed new можно было еще 10+ лет назад так написать. А сейчас можно потребовать инициализировать свойства при создании.



S>А если всего чуток изменить, то можно без особой переделки сделать чтобы все было декларативно. А именно:


S>
S>Form(
S>   Children: Button(
S>      Color: Colors.Blue
S>   )
S>)
S>


S>Т.е. делаем new не обязательным, создание объекта без него. И даем возможность задать в конструкторе свойства. И все! Теперь без переделки ядра и без создания нового языка — мы можем писать все декларативно. Не нужен XAML или еще что. Получается что все выглядит как JSON или подобие его — все просто и ясно, даже парсить можно парсером в 10 срок кода.


Ну только Children это коллекция, а ты ей присваиваешь объект.

S>Все гениальное — просто.

Ага, и придумано давно.
Re: Когда императивность переходит в декларативность...
От: SkyDance Земля  
Дата: 07.08.23 22:28
Оценка:
S>Все гениальное — просто.

Гм, а что именно тут "гениально"? Сокращение контекста путем объявления его локальным?

Если б вот так же можно было императивность-декларативность поменять на функциональность, вот это было б интересно. Особенно если еще сайд-эффекты устранить при этом.
Re[2]: Когда императивность переходит в декларативность...
От: Shmj Ниоткуда  
Дата: 08.08.23 00:21
Оценка:
Здравствуйте, gandjustas, Вы писали:

S>>Все гениальное — просто.

G>Ага, и придумано давно.

Тогда зачем придумали XAML, если можно было на этом построить GUI?
Re[3]: Когда императивность переходит в декларативность...
От: karbofos42 Россия  
Дата: 08.08.23 07:36
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Тогда зачем придумали XAML, если можно было на этом построить GUI?


Чтобы вёрсткой мог заниматься не программист, как это происходит в мире HTML + CSS.
Только по-моему у них это не очень получилось
Re: Когда императивность переходит в декларативность...
От: Alekzander  
Дата: 08.08.23 07:55
Оценка: +3
Здравствуйте, Shmj, Вы писали:

S>Теперь без переделки ядра и без создания нового языка — мы можем писать все декларативно.


Нет. Мы по-прежнему можем писать императивно, только теперь с мудацким синтаксисом.

Порядок создания всё так же определяется кодом (делая невозможными оптимизации и ленивые загрузки), только теперь неявно. Расширения языка разметки, в частности принятое повсеместно игнорирование неизвестного, невозможно. И т.д. и т.п.

Далее. Суть хорошей разметки не в языке описания, а в модели хранения (DOM). Это знает любой, кто реально что-то верстает. Оттого, что ты компиляцией и исполнением построишь иерархию дотнетных объектов в памяти, работать с ней удобнее не станет. Или ты предлагаешь тому, кто будет этим пользоваться, вместо DevTools/Inspector/они-по-разному-называются-в-разных-движках какой-нибудь дотнетный монитор-дизассемблер запускать?
Re[4]: Когда императивность переходит в декларативность...
От: CreatorCray  
Дата: 08.08.23 07:57
Оценка: :))
Здравствуйте, karbofos42, Вы писали:

K>Чтобы вёрсткой мог заниматься не программист, как это происходит в мире HTML + CSS.

Ну мы на примере HTML + CSS видим что это было ошибкой.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[5]: Когда императивность переходит в декларативность...
От: karbofos42 Россия  
Дата: 08.08.23 08:23
Оценка: 3 (1) +1
Здравствуйте, CreatorCray, Вы писали:

CC>Ну мы на примере HTML + CSS видим что это было ошибкой.


Ну, у этих конечно не сами дизайнеры разметкой занимаются, но всё же существуют отдельные верстальщики, которые разгружают программистов.
XAML только по-моему вышел ещё хуже и в итоге просто программисты помимо C# ещё с ним разбираются и не у всех это получается
Казалось бы: многолетний опыт всяких Dreamviewer должен был показать, что и Blend скорее всего не взлетит и придётся всю разметку ручками прописывать, чем дизайнеры заниматься точно не смогут и не захотят.
Но у Microsoft свой путь и они решили сами по граблям прогуляться.
Уже собственно похоже почти наигрались, что закидывают альтернативы XAML:
https://github.com/dotnet/Comet
Re: Когда императивность переходит в декларативность...
От: · Великобритания  
Дата: 08.08.23 08:52
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Все гениальное — просто.

Простое легко сделать простым.
Ты наваяй пример с десятком контролов как минимум, чтобы всё прыгало и менялось, по событиям и прочим таймерам, посылало запросы. Чтобы функциональность покрывалась тестами, которые не сыпятся при небольшой модификации дизайна. Чтобы код был читабельным, с минимумом копипасты, простотой переиспользования, и легко поддавался рефакторингу, внесению новых изменений.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Когда императивность переходит в декларативность...
От: Shmj Ниоткуда  
Дата: 08.08.23 09:11
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>Чтобы вёрсткой мог заниматься не программист, как это происходит в мире HTML + CSS.

K>Только по-моему у них это не очень получилось

Т.е. дизайнер по умолчанию может понимать только XML-подобный синтаксис?

Т.е. это код, по этому дизайнер не поймет:

Form(
   Children: [
      Button(
         Color: Colors.Blue
      )
   ]
)


А это:

<Form>
   <Children>
      <Button Color="Blue" />
   </Children>
</Form>


— не смотря на громоздкость — магическим образом сразу поймет?
Re: Когда императивность переходит в декларативность...
От: swame  
Дата: 08.08.23 09:25
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Вот императивный способ создания GUI и это плохо:



S>А если всего чуток изменить, то можно без особой переделки сделать чтобы все было декларативно. А именно:


S>Все гениальное — просто.


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

А парсить этот твой код непонятно зачем надо.
Отредактировано 09.08.2023 11:07 swame . Предыдущая версия . Еще …
Отредактировано 08.08.2023 9:37 swame . Предыдущая версия .
Отредактировано 08.08.2023 9:27 swame . Предыдущая версия .
Отредактировано 08.08.2023 9:26 swame . Предыдущая версия .
Re[6]: Когда императивность переходит в декларативность...
От: Alekzander  
Дата: 08.08.23 10:01
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>https://github.com/dotnet/Comet


Fool me seven times — shame on you. Fool me eight times — shame on me! (Futurama).
Re[3]: Когда императивность переходит в декларативность...
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 08.08.23 10:23
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Тогда зачем придумали XAML, если можно было на этом построить GUI?

Потому что xml легко парсить, а C# не очень, особенно на момент создания XAML. Xaml может быть использование .net, например winrt c++ приложения могут использовать Xaml. Не говоря уже о программах-дизайнерах UI.
Re[5]: Когда императивность переходит в декларативность...
От: karbofos42 Россия  
Дата: 08.08.23 11:03
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Т.е. дизайнер по умолчанию может понимать только XML-подобный синтаксис?


Нет. Просто уже есть же популярный HTML (и XHTML), значит и тут прокатит.

S>Т.е. это код, по этому дизайнер не поймет:


Ну, в Qt за основу взяли JS и у них в QML что-то похожее на то, что тебе хочется.
Microsoft любили XML и взяли его за базу (те же форматы docx, xlsx и т.д. на нём).
Пилить что-то своё с нуля — долго, сложно и дорого.
Взять готовый синтаксис — уже куча кода для парсинга есть, инструменты с подсветкой синтаксиса, базовые проблемы решены и т.д. и т.п.
Re[4]: Когда императивность переходит в декларативность...
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.08.23 12:04
Оценка:
Здравствуйте, karbofos42, Вы писали:

S>>Тогда зачем придумали XAML, если можно было на этом построить GUI?


K>Чтобы вёрсткой мог заниматься не программист, как это происходит в мире HTML + CSS.

K>Только по-моему у них это не очень получилось

Такое разделение труда вышло не очень удобным с т.з. менеджмента команд. Горизонтальные зависимости девелопер-девелопер увеличивают хаос в планировании.
Поэтому мы с вами наблюдаем появление т.н. фуллстеков, которые занимаются всем подряд, от запросов к бд до верстки. В этом случае нужны продвинутые фремворки, которые изолируют разработчиков от множества технических деталей.
Для большинства проектов это очень годная модель.
Re: Когда императивность переходит в декларативность...
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.08.23 12:08
Оценка: -1
Здравствуйте, Shmj, Вы писали:

S>А если всего чуток изменить, то можно без особой переделки сделать чтобы все было декларативно. А именно:


S>
S>Form(
S>   Children: [
S>      Button(
S>         Color: Colors.Blue
S>      )
S>   ]
S>)
S>


S>Все гениальное — просто.


Вы изобрели flutter. Можно еще короче:

Form [
      Button(
         Color: Colors.Blue
      )
]
Re: Когда императивность переходит в декларативность...
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 08.08.23 14:56
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Все гениальное — просто.


См. фреймворки на Котлине, и Флаттер, да. Так и сделано.
Re[3]: Когда императивность переходит в декларативность...
От: Евгений Акиньшин grapholite.com
Дата: 09.08.23 02:54
Оценка: 2 (2)
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, gandjustas, Вы писали:


S>>>Все гениальное — просто.

G>>Ага, и придумано давно.

Вот так например можно:
https://github.com/idexus/CodeMarkup-Maui

S>Тогда зачем придумали XAML, если можно было на этом построить GUI?


Потому что изначально xaml начали придумывать как расширение html, чтобы внутри страничек в браузере делать доп функционал. И идея была в том, что этот код никто не увидит, а все будет делаться в визуальном редакторе типа Blend
А потом, наверно, побоялись сказать начальству, что зря время потратили
Не шалю, никого не трогаю, починяю примус Diagrams Designer for iPad and Windows 10
Re: Когда императивность переходит в декларативность...
От: Разраб  
Дата: 09.08.23 03:12
Оценка:
Здравствуйте, Shmj, Вы писали:


S>Все гениальное — просто.


https://github.com/giraffe-fsharp/Giraffe.ViewEngine#html-elements-and-attributes

да, есть такое, правда, производительность может просесть.
еще лучше гибрид старого доброго и генерал пурпос языка https://fsbolero.io/docs/Templating

Вопрос по ходу. Не пора ли DI в C# заменить на глобальный контекст на базе record?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Когда императивность переходит в декларативность...
От: sergii.p  
Дата: 09.08.23 11:14
Оценка: +1
Здравствуйте, swame, Вы писали:

S>Первый вариант хорош, а второй плох хотя бы тем, что по первому можно нормально пройти отладчиком, а по второму хрен.


а первый вариант плох тем, что куча дублирования. Надо проверять кучу моментов:
Всё это надо проверять в императивном коде. Для этого даже можете запустить отладчик (только он тут нифига не поможет).
В декларативном стиле дублирование (и ошибки с ним связанные) сведено к минимуму. Исчезают ненужные названия (blueButton или mainWindow). Связи (как минимум one-to-many) устанавливаются автоматически. Ну да, потеряли отладчик. Но в большинстве случаев без него можно жить.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.