Предисловие Гради Буча
Как отмечает Джим (Jim), создание простого Web-узла существенно отличается от разработки Web-приложения: Web-узел обычно относительно статичен, а приложение более динамично. Как правило, отображаемая в нем информация изменяется в зависимости от действий пользователя. Для простого отображения информации достаточно Web-узла, однако если вы хотите заниматься электронной коммерцией, выполнять в Web распределенные задачи или взаимодействовать с другими пользователями, то вам не обойтись без Web-приложения.
Разработать Web-узел относительно просто, а создание Web-приложения — это тяжелый труд. Поскольку в нем должна динамически отображаться разнообразная информация, затрагивающая деловые интересы компании, при его разработке приходится задействовать специалистов самого разного профиля — от художников до программистов и юристов. Кроме того, необходимо предусмотреть возможность постоянной модификации приложения, поскольку статичное Web-приложение — это "мертвое" приложение. Если приложение должно функционировать на платформе клиент/сервер, необходимо обеспечить интеграцию его составных частей. И наконец, необходимо подготовить приложение к пиковым нагрузкам, поскольку в противном случае можно нанести существенный вред своему делу.
По вопросам разработки Web-узлов написано много хороших книг. Существует также множество книг по отдельным Web-технологиям, таким как HTML, XML, EJB, SSL, CGI, TCP/IP, ASP, JSP и многим другим. Однако эта книга отличается от всех остальных, поскольку в ней рассказывается о том, как разработать цельное Web-приложение на основе использования этих разрозненных технологий. Грамотное построение Web-приложения — это задача целой команды специалистов, которая требует проверенных методологий разработки, итеративности процесса и визуального моделирования. Об этом и многом другом рассказывается в книге Джима.
Джим — опытный разработчик Web-приложений, и я счастлив, что он согласился поделиться своим опытом. Надеюсь, вы тоже по достоинству оцените его труд.
Гради Буч (Grady Booch),
главный научный сотрудник
компании Rational Rose Corporation
Матери и отцу, которые дали мне жизнь
Бренде, которая делает ее поистине прекрасной
Эйону и Син, для которых я живу
Предисловие автора
В конце 1996 года я ознакомился с предварительной версией среды ASP (Active Server Pages) компании Microsoft. Так состоялось мое первое знакомство с Web. Уже тогда я почувствовал потенциал сложных Web-приложений и приступил к исследованию альтернативных архитектур: CGI (Common Gateway Interface) и Cold Fusion компании Allaire. Примерно тогда же я познакомился с бета-версией языка Java, а позднее со средой визуальной разработки приложений на языке Java — Symantec Cafe. В то время я был независимым консультантом компании AT&T в Нью-Джерси (New Jersey). Моя работа не имела ничего общего с Web, поэтому "экспериментировать" с этой технологией я мог только вечерами и в выходные. Я многому научился и приготовился к наступлению эры активной разработки и господства Web-приложений.
Мое первое реальное Web-приложение было создано по просьбе друга, отец которого был владельцем оптово-розничной компании по продаже живых роз Hortico Nurseries, Inc. Эта компания проявила интерес к интенсивно развивающейся области Internet. Вместе с другом Джеффом Вилкинсоном (Jeff Wilkinson) мы разработали первый реальный Web-узел для электронной коммерции. Он был очень простым. Его посетители могли лишь просмотреть информацию, выполнить поиск в базе данных, содержащей более 1400 сортов роз, и оформить заказ. Сначала на узле регистрировалось гораздо меньше заказов, чем мы ожидали, но наличие Web-узла вывело компанию Hortico в новую область рынка и способствовало увеличению общего объема продаж. Мы очень гордились тем, что на Web-узле компании Hortico впервые в Internet был представлен каталог различных сортов роз с соответствующими изображениями. Джефф очень много внимания уделял вопросам организации узла, и я, по возможности, помогал ему. Затем Джефф стал обладателем наград за разработку других Web-узлов, и я переключился на иные проекты.
Мой первый профессиональный контракт, связанный с разработкой Web-приложений, был заключен с начинающей компанией, работающей в области здравоохранения. Благодаря этому контракту, я глубже познакомился со спецификой разработки ASP-приложений, особенно с вопросами управления ресурсами сервера и транзакциями в среде Web-приложений. Я много узнал об использовании клиентских сценариев, аплетов и элементов управления ActiveX, а также приобрел значительный опыт тестирования приложений. Дело в том, что броузеры клиентских машин с различными операционными системами могут по-разному обрабатывать один и тот же код HTML или Java. В процессе работы я все больше убеждался в том, что Web-приложение необходимо моделировать и проектировать, как любую другую сложную программную систему. В последующие годы я продолжал "экспериментировать" с новейшими Web-технологиями и консультировался с другими компаниями по вопросам создания Web-приложений.
В своей работе я старался применять приобретенные навыки разработки объектно-ориентированных систем в области создания Web-приложений. В процессе анализа прецедентов у меня не возникало практически никаких проблем, и так продолжалось до тех пор, пока я не приступил к созданию модели анализа и модели проектирования. Именно здесь и возникли основные сложности. При создании Web-приложений основное внимание традиционно было сконцентрировано на разработке Web-страницы. Моя идея моделирования приложения "вращалась" вокруг создания карты узла (site map). Я чувствовал, что пути передачи управления и навигации в системе чрезвычайно важны для понимания приложения и обязательно должны быть включены в любую модель.
Мои первые разработки моделей Web-приложений были основаны на методике объектного моделирования OMT (Object Modeling Technique) Румбаха (Roumbaugh). Позднее, после появления версии 0.8, я начал применять язык UML. Я понял, что при использовании любой методики моделирования необходимо отражать семантику специфических для Web элементов, таких как Web-страницы и гиперссылки, а также их взаимосвязь с внутренними элементами системы — объектами среднего уровня и базой данных. В то же время оказалось, что ни OMT, ни UML не обеспечивают адекватных способов отображения этой информации, что очень важно для Web-приложений.
Будучи опытным разработчиком объектных приложений, я пришел к заключению о необходимости создания абсолютно новой методологии разработки и соответствующей системы обозначений. В самом деле, если существующие методы не удовлетворяют моим потребностям, то нужно изобрести новые. Как оказалось, в эту ловушку попадают многие разработчики программных систем. В свободное от работы время я начал разрабатывать новые графические обозначения и способы представления архитектурных элементов Web-приложений. К счастью, я показал результаты своих изысканий двум моим коллегам — опытным разработчикам объектных приложений: Джо Бефумо (Joe Befumo) и Джеральду Рульдольфу (Gerald Ruldolph). Их первой реакцией был возглас: Зачем!? Я попытался объяснить специфику разработки Web-приложений и необходимость визуального представления элементов этой разработки. Однако с кем бы я ни обсуждал свои идеи, все приходили к выводу, что, придумывая новую систему обозначений, я стреляю из пушки по воробьям.
Тогда я переосмыслил все свои "потуги". Я не настолько самонадеян, чтобы считать, что прав я один, а все остальные ошибаются. Я проделал колоссальную работу и переоценил свои первоначальные потребности. На самом деле мне требовалось лишь уметь отобразить модель Web-приложения на достаточном уровне абстракции и детализации, а самое главное — в контексте общей модели всей системы. Поскольку в это время на рынок стремительно ворвался язык UML, я решил придерживаться именно его.
Так я снова вернулся к UML. Но теперь это была версия 0.91, включающая новое понятие — стереотипы. Сначала я не знал, что такое стереотип (stereotype). Ведь спецификацию по UML нельзя назвать легким чтивом. В результате долгой и кропотливой работы я понял, что залог успешного проектирования Web-приложения заключается именно в них. Наконец я понял, что подразумевается под стереотипами, а также разобрался с другими механизмами расширения: тегированными значениями (tagged values) и ограничениями. И тогда в конце туннеля забрезжил свет.
Теперь у меня был механизм, позволяющий вводить новую семантику в грамматику языка UML без нарушения существующих соглашений. Возможность применения на диаграммах пользовательских пиктограмм со стереотипными элементами значительно упрощает реализацию моей концепции интуитивно понятных диаграмм. Кроме того, выбранное мною средство визуального моделирования Rational Rose позволяет использовать в моделях собственные стереотипы. Я быстро разработал набор пиктограмм для абстракций, связанных с Web-страницами, стараясь при этом обеспечить их согласованность. Все они имеют прямоугольную форму, а в левом верхнем углу указан стереотип. Для представления страниц использовано обозначение заштрихованного загнутого уголка, а для указания компонентов — незаштрихованного. Пиктограммы без загнутых уголков обычно обозначают классы, которые не могут быть представлены непосредственно в Web-броузере. Пиктограмма, предназначенная для обозначения компонентов Web-страницы, напоминает пиктограмму, используемую тремя "друзьями" — Гради Бучем (Grady Booch), Джеймсом Румбахом (James Rumbaugh) и Айваром Якобсоном (Ivar Jacobson) в своей книге The Unified Modeling Language User Guide (Addison Wesley Longman, 1999).
Для создания каждой из пиктограмм мне понадобился один день. Я не тратил на это слишком много усилий, поскольку считал, что более опытные разработчики смогут придумать нечто более содержательное. За прошедшие с тех пор два года эти пиктограммы практически не изменились. К моему удивлению, я не получил абсолютно никаких комментариев и пожеланий относительно стиля пиктограмм от сотен людей, использующих их. Это позволяет надеяться, что для данной версии расширения стиль пиктограмм уже устоялся.
В процессе разработки расширения мне пришлось подкорректировать множество деталей. Однако при внесении изменений я всегда старался учитывать возможность генерации кода. По моему мнению, технология моделирования должна обеспечивать однозначную генерацию кода (и его обратное преобразование). Такая однозначность может служить подтверждением корректности модели. Поскольку, в основном, мне приходилось иметь дело с технологией ASP, я начал разрабатывать в Rational Rose модели, на основе которых потом генерировался код ASP. Затем эти же модели я использовал для создания кода Java Server Pages. С точки зрения структуры кода эти типы сценариев очень похожи.
После этого события развивались со страшной скоростью. Я опубликовал в Internet статью и в 1998 году представил доклад на конференции пользователей продуктов корпорации Rational в Орландо (Orlando), шт. Флорида. Моей работой заинтересовался Гради Буч. Издательство Addison-Wesley предложило мне написать книгу. Если бы я знал, скольких усилий будет это мне стоить, то ни за что бы не согласился. При ее написании я следовал своей исходной статье и учитывал материалы других публикаций, как традиционных, так и электронных. Со временем я стал получать регулярные электронные сообщения с комментариями по поводу расширения.
К моменту выхода этой книги я представил ее материал на пяти профессиональных конференциях и написал с десяток статей. В идеале, эта книга должна привести читателя к заключению, что разработка Web-приложений — это серьезный вопрос, который необходимо освоить для успешного создания современных систем.Благодарности
Я всегда мечтал написать книгу и знал, что никакая мечта не достигается в одиночку. Эта книга — результат осмысления моего опыта разработки объектно-ориентированных Web-приложений, а также плод совместных усилий множества людей и стараний моих близких.
Как разработчик программных систем, я никогда не интересовался вопросами книгоиздания. Оказалось, что публикация книги — это не только написание ее материала. В подготовке книги к печати мне очень помогли сотрудники издательства Addison-Wesley Longman — Дж. Картер Шанклин (J. Carter Shanklin), Крися Бебик (Krysia Bebick) и Кристин Эриксон (Kristin Erickson). Я безмерно благодарен им за их труд, поддержку и мягкое напоминание о надвигающихся сроках сдачи материала.
Эту книгу рецензировало множество специалистов, которым я чрезвычайно признателен за потраченное время, усилия и честность. Эти рецензии позволили мне накопить новый опыт, и, что гораздо важнее, в результате такого рецензирования книга стала более интересной и читабельной. Я благодарен Рону Лаку (Ron Luck) из компании Compaq Computer Corporation, Крэгу Олагу (Craig Olague), Гради Бучу (Grady Booch), Бену Анселю (Ben P. Ansell), Нейлу Вильямсу (Neil Williams) и Джеффри Хаммонду (Jeffrey Hammond) из компании Rational Software.
Отдельное спасибо Бену Анселю (Ben P. Ansell), который ознакомился с моими материалами на ранних этапах работы и совместно со мной трудился над их улучшением. Большое спасибо также Гради Бучу (Grady Booch), который нашел в себе силы написать мне электронное сообщение и похвалить мою первую довольно невзрачную электронную публикацию. Его слова поддержки позволили мне не отчаяться и не разувериться в своих силах.
Написание этой книги заняло гораздо больше времени, чем я рассчитывал. В первые недели работы над книгой у нас в семье родился второй ребенок. В процессе написания книги я много раз ловил себя на мысли, что мне хочется бросить это занятие и подурачиться со своими детьми. Были моменты, когда работа двигалась тяжело и положение казалось почти безнадежным, но моя супруга Бренда (Brenda) неустанно поддерживала меня. Без ее поддержки я бы не смог довести это дело до конца.
Джим Коналлен (Jim Conallen),
август 1999
Введение
О чем эта книга
Данная книга посвящена вопросам разработки Web-приложений. Это не сборник рецептов по построению приложений для Web. В ней не предлагаются новые методы создания программ. Это просто руководство для менеджеров проектов, архитекторов, аналитиков и проектировщиков, а также программистов Web-приложений — для всех, кто стремится разрабатывать робастные, масштабируемые и многофункциональные Web-приложения с использованием проверенной временем технологии объектно-ориентированного проектирования, с помощью которой обычно строятся приложения на платформе клиент/сервер. В этой книге описаны существующие методики проектирования объектно-ориентированных приложений, а не новые подходы.
Большинство содержащихся в книге идей не новы, и на это есть свои причины. Многие описанные здесь концепции и методы разрабатывались и проверялись годами в процессе практического создания приложений для самых различных предметных областей. Благодаря использованию стандартных объектно-ориентированных технологий проектирования, удается уложиться в заранее запланированные сроки разработки проекта при заранее определенном финансировании и, что наиболее важно, получить при этом ожидаемый результат. Большинство описанных в книге принципов объектного проектирования являются результатом коллективного труда Гради Буча (Grady Booch), Джима Румбаха (Jim Rumbaugh) и Айвара Якобсона (Ivar Jacobson), известных также под именем "три товарища".
Эти три товарища являются создателями унифицированного языка моделирования UML (Unified Modeling Language). Язык UML — это система обозначений для визуального представления моделей программных систем. Многие считают UML методом проектирования, но с технической точки зрения это некорректно. UML — это всего лишь язык, но как любой язык он выражает определенные понятия. В частности, UML позволяет выражать модели систем в объектно-ориентированной терминологии, какими бы разными они ни были по своему назначению и предметной области.
Термин UML включен в название этой книги, поскольку этот язык является основным средством разработки Web-приложений. Большая часть оригинального материала этой книги относится к расширению языка UML для Web-приложений — WAE (Web Application Extension). Это расширение дополняет UML новыми обозначениями с конкретной семантикой и ограничениями, что позволяет моделировать специфические для Web-приложений архитектурные элементы как часть общей модели системы. Лейтмотивом этой книги является мысль о том, что очень важно промоделировать всю логику приложения, независимо от места и способа ее реализации в приложении. Для Web-приложений это означает необходимость отражения логики приложения в сценариях и компонентах клиентской части системы. Имея общую центральную модель функционирования системы, можно лучше понять задачу и реализовать ее в конкретном приложении.
На сегодняшний день существует множество объектно-ориентированных методологий разработки приложений. Однако в целом они во многом повторяют друг друга, хотя многие пользователи этого не замечают. "Объектно-ориентированный ход вещей" начинается с формулировки требований, которая обычно выполняется в форме сценариев использования или прецедентов (см. главу 8), и завершается созданием детальной модели проектирования (см. главу 10), которую можно использовать для непосредственного написания кода. Процесс разработки, описанный в этой книге, наиболее близок к унифицированным процессам RUP (Rational Unified Process) и ICONIX (см. главу 6). Однако изложенные здесь идеи и концепции в равной степени применимы к любым методам проектирования, использующим систему обозначений UML.
Несмотря на достаточно подробное описание процесса создания Web-приложений, эту книгу нельзя назвать учебником по проектированию. Процесс разработки программной системы — это настолько объемный вопрос, что весь его охватить достаточно сложно. Поэтому я решил описать основные принципы проектирования Web-приложений, позволяющие понять специфику такого рода программ. Читатель сможет осознать и понять важные аспекты процесса разработки Web-приложения, не вникая слишком глубоко в специфику конкретного процесса разработки. За счет отделения принципов создания Web-приложений от специфики конкретного процесса книга будет полезна более широкому кругу читателей, использующих различные процессы разработки.
Для кого предназначена эта книга
Эта книга поможет архитекторам и разработчикам приложений на платформе клиент/сервер познакомиться с принципами создания Web-приложений. Менеджеры проектов с ее помощью смогут разобраться в вопросах проектирования Web-приложений. Поскольку материал книги основан на применении методологии объектно-ориентированного проектирования, основы объектного подхода здесь не излагаются. Предполагается, что читатель уже знаком с основными принципами и концепциями объектного проектирования, а также с языком UML. Считается также, что читатель знаком с архитектурой хотя бы одного Web-приложения.
Для разработчиков систем на платформе клиент/сервер эта книга послужит руководством по технологии создания Web-приложений. Архитектор системы должен принимать решение об используемых технологиях разработки, призванных обеспечить выполнение системных требований и реализацию прецедентов или сценариев использования. В главе 7 определены три основных архитектурных шаблона Web-приложений. Изучив эти шаблоны и уяснив их достоинства и недостатки, архитектор сможет принять решение об архитектуре конкретного приложения. Как и в любой инженерной дисциплине, архитектор должен оценить преимущества каждой из возможных технологий. Поэтому глубоко изучив возможные подходы, архитектор сможет наилучшим образом спроектировать приложение.
Аналитикам и разработчикам будет полезно познакомиться с расширением UML, предназначенным для создания Web-приложений. Основные задачи этого расширения заключаются в следующем.
- Моделирование соответствующих артефактов, таких как Web-страницы, их взаимосвязь, способы навигации, клиентские сценарии и генерация страниц сервера.
- Моделирование на соответствующем уровне абстракции и детализации.
- Возможность взаимодействия специфических для Web элементов модели с остальными элементами системы.
Аналитики и разработчики научатся выражать логику функционирования системы в терминах UML. Основная идея изложения сводится к построению единой модели, отражающей логику функционирования приложения. В этой модели одну часть функций выполняют традиционные серверные объекты и компоненты (компоненты среднего уровня, мониторы обработки транзакций, базы данных и т.д.), а другую — элементы Web, такие как броузеры и клиентские сценарии.
Менеджерам проектов будет полезно узнать о возможных проблемах и различных аспектах разработки Web-приложений. Члены различных групп разработчиков смогут познакомиться с распределением обязанностей и видами деятельности. Главные менеджеры проектов, ответственные за жизнеспособность разработки в целом, должны четко понимать все задачи участников проекта.
Структура книги
Данная книга состоит из 11 глав, одной из которых является введение. Концептуально книга разделена на две части. В главах 2–5 первой части описываются основные технологии и концепции проектирования Web-приложений. Материал этой части является основой для понимания оставшейся части книги. Специалисты по проектированию Web-приложений могут пропустить начальные главы и сразу перейти ко второй части книги.
Глава 2, "Основы создания Web-приложений", описывает основные принципы построения Web-приложений. Здесь определяется сам термин Web-приложение, выявляются основные механизмы взаимодействия и языки написания Web-приложений. Обсуждаются возможные архитектуры приложений, превращающие простой Web-узел в программу со своей логикой функционирования.
Основные сложности при создании Web-приложений связаны с необходимостью выполнения некоторых функций в клиентской части системы. Технологии, обеспечивающие такие возможности, описаны в главе 3, "Динамические клиенты". Здесь обсуждаются стандартные Web-технологии, такие как JavaScript, аплеты и элементы управления ActiveX. В качестве главного объектного интерфейса с ресурсами клиентской части вводится объектная модель документа DOM (Document Object Model).
Базовая архитектура Web-приложения, согласно главам 2 и 3, особенно полезна для открытых приложений Internet, таких как магазины электронной розничной торговли. В некоторых случаях базовой архитектуры недостаточно для выполнения сложных функций системы. Ограничениями здесь зачастую выступают сами фундаментальные технологии HTTP и HTML. Web-приложение можно спроектировать таким образом, чтобы использовать другие протоколы или форматы, отличные от упомянутых. Наиболее общие технологии такого типа описаны в главе 4, "За пределами возможностей HTTP и HTML".
Последняя глава первой части, 5, "Обеспечение безопасности", посвящена вопросам безопасности. Поскольку приложение выставляется в Internet, необходимо принять меры по обеспечению его безопасности независимо от степени важности или популярности. Вопросы защиты играют важную роль даже для приложений, предназначенных для работы в корпоративных сетях. Принимаемые при этом меры защиты Web-приложений должны быть более жесткими, чем для обычных приложений на платформе клиент/сервер. По своей природе Web-серверы открыты для запросов из любого узла сети. Поэтому для обеспечения безопасности таких приложений необходимо осознать возможные риски. К сожалению, ни один коммерческий продукт или служба не могут гарантировать защищенность приложения. Меры безопасности необходимо разрабатывать для самого приложения и постоянно поддерживать эти средства защиты. Даже у известных продуктов постоянно обнаруживаются все новые бреши в защите. Возможно, эти бреши повлияют и на безопасность вашего приложения. Учитывая это при разработке системы, можно несколько снизить риск нарушения безопасности приложения и лучше защитить свою систему.
Вторая часть книги, включающая главы 6–11, посвящена процессу разработки Web-приложения. В главе 6, "Процесс разработки", рассматривается весь процесс разработки объектно-ориентированной системы. Достаточно подробно здесь описаны унифицированные процессы RUP и ICONIX. Если вы не пользуетесь этими процессами, не беспокойтесь. Скорее всего остальной материал книги будет применим и для вашего процесса разработки программных систем, поскольку система обозначений UML является достаточно стандартной.
В главе 7 рассмотрены виды деятельности по определению архитектуры Web-приложения. Для разработки архитектуры обычно необходимо знать системные требования и иметь модель прецедентов или сценариев использования системы, поэтому мы рассматриваем эти вопросы раньше, чтобы у читателя сформировалось представление о процессе разработки Web-приложения. Поскольку рассматриваемый здесь процесс является итеративным и поступательным, разработчик диаграммы прецедентов будет иметь в виду возможную архитектуру приложения. Это не обязательное требование, однако на практике при итеративном и поступательном процессе разработки прецеденты зачастую описываются в контексте некоторой выбранной архитектуры.
В главе 8, "Требования и прецеденты", рассматривается процесс формулировки системных требований и определения прецедентов. Для точного определения специфики системы необходимо сформулировать все виды требований. При этом часто помогают описания прецедентов, обеспечивающие структурный подход к формулировке системных требований. Прецеденты описывают взаимодействие между пользователем (или исполнителем) и системой. Они представляют собой текстовые документы, выражающие перечень функций системы в терминах предметной области без указания способа их выполнения. Способ выполнения этих функций рассматривается в следующих двух главах.
Следующим этапом процесса разработки является анализ прецедентов, их выражение в терминах классов и их взаимодействия. Этому вопросу посвящена глава 9, "Стадия анализа". Анализ — это вид деятельности по преобразованию системных требований в модель, которую можно реализовать в виде программной системы. Создаваемая при этом модель анализа содержит классы и способы их взаимодействия, выражающие поведение системы при реализации прецедентов.
В главе 10, "Стадия проектирования", рассказывается о преобразовании модели анализа в другую модель, которую можно использовать для разработки компонентов системы. Здесь начинается описание расширения WAE (Web Application Extension) для UML. На этом этапе формируется архитектура, реализующая системные требования. В этой главе подробно описывается разработка Web-страниц и клиентских сценариев, а также обсуждаются другие специфические для Web-приложений элементы и их взаимодействие. В главах 10 и 11 сосредоточен основной оригинальный материал этой книги.
По завершении разработки модели на ее основе можно непосредственно создавать исполняемый код. В главе 11, "Стадия реализации", рассматривается процесс создания программного кода на основе модели UML. В качестве примеров описываются приложения ASP. Такой выбор был обусловлен двумя причинами. Во-первых, автор лучше всего знаком именно с такими Web-приложениями, а во-вторых, эти приложения пишутся на языке сценариев Visual Basic — VBScript. Несмотря на все свои преимущества и недостатки, VBScript — достаточно легко читаемый язык. В отличие от других языков программирования, таких как Java, С/С++ или Cold Fusion, приведенные в качестве примеров тексты программ на VBScript будут понятны и могут использоваться даже неподготовленными читателями без особых структурных изменений.