В последнее время довольно много писалось о том, что программист должен стремиться досконально разбираться в тех программных средствах, которые он использует. Однако недавно произошло нечто такое, что заставляет посмотреть на проблему использования программных средств шире. Произошло вот что: вышла на рынок крошечная по нынешним меркам утилита XML Object Link производства известной фирмы RogueWave. По названию этой утилиты можно судить о том, что она предназначена для работы с XML. Но то, что она делает, наверное, уникально. Во всяком случае, аналогов этой утилиты в интернете отыскать не удалось.
То, как утилита работает, легко понять, произведя сравнение входных и выходных данных этой утилиты. По сути, всё программа очень простая, и о том, что «все гениальное просто», знает каждый. Однако же, попробуй додумайся до этой простоты! И что же такого особенного предлагает этот XOL (XML Object Link)? На этот вопрос смогут ответить не все, а только те, кому до XML Object Link (XOL) довелось поработать с другими парсерами XML. Остальные, наверное, лишь пожмут плечами и удивленно спросят: «Действительно, а что же тут особенного? Все просто, понятно, органично... А как можно иначе?» Если вы ответили на заданный выше вопрос точно так же, то не стоит читать эту статью. Но если на этот вопрос у вас нет ответа, давайте попробуем разобраться.
Ниже сравниваются принципы работы «обычных» парсеров XML и XML Object Link. Вообще-то эти продукты относятся к совершенно различным классам задач, поэтому сравнение их как программных продуктов, мягко говоря, некорректно. С другой стороны, с точки зрения прикладного программиста они позволяют решать одни и те же задачи (хотя, разумеется, разными способами). Поэтому, если рассматривать эти продукты именно в таком ракурсе, то сравнение будет вполне уместно.
В качестве образца для сравнения с XOL выбран MSxml - универсальный парсер фирмы Microsoft. Выбор этот обусловлен тем, что MSxml является, пожалуй, наиболее широко распространенным на сегодняшний день парсер. Как только программист приступает к работе XML-документами, перед ним встает вопрос о том, какие средства использовать для доступа к данным, хранящимся внутри документа. В большинстве случаев выбор падает на XML-парсер, реализующий т.н. DOM (Document Object Model). Эта модель предоставляет программистам возможность работать с XML-документом как с набором объектов типов «Элемент», «Узел», «Атрибут» и так далее. Программной реализацией DOM является и msxml.dll, в которой реализованы библиотека типов и соответствующие СОМ-интерфейсы для доступа к данным.
Насколько можно судить, эта библиотека полностью реализует спецификации DOM, предложенные консорциумом W3C. Сама по себе msxml.dll является очень мощным универсальным средством для работы с XML, и, естественно, является достаточно сложной. В этом-то и заключается слабость ее и многих других продуктов, которые для своего освоения требуют хотя бы нескольких дней!
Сложившаяся в IT-индустрии ситуация зачастую препятствует серьезному освоению программистами средств разработки. Стремление выдать программный продукт как можно раньше приводит к тому, что многие программисты переходят на «программирование мышкой», то есть использование всевозможных генераторов программ. Конечно же, это накладывает свой отпечаток и на стиль работы, когда программа пишется не в соответствии с требованиями, описанными в технической документации, а в соответствии с tutorial-ами, позволяющими воспользоваться каким-то малым подмножеством предоставляемых продуктом возможностей.
Как говорится, руки чешутся, тянутся к клавиатуре, а на прочтение документации времени не остается.Понятно, как ощущает себя программист, которому поставили задачу сделать все, как говорится, к завтрашнему утру! Какая там документация, какое изучение... Ну, а если добавить что документация, которая входит в состав свободно распространяемого парсера MSxml, мягко говоря, написана далеко не идеально... Думаю, все понятно.
Таким образом, универсальность и мощность библиотеки определяет сложность ее освоения и приводит к большим затратам времени. Подтверждением тому могут служить сообщения на любом форуме в интернете, посвященном программированию с XML. Универсальность любого парсера (подчеркиваю - любого, а не только MSxml) оборачивается еще одной неприятной для программиста особенностью. Дело в том, что после того, как парсер освоен, для комфортной работы с данными в любом случае приходится создавать собственный объект или структуры данных, в которые в дальнейшем можно будет записывать данные, взятые из документа XML. После этого программисту придется реализовывать многочисленные методы или функции для организации перекачки данных из CPP-шного объекта в документ XML (маршаллинг) и из документа XML в CPP-шный объект (анмаршаллинг). Любой программист вспомнит бесконечный ряд методов типа getData() и setData(), которые ему пришлось писать. Эти методы, естественно, усложняют программу и повышают вероятность появления ошибок.
Резюмируя изложенное выше, можно сказать, что в случае разработки программы, работающей с XML-документами и использующей обычный парсер, программист обязан не только изучить DOM и не только досконально разобраться с API, предоставляемым этим парсером. Он должен реализовать собственные объекты, соответствующие данным, и написать методы, реализующие маршаллинг и анмаршаллинг. На это уходит время, сопоставимое со временем разработки основной программы. Другими словами, программист во время, отведенное для написания программы, будет учиться, а не выдавать продукцию. Ну, и небольшой нюанс - программист во время работы над программой постоянно ощущает присутствие достаточно недружелюбного посредника - парсера XML. Во всяком случае, я не знаю ни одного человека, которому общение с «обычным» парсером доставило бы радость.
Что же такого необычного делает XML Object Link? Да ничего! Ничего в том смысле, что от тех недостатков, о которых мы говорили выше, не остается практически ничего. А фактически XOL выполняет за программиста большую часть той работы, о которой говорилось ранее. XML Object Link, получая в качестве исходных данных только небольшой файл, содержащий схему XML-документа, создает иерархию классов C++, соответствующую описываемой иерархии данных. При этом в состав каждого класса входят методы marshal() и unmarshal(), реализующие, соответственно, маршаллинг и анмаршаллинг. Кроме этого, для каждого элемента данных создаются методы set () и get (), позволяющие записывать отдельные данные из срр’шного объекта в документ XML и, наоборот, из документа XML в CPP-шный объект. Все! Однако именно это приводит к кардинальным изменениям в технологии работы и восприятии задания программистом.
Программисту больше не нужно знать DOM и XML. Достаточно беглого знакомства с XML Schema. Программа XML Object Link производит настоящую «подмену понятий». Каким образом?, При разработке программы CPP-шные объекты перестают быть вторичными по отношению к документу XML. Более того, с точки зрения разработчика документы XML вообще перестают существовать, так как они становится полностью невидимыми для программиста. Другими словами, исчезает тот «посредник», о котором говорилось выше. Повышается уровень абстракции. Если раньше реальные данные представлял документ XML, а CPP-шные классы были лишь его отображением, то при использовании XOL классы напрямую представляют реальные данные. Есть только программа на C++, и ничего больше!
Кроме того, программисту не нужно больше разрабатывать собственные классы для хранения данных и собственные интерфейсы для доступа к данным в XML. Всю черновую работу делает XML Object Link. А в связи с тем, что объем кода, написанного программистом «вручную», значительно уменьшается, то, соответственно, уменьшается и вероятность появления ошибок. Следовательно, программы становятся более надежными.