Каковы реальные преимущества языков декларативного пользовательского интерфейса, таких как XAML и QML?
Вопрос
Я сейчас оцениваю QtQuick (Qt User Interface Creation Kit), который будет выпущен как часть Qt 4.7. QML — это декларативный язык на основе JavaScript, лежащий в основе QtQuick.
Кажется, это очень мощная концепция, но мне интересно, широко ли кто-нибудь использовал другие, более зрелые языки декларативного пользовательского интерфейса, такие как XAML в WPF или Silverlight может дать представление о реальных преимуществах, которые можно получить от этого стиля программирования.Часто упоминаются различные преимущества:
- Скорость разработки
- Силовое разделение между презентацией и логикой
- Улучшенная интеграция между программистами и дизайнерами.
- Изменения пользовательского интерфейса не требуют перекомпиляции
И еще, есть ли минусы?На ум приходят несколько потенциальных проблемных областей:
- Скорость выполнения
- Использование памяти
- Добавлена сложность
Есть ли какие-либо другие соображения, которые следует принять во внимание?
Решение
(Обновлено)
Заблуждение относительно XAML заключается в том, что он не компилируется.Он действительно скомпилирован в BAML — двоичный предварительно токенизированный XAML.По-видимому, существовала также скомпилированная IL версия XAML под названием CAML.ОП указал мне на это хорошая статья объясняя, что такое XAML/BAML и CAML.
В любом случае, на вопрос, зачем его использовать:
XAML — это просто формат сериализации для объектов C#, который особенно хорошо подходит для описания иерархических структур объектов, например, в графических интерфейсах WPF.
WPF помогает вам писать менее скучный код C#, например:
var grid = new Grid();
grid.Content.add(new TextBlock() {Text = "Hello"});
grid.Content.add(new TextBlock() {Text = "World"});
и просто выразите это более читабельным способом, например так:
<Grid>
<TextBlock Text="Hello">
<TextBlock Text="World">
</Grid>
Поскольку вложенность объектов WPF (помещение данных внутрь других объектов) может оказаться очень глубокой, WPF значительно упрощает чтение, чем полученный код C#.
Что касается разделения задач:XAML здесь тоже помогает, поскольку он позволяет выражать только объекты и их отношения/свойства, а не логику.Это заставляет вас отделять логику от макета пользовательского интерфейса.Шаблон MVVM очень хорошо подходит для этой задачи и обеспечивает легкость тестирования и взаимозаменяемость представлений.
Дополнительную сложность XAML также можно легко игнорировать, поскольку тот же код на C# становится сложнее, чем разметка XAML.
Однако я не могу дать вам никакого представления о QTQuick.Извини
Другие советы
QtQuick можно расширять с помощью плагинов C++, на самом деле ребята из Qt рекомендуют вам создавать пользовательский интерфейс, анимацию, переходы и т. д. в QtQuick/QML, в то время как вся ваша бизнес-логика находится в C++/Qt.Таким образом, вы получаете лучшее из обоих миров: вы можете отлаживать свой код C++, как обычно, и в то же время создание пользовательских интерфейсов становится легким и чрезвычайно простым.
Еще одна важная мысль о QtQuick/XAML заключается в том, что они имеют аппаратное ускорение, поэтому, например, вы можете без каких-либо усилий получить довольно хороший fps.Поэтому они совсем не медлят с тем, чего намеревались достичь.
Это экономит время, очень много времени.UI с кодом я сделал за 3 дня, на QML то же самое сделал за 2 часа.
Суть декларативного кодирования, т.е.WPF или QTQuick призваны обеспечить разделение между разработчиком и, предположительно, художником, реализующим визуальные аспекты вашего приложения.Что касается WPF, я считаю, что отладка становится немного сложнее.Пока мы говорим, я компилирую последнюю версию QT, чтобы посмотреть на QTQuick.(Это занимает много времени, и у меня есть время взглянуть на stackoverflow :-)) Итак, у меня пока нет мнения по этому поводу.
QML/XAML:
- Отлично подходит для шаблона MVVM
- Аппаратное ускорение (QML с использованием OpenGL для ОС Windows, MAC, Linux и телефонов...XAML с использованием DirectX для Windows и его версии для телефона)
- Ближе к художникам
- Вы можете создать ОТЛИЧНЫЙ и ПРИЯТНЫЙ пользовательский интерфейс, используя XAML/QML.
- Более простая реализация пользовательского интерфейса
- Возможна красивая анимация
- В XAML обычно можно создать версию приложения Silverlight с небольшими изменениями.
- В XAML есть несколько замечательных функций, таких как шаблон, триггер (DataTrigger, Trigger, EventTrigger), привязка (с любой стороны, а также с обеих сторон вместе), ресурс, команды, DependencyProperty и уведомляемые свойства.
Но обратите внимание в XAML:(Я программист XAML, поэтому за QML у меня нет баллов)
- Отладка XAML невозможна
- При любых изменениях в XAML всю программу необходимо перекомпилировать.
Будьте более внимательны к производительности.Например, если вы используете много RoutedCommands в XAML, ваше приложение станет непригодным для использования!
В XAML некоторые функции работают не так, как ожидалось.К сожалению, есть некоторые хитрости.(должно быть понятно...должно работать как положено...не так ли?)
Будьте осторожны с некоторыми похожими пространствами имен, такими как BitmapEffect и Effect.Есть разные характеристики и стоимость.(например.BitmapEffect имеет некоторые эффекты при программном рендеринге, а Effect имеет некоторый эффект при аппаратном рендеринге)
В реальном мире художники не могли использовать WPF в качестве Flash (по крайней мере, с хорошей производительностью).
Некоторые функции работают в особых местах.Например, DataTrigger работает только в теге «Стиль», а не в разделе «Ресурсы».
В XAML есть некоторые недостатки.Некоторые примеры:нет никакой последовательной анимации...вы не можете выполнять какие-либо вычисления в XAML (вам придется написать конвертер на C# даже для небольшой работы!JavaSript — отличная замена QML)...некоторые атрибуты дублируются.напримерх: Имя и имя...Управление представлением из ViewModel неясно.напримерзакрытие View из ViewModel (вам нужен CodeBehind)
Слишком много ошибок во время выполнения.Если вы используете некоторые теги в неправильном месте, он заметит синтаксическую ошибку, но многие ошибки возникают только во время выполнения.напримересли я нацелюсь на свойство Background (вместо Background.Color) для ColorAnimation, оно будет успешно скомпилировано, но при запуске анимации...УДАРЯТЬСЯ...ошибка выполнения!!!в таком случае в Expression Blend произойдет сбой приложения!!!