среда, 23 сентября 2009 г.

XForms

Я попал на первое, учредительное собрание XForms User Group. Людей было мало, все представлялись и рассказывали о своих интересах.

Я был краток: "5 лет назад я читал книгу про XML. Там была глава про XForms, где говорилось, что пройдет несколько лет, и эта технология сделает революцию в веб-программировании. Так вот я пришел спросить: и шо, таки революция случилась или нет?"

Раздался смех. Марк Бирбек ответил: "Как и со многими другими технологиями, вначале была эйфория. Потом люди увидели, что как-то революция не происходит, и перестали этим интересоваться. Но прошли годы. Кто-то (в том числе наша компания) продолжали тихо работать, и мне кажется, что таки сейчас XForms снова начинают входить в моду."

XForms - это декларативный способ реализации MVC-паттерна, причем, так сказать, в чистом виде. С помощью XML ты описываешь модель данных и бизнес-правила (в основном они связаны с валидацией). Потом напускаешь на этот файл какой-нибудб XForms-процессор, и получаешь веб-форму для ввода данных.

Причем она работает в стиле, похожем на Excel: ты поменял значение в одном поле, и сразу же пересчитались данные во всех связанных полях. Потому что изменение значения в поле автоматически передается в модель, а оттуда - во все связанные объекты UI. Здесь есть хорошие, пошаговые демо.

Главная фишка XForms в абстракции. Программист не говорит "нарисовать текстовое поле" или "нарисовать выпадающий список". Вместо этого он просто говорит "хочу получить от пользователя такие-то данные". А дальше уже XForms-процессор решает, как заполучить эти данные. Если нужно выбрать значение из списка, то процессор может нарисовать выпадающий список, простой список или радиокнопки. Но если тот же самый XML-файл обрабатывается голосовым информатором, то он скажет в трубку: "Пожалуйста, нажмите 1 для этого, 2 для того, 3 для сего".

Или, к примеру, мы хотим сделать кнопку "Удалить всё". Программист просто пишет <hint>Вы действительно хотите удалить всё?</hint>. Что такое hint? Если это веб-форма, то мы увидим подсказку, когда наведем курсор; или диалоговое окно, когда нажмем кнопку. А если эта же форма используется голосовым информатором, то он произнесет подсказку вслух.

Другой пример, который произвел на всех впечатление. Нужно получить строчку с адресом. Это может быть просто обычная строчка, текст. А может быть объект Google Maps, который ты таскаешь. Отличие будет только в классе CSS, который присваивается этому полю ввода.

Конечно, чтобы всё это заработало, нужен XForms-процессор. Ведь XML сам по себе - это просто текстовый файл, его нужно как-то обрабатывать. Процессоров существует много, и у них разный принцип действия. Можно всё обрабатывать на сервере, и клиент получает обычный HTML с JavaScript. Можно передавать XML, а в браузере его обрабатывает специальная JavaScript-библиотека. Или передавать XML, а его обрабатывает специальный плагин к браузеру. Наверное, есть и процессоры, которые можно вставить в Flash и Silverlight.

Кроме того, это может быть вообще не веб. Ничто не мешает описывать интерфейс Windows-приложения в виде файла XForms. Т.е. это будет как бы замена XAML. Отличие в том, что XAML гораздо больше ориентирован на красивый интерфейс, а XForms - на четкую модель. И наконец, как я уже писал, XForms-процессором может быть голосовой информатор. В этом случае графического интерфейса вообще нет.

Одну вещь я не спросил у Марка: можно ли использовать XForms не для UI, а для построения веб-сервисов? Т.е. понятно, что всё можно при желании, но надо ли, или это уже будет извращение?

Теперь о том, что меня смущает.

Во-первых, я совершенно не понял, как "форму" связывать с базой данных или другим внешним источником данных. Вскользь было сказано, что модель можно подключить ко внешнему файлу с исходными данным. Допустим, закачать оттуда список стран или валют. Ну, хорошо: закачали, пользователь что-то вел, мы что-то посчитали, проверили валидность... а что дальше, как это всё сохранить? XForms уже этим не занимается. Понятно, что как-то это всё делается, но нам в этот раз не рассказали.

Во-вторых, абстракция абстракцией, но любая серьезная фирма хочет, чтобы с их сайтом поработали веб-дизайнеры. Никто не согласится с таким подходом: "Я хочу, чтобы пользователь выбрал страну из списка, и мне пофиг, как этот список выглядит, лишь бы работало." Может, для внутренного сайта такой подход и годится, но если мы говорим про фирму с миллиардными оборотами, то наверняка их дизайнеры захотят контролировать внешний вид вплоть до пикселя. Не то чтобы XForms не позволяет это делать... используя CSS, можно много чего настраивать. Но мне кажется, это как-то неестественно. Получается, что со одной стороны они добиваются абстракции, а с другой - и модель, и бизнес-логика, и во многом интерфейс описывается в одном и том же XML-файле. Правда, можно использовать внешний CSS. Но всё равно как-то коряво. CSS - он же изначально для веба. А как он должен использоваться в Windows-приложении или голосовом информаторе, непонятно.

Но главное, что мне не нравится - это XPath. Кто не знает - это язык запросов, аналог SQL, но для XML. XPath - это рабочая лошадка XForms для описания бизнес-правил. Всё замечательно, пока логика простая. Но как только она усложняется, у тебя появляется длиннющие XPath-выражения, причем в отличие от SQL они довольно тяжело воспринимаются, и ошибиться легко (может, любители регулярных выражений тут со мной не согласятся).

Я сказал Марку: по моему мнению, чтобы эта технология получила широкое распространение, нужны не только хорошие XForms-процессоры, но и хорошие средства разработки или плагины. Которые, в частности, будут автоматизировать написание XPath-выражений. И то не факт, что это поможет.

Мне кажется, что XForms повторит судьбу XSLT. Тоже была красивая идея: декларативно описать, как один XML преобразовать в другой; или просто XML в текстовый файл; или (с помощью некоторых дополнительных наворотов) даже в бинарный типа PDF. Лет 5 назад было модно использовать XSLT, чтобы, скажем, покупатель мог взять готовый электронный магазин и самостоятельно подкрутить дизайн. Я сам пару раз был в роле такого клиента. И впечатления неважные. На практике оказалось, что XSLT с XPath - это громоздкий способ создания веб-страниц.

Да и медленный. Вот другой пример из моего опыта: была утилита, которая занималась импортом/экспортом данных между нашей системой и чужой. Обе системы импортируют и экспортируют данные в виде XML, но в совершенно разных форматах. Казалось бы, совершенно естественно использовать XSLT для преобразования, ведь в случае чего бизнес-логику можно менять прямо в файле конфигурации, не меняя программу! Увы, это работало очень медленно. И тогда мы всё переписали, используя XmlReader и XmlWriter, а всю логику перенесли из XSLT прямо в C#. Тупо, некрасиво? Возможно. Но это работало в 50-100 раз быстрее!


Не знаю, буду ли когда-нибудь использовать XForms, но на следующее собрание обязательно постараюсь прийти, они меня заинтересовали. Обещают показать реальное, работающее приложение, а не просто демо.

1 комментарий:

Count Raven Amiant комментирует...

Момент про то как CSS использовать для Windows приложения или голосового информатора.

1. Ну, некоторые моменты CSS вполне подойдут для описания GUI для Windows приложения.

2. Существует CSS для акустических стилей. Подробностей не знаю, но читал про это в книге по CSS. Может это кому-то нужно.

Ratings by outbrain