Современные веб-технологии

Архитектурные особенности проектирования и разработки Веб-приложений

Разбить на страницы
Показывать лекцию целиком

Презентацию к данной лекции Вы можете скачать здесь.

5.1. Архитектура информационных систем

5.1.1. Общие сведения

Современные программные приложения и информационные системы достигли такого уровня развития, что термин "архитектура" в применении к ним уже давно не удивляет. Грамотно построить информационную систему, эффективно и надежно функционирующую не проще, чем сконструировать и возвести современное многофункциональное здание [1].

Когда речь заходит об "архитектуре информационной системы", обычно не возникает недостатка в определениях. Есть даже Web-сайты, которые собирают такие определения [2].

Рассмотрим определение "архитектуры информационной системы", которое дают различные источники:

  • Архитектура – это организационная структура системы [3].
  • Архитектура информационной системы – концепция, определяющая модель, структуру, выполняемые функции и взаимосвязь компонентов информационной системы [4].
  • Архитектура – это базовая организация системы, воплощенная в ее компонентах, их отношениях между собой и с окружением, а также принципы, определяющие проектирование и развитие системы [5].
  • Архитектура это набор значимых решений по поводу организации системы программного обеспечения, набор структурных элементов и их интерфейсов, при помощи которых компонуется система, вместе с их поведением, определяемым во взаимодействии между этими элементами, компоновка элементов в постепенно укрупняющиеся подсистемы, а также стиль архитектуры, который направляет эту организацию – элементы и их интерфейсы, взаимодействия и компоновку [6].
  • Архитектура программы или компьютерной системы – это структура или структуры системы, которые включают элементы программы, видимые извне свойства этих элементов и связи между ними [7].
  • Архитектура – это структура организации и связанное с ней поведение системы [8]. Архитектуру можно рекурсивно разобрать на части, взаимодействующие посредством интерфейсов, связи, которые соединяют части, и условия сборки частей. Части, которые взаимодействуют через интерфейсы, включают классы, компоненты и подсистемы.
  • Архитектура программного обеспечения системы или набора систем состоит из всех важных проектных решений по поводу структур программы и взаимодействий между этими структурами, которые составляют системы [9]. Проектные решения обеспечивают желаемый набор свойств, которые должна поддерживать система, чтобы быть успешной. Проектные решения предоставляют концептуальную основу для разработки системы, ее поддержки и обслуживания.
  • Хотя определения несколько отличаются, можно заметить немалую степень сходства. Например, большинство определений указывают на то, что архитектура связана со структурой и поведением, а также только со значимыми решениями, может соответствовать некоторому архитектурному стилю, на нее влияют заинтересованные в ней лица и ее окружение, она воплощает решения на основе логического обоснования.

    Под архитектурой программных систем будем понимать совокупность решений относительно [1, 10]:

  • организации программной системы;
  • выбора структурных элементов, составляющих систему и их интерфейсов;
  • поведения этих элементов во взаимодействии с другими элементами;
  • объединение этих элементов в подсистемы;
  • архитектурного стиля, определяющего логическую и физическую организацию системы: статические и динамические элементы, их интерфейсы и способы их объединения.
  • Архитектура программной системы охватывает не только ее структурные и поведенческие аспекты, но и правила ее использования и интеграции с другими системами, функциональность, производительность, гибкость, надежность, возможность повторного применения, полноту, экономические и технологические ограничения, а также вопрос пользовательского интерфейса.

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

    Для того чтобы построить правильную и надежную архитектуру и грамотно спроектировать интеграцию программных систем необходимо четко следовать современным стандартам в этих областях. Без этого велика вероятность создать архитектуру, которая неспособна развиваться и удовлетворять растущим потребностям пользователей ИТ. В качестве законодателей стандартов в этой области выступают такие международные организации как SEI (Software Engineering Institute), WWW (консорциум World Wide Web), OMG (Object Management Group), организация разработчиков Java – JCP (Java Community Process), IEEE (Institute of Electrical and Electronics Engineers) и другие.

    Рассмотрим классификацию программных систем по их архитектуре:

  • Централизованная архитектура;
  • Архитектура "файл-сервер";
  • Двухзвенная архитектура "клиент-сервер";
  • Многозвенная архитектура "клиент-сервер";
  • Архитектура распределенных систем;
  • Архитектура Веб-приложений;
  • Сервис-ориентированная архитектура.
  • Следует заметить, что, как и любая классификация, данная классификация архитектур информационных систем не является абсолютно жесткой. В архитектуре любой конкретной информационной системы часто можно найти влияния нескольких общих архитектурных решений.

    Далее подробно рассмотрим особенности каждой архитектуры.

    5.1.2. Централизованная архитектура

    Централизованная архитектура вычислительных систем была распространена в 70-х и 80-х годах и реализовывалась на базе мейнфреймов (например, IBM-360/370 или их отечественных аналогов серии ЕС ЭВМ), либо на базе мини-ЭВМ (например, PDP-11 или их отечественного аналога СМ-4) [11]. Характерная особенность такой архитектуры – полная "неинтеллектуальность" терминалов. Их работой управляет хост-ЭВМ.

    Достоинства такой архитектуры [11, 12]:

  • пользователи совместно используют дорогие ресурсы ЭВМ и дорогие периферийные устройства;
  • централизация ресурсов и оборудования облегчает обслуживание и эксплуатацию вычислительной системы;
  • отсутствует необходимость администрирования рабочих мест пользователей;
  • Главным недостатком для пользователя является то, что он полностью зависит от администратора хост-ЭВМ. Пользователь не может настроить рабочую среду под свои потребности – все используемое программное обеспечение является коллективным.

    Использование такой архитектуры является оправданным, если хост-ЭВМ очень дорогая, например, супер-ЭВМ.

    Классическое представление централизованной архитектуры показано на рис. 5.1.

    (рис 5.1) Классическое представление централизованной архитектуры

    Центральная ЭВМ должна иметь большую память и высокую производительность, чтобы обеспечивать комфортную работу большого числа пользователей.

    Все приложения, работающие в такой архитектуре, полностью находятся в основной памяти хост-ЭВМ. Терминалы являются лишь устройствами ввода-вывода и таким образом в минимальной степени поддерживают интерфейс пользователя.

    5.1.3. Архитектура "файл-сервер"

    Файл-серверные приложения – приложения, схожие по своей структуре с локальными приложениями и использующие сетевой ресурс для хранения программы и данных [13].

  • Функции сервера: хранения данных и кода программы.
  • Функции клиента: обработка данных происходит исключительно на стороне клиента.
  • Классическое представление информационной системы в архитектуре "файл-сервер" представлено на рис. 5.2.

    (рис 5.2) Классическое представление архитектуры "файл-сервер"

    Организация информационных систем на основе использования выделенных файл-серверов все еще является распространенной в связи с наличием большого количества персональных компьютеров разного уровня развитости и сравнительной дешевизны связывания PC в локальные сети [14].

    Конечно, основным достоинством данной архитектуры является простота организации. Проектировщики и разработчики информационной системы находятся в привычных и комфортных условиях IBM PC в среде MS-DOS, Windows или какого-либо облегченного варианта Windows Server. Имеются удобные и развитые средства разработки графического пользовательского интерфейса, простые в использовании средства разработки систем баз данных и/или СУБД.

    Достоинства такой архитектуры [12, 13, 14]:

  • многопользовательский режим работы с данными;
  • удобство централизованного управления доступом;
  • низкая стоимость разработки;
  • высокая скорость разработки;
  • невысокая стоимость обновления и изменения ПО.
  • Недостатки [12, 13, 14]:

  • проблемы многопользовательской работы с данными: последовательный доступ, отсутствие гарантии целостности;
  • низкая производительность (зависит от производительности сети, сервера, клиента);
  • плохая возможность подключения новых клиентов;
  • ненадежность системы.
  • Простое, работающее с небольшими объемами информации и рассчитанное на применение в однопользовательском режиме, файл-серверное приложение можно спроектировать, разработать и отладить очень быстро [14]. Очень часто для небольшой компании для ведения, например, кадрового учета достаточно иметь изолированную систему, работающую на отдельно стоящем PC. Однако, в уже ненамного более сложных случаях (например, при организации информационной системы поддержки проекта, выполняемого группой) файл-серверные архитектуры становятся недостаточными.

    5.1.4. Архитектура "клиент-сервер"

    Клиент-сервер (Client-server) – вычислительная или сетевая архитектура, в которой задания или сетевая нагрузка распределены между поставщиками услуг (сервисов), называемых серверами, и заказчиками услуг, называемых клиентами [15]. Нередко клиенты и серверы взаимодействуют через компьютерную сеть и могут быть как различными физическими устройствами, так и программным обеспечением.

    Первоначально системы такого уровня базировались на классической двухуровневой клиент-серверной архитектуре (Two-tier architecture). Под клиент-серверным приложением в этом случае понимается информационная система, основанная на использовании серверов баз данных.

    Схематически такую архитектуру можно представить, как показано на рис. 5.3 [16].

    (рис 5.3) Классическое представление архитектуры "клиент-сервер"

    На стороне клиента выполняется код приложения, в который обязательно входят компоненты, поддерживающие интерфейс с конечным пользователем, производящие отчеты, выполняющие другие специфичные для приложения функции.

    Клиентская часть приложения взаимодействует с клиентской частью программного обеспечения управления базами данных, которая, фактически, является индивидуальным представителем СУБД для приложения.

    Заметим, что интерфейс между клиентской частью приложения и клиентской частью сервера баз данных, как правило, основан на использовании языка SQL. Поэтому такие функции, как, например, предварительная обработка форм, предназначенных для запросов к базе данных, или формирование результирующих отчетов выполняются в коде приложения.

    Наконец, клиентская часть сервера баз данных, используя средства сетевого доступа, обращается к серверу баз данных, передавая ему текст оператора языка SQL.

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

  • Сервер производит компиляцию полученного оператора.
  • Далее (если компиляция завершилась успешно) происходит выполнение оператора.
  • Разработчики и пользователи информационных систем, основанных на архитектуре "клиент-сервер", часто бывают неудовлетворены постоянно существующими сетевыми накладными расходами, которые следуют из потребности обращаться от клиента к серверу с каждым очередным запросом. На практике распространена ситуация, когда для эффективной работы отдельной клиентской составляющей информационной системы в действительности требуется только небольшая часть общей базы данных. Это приводит к идее поддержки локального кэша общей базы данных на стороне каждого клиента.

    Фактически, концепция локального кэширования базы данных является частным случаем концепции реплицированных баз данных. Как и в общем случае, для поддержки локального кэша базы данных программное обеспечение рабочих станций должно содержать компонент управления базами данных – упрощенный вариант сервера баз данных, который, например, может не обеспечивать многопользовательский режим доступа. Отдельной проблемой является обеспечение согласованности (когерентности) кэшей и общей базы данных. Здесь возможны различные решения – от автоматической поддержки согласованности за счет средств базового программного обеспечения управления базами данных до полного перекладывания этой задачи на прикладной уровень.

    Преимуществами данной архитектуры являются [12, 15]:

  • возможность, в большинстве случаев, распределить функции вычислительной системы между несколькими независимыми компьютерами в сети;
  • все данные хранятся на сервере, который, как правило, защищен гораздо лучше большинства клиентов, а также на сервере проще обеспечить контроль полномочий, чтобы разрешать доступ к данным только клиентам с соответствующими правами доступа;
  • поддержка многопользовательской работы;
  • гарантия целостности данных.
  • Недостатки [12, 15]:

  • неработоспособность сервера может сделать неработоспособной всю вычислительную сеть;
  • администрирование данной системы требует квалифицированного профессионала;
  • высокая стоимость оборудования;
  • бизнес логика приложений осталась в клиентском ПО.
  • При проектировании информационной системы, основанной на архитектуре "клиент-сервер", большее внимание следует обращать на грамотность общих решений. Технические средства пилотной версии могут быть минимальными (например, в качестве аппаратной основы сервера баз данных может использоваться одна из рабочих станций). После создания пилотной версии нужно провести дополнительную исследовательскую работу, чтобы выяснить узкие места системы. Только после этого необходимо принимать решение о выборе аппаратуры сервера, которая будет использоваться на практике.

    Увеличение масштабов информационной системы не порождает принципиальных проблем. Обычным решением является замена аппаратуры сервера (и, может быть, аппаратуры рабочих станций, если требуется переход к локальному кэшированию баз данных). В любом случае практически не затрагивается прикладная часть информационной системы.

    Также данный вид архитектуры называют архитектурой с "толстым" клиентом.

    5.1.5. Многоуровневый "клиент-сервер"

    Многоуровневая архитектура клиент-сервер (Multitier architecture) – разновидность архитектуры клиент-сервер, в которой функция обработки данных вынесена на один или несколько отдельных серверов [15]. Это позволяет разделить функции хранения, обработки и представления данных для более эффективного использования возможностей серверов и клиентов.

    Среди многоуровневой архитектуры клиент-сервер наиболее распространена трехуровневая архитектура (трехзвенная архитектура, three-tier), предполагающая наличие следующих компонентов приложения: клиентское приложение (обычно говорят "тонкий клиент" или терминал), подключенное к серверу приложений, который в свою очередь подключен к серверу базы данных [14, 17].

    Схематически такую архитектуру можно представить, как показано на рис. 5.4.

    (рис 5.4) Представление многоуровневой архитектуры "клиент-сервер"
  • Терминал – это интерфейсный (обычно графический) компонент, который представляет первый уровень, собственно приложение для конечного пользователя. Первый уровень не должен иметь прямых связей с базой данных (по требованиям безопасности), быть нагруженным основной бизнес-логикой (по требованиям масштабируемости) и хранить состояние приложения (по требованиям надежности). На первый уровень может быть вынесена и обычно выносится простейшая бизнес-логика: интерфейс авторизации, алгоритмы шифрования, проверка вводимых значений на допустимость и соответствие формату, несложные операции (сортировка, группировка, подсчет значений) с данными, уже загруженными на терминал.
  • Сервер приложений располагается на втором уровне. На втором уровне сосредоточена большая часть бизнес-логики. Вне его остаются фрагменты, экспортируемые на терминалы, а также погруженные в третий уровень хранимые процедуры и триггеры.
  • Сервер базы данных обеспечивает хранение данных и выносится на третий уровень. Обычно это стандартная реляционная или объектно-ориентированная СУБД. Если третий уровень представляет собой базу данных вместе с хранимыми процедурами, триггерами и схемой, описывающей приложение в терминах реляционной модели, то второй уровень строится как программный интерфейс, связывающий клиентские компоненты с прикладной логикой базы данных.
  • В простейшей конфигурации физически сервер приложений может быть совмещен с сервером базы данных на одном компьютере, к которому по сети подключается один или несколько терминалов.

    В "правильной" (с точки зрения безопасности, надежности, масштабирования) конфигурации сервер базы данных находится на выделенном компьютере (или кластере), к которому по сети подключены один или несколько серверов приложений, к которым, в свою очередь, по сети подключаются терминалы.

    Плюсами данной архитектуры являются [12, 14, 16, 17]:

  • клиентское ПО не нуждается в администрировании;
  • масштабируемость;
  • конфигурируемость – изолированность уровней друг от друга позволяет быстро и простыми средствами переконфигурировать систему при возникновении сбоев или при плановом обслуживании на одном из уровней;
  • высокая безопасность;
  • высокая надежность;
  • низкие требования к скорости канала (сети) между терминалами и сервером приложений;
  • низкие требования к производительности и техническим характеристикам терминалов, как следствие снижение их стоимости.
  • Минусы [12, 14, 16, 17]:

  • растет сложность серверной части и, как следствие, затраты на администрирование и обслуживание;
  • более высокая сложность создания приложений;
  • сложнее в разворачивании и администрировании;
  • высокие требования к производительности серверов приложений и сервера базы данных, а, значит, и высокая стоимость серверного оборудования;
  • высокие требования к скорости канала (сети) между сервером базы данных и серверами приложений.
  • Некоторые авторы (например, Мартин Фаулер [18]) представляют многозвенную архитектуру (трехзвенную) в виде пяти уровней (рис. 5.5):

  • Представление;
  • Уровень представления;
  • Уровень логики;
  • Уровень данных;
  • Данные.
  • (рис 5.5) Пять уровней многозвенной архитектуры "клиент-сервер"

    К представлению относится вся информация, непосредственно отображаемая пользователю: сгенерированные html-страницы, таблицы стилей, изображения.

    Уровень представления охватывает все, что имеет отношение к общению пользователя с системой. К главным функциям слоя представления относятся отображение информации и интерпретация вводимых пользователем команд с преобразованием их в соответствующие операции в контексте логики и данных.

    Уровень логики содержит основные функции системы, предназначенные для достижения поставленной перед ним цели. К таким функциям относятся вычисления на основе вводимых и хранимых данных, проверка всех элементов данных и обработка команд, поступающих от слоя представления, а также передача информации уровню данных.

    Уровень доступа к данным – это подмножество функций, обеспечивающих взаимодействие со сторонними системами, которые выполняют задания в интересах приложения.

    Данные системы обычно хранятся в базе данных.

    5.1.6. Архитектура распределенных систем

    Такой тип систем является более сложным с точки зрения организации системы. Суть распределенной системы заключается в том, чтобы хранить локальные копии важных данных [19].

    Схематически такую архитектуру можно представить, как показано на рис. 5.6.

    (рис 5.6) Архитектура распределенных систем

    Более 95 % данных, используемых в управлении предприятием, могут быть размещены на одном персональном компьютере, обеспечив возможность его независимой работы [16]. Поток исправлений и дополнений, создаваемый на этом компьютере, ничтожен по сравнению с объемом данных, используемых при этом. Поэтому если хранить непрерывно используемые данные на самих компьютерах, и организовать обмен между ними исправлениями и дополнениями к хранящимся данным, то суммарный передаваемый трафик резко снизится. Это позволяет понизить требования к каналам связи между компьютерами и чаще использовать асинхронную связь, и благодаря этому создавать надежно функционирующие распределенные информационные системы, использующие для связи отдельных элементов неустойчивую связь типа Интернета, мобильную связь, коммерческие спутниковые каналы. А минимизация трафика между элементами сделает вполне доступной стоимость эксплуатации такой связи. Конечно, реализация такой системы не элементарна, и требует решения ряда проблем, одна из которых своевременная синхронизация данных.

    Каждый АРМ независим, содержит только ту информацию, с которой должен работать, а актуальность данных во всей системе обеспечивается благодаря непрерывному обмену сообщениями с другими АРМами. Обмен сообщениями между АРМами может быть реализован различными способами, от отправки данных по электронной почте до передачи данных по сетям.

    Еще одним из преимуществ такой схемы эксплуатации и архитектуры системы, является обеспечение возможности персональной ответственности за сохранность данных. Так как данные, доступные на конкретном рабочем месте, находятся только на этом компьютере, при использовании средств шифрования и личных аппаратных ключей исключается доступ к данным посторонних, в том числе и IT администраторов.

    Такая архитектура системы также позволяет организовать распределенные вычисления между клиентскими машинами. Например, расчет какой-либо задачи, требующей больших вычислений, можно распределить между соседними АРМами благодаря тому, что они, как правило, обладают одной информацией в своих БД и, таким образом, добиться максимальной производительности системы.

    Распределенные системы с репликацией

    Данными между различными рабочими станциями и централизованным хранилищем данных, передаются репликацией [19] (рис. 5.7). При вводе информации на рабочих станциях – данные также записываются в локальную базу данных, а лишь затем синхронизируются.

    (рис 5.7) Архитектура распределенных систем с репликацией

    Распределенные системы с элементами удаленного исполнения

    Существуют определенные особенности, которые невозможно качественно реализовать на обычной распределенной системе репликативного типа. К этим особенностям можно отнести [19]:

  • использование данных из сущностей, которые хранятся на удаленном сервере (узле);
  • использование данных из сущностей, хранящихся на разных серверах (узлах) частично;
  • использование обособленного функционала, на выделенном сервере (узле).
  • У каждого из описанных типов используется общий принцип: программа клиент или обращается к выделенному (удаленному) серверу непосредственно или обращается к локальной базе, которая инкапсулирует в себе обращение к удаленному серверу (рис. 5.8).

    (рис 5.8) Архитектура распределенных систем с удаленным исполнением

    5.1.7. Архитектура Веб-приложений

    Обычно Веб-приложения создаются как приложения в архитектуре "клиент-сервер", но серверная часть имеет различные архитектурные решения [20].

    Изначально World Wide Web (WWW) представлялась ее создателям как "пространство для обмена информацией, в котором люди и компьютеры могут общаться между собой". Поэтому первые Веб-приложения представляли собой примитивные файловые серверы, которые возвращали статические HTML-страницы запросившим их клиентам. Таким образом, Веб начиналась как документо-ориентированная.

    Следующим этапом развития Веб стало появление понятия приложений, которые базировались на таких интерфейсах, как CGI (или FastCGI), а в дальнейшем – на ISAPI. Common Gateway Interface (CGI) – это стандартный интерфейс работы с серверами, позволяющий выполнять серверные приложения, вызываемые через URL. Входной информацией для таких приложений служило содержимое HTTP-заголовка (и тело запроса при использовании протокола POST). CGI-приложения генерировали HTML-код, который возвращался браузеру. Основной проблемой CGI-приложений было то, что при каждом клиентском запросе сервер выполнял CGI-программу в реальном времени, загружая ее в отдельное адресное пространство.

    Появление Internet Server API (ISAPI) позволило не только решить проблемы производительности, которые возникали с CGI-приложениями, но и предоставить в распоряжение разработчиков более богатый программный интерфейс. ISAPI DLL можно было ассоциировать с расширениями имен файлов через специальную мета-базу. Эти два механизма (CGI и ISAPI) послужили основой создания первого типа Веб-приложений, в которых, в зависимости от каких-либо клиентских действий, выполнялся серверный код. Таким образом, стала возможной динамическая генерация содержимого Веб-страниц и наполнение Веб перестало быть чисто статическим.

    Интерфейс ISAPI – это особенность Microsoft Internet Information Server. ISAPI-приложения представляют собой динамические загружаемые библиотеки (DLL), которые выполняются в адресном пространстве Веб-сервера. У других Веб-серверов через некоторое время также появилась возможность выполнять приложения, реализованные в виде библиотек. В случае Веб-серверов Netscape этот программный интерфейс назывался NSAPI (Netscape Server API). У довольно популярного Веб-сервера Apache также имеется возможность выполнять Веб-приложения, реализованные в виде библиотек; такие библиотеки называются Apache DSO (Dynamic Shared Objects).

    Естественно, что при использовании как CGI-, так и ISAPI-приложений разработчики в основном решали одни и те же задачи, поэтому естественным шагом стало появление нового, высокоуровневого интерфейса, который упростил задачи генерации HTML-кода, позволил обращаться к компонентам и использовать базы данных. Таким интерфейсом стала объектная модель Active Server Pages (ASP), построенная на основе ISAPI-фильтра.

    Основной идеей ASP с точки зрения создания интерфейса приложения является то, что на Веб-странице присутствуют фрагменты кода, который интерпретируется Веб-сервером и вместо которого пользователь получает результат выполнения этих фрагментов кода.

    Вскоре после появления ASP были созданы и другие технологии, реализующие идею размещения внутри Веб-страницы кода, выполняемого Веб-сервером. Наиболее известная из них на сегодняшний день – технология JSP (Java Server Pages), основной идеей которой является однократная компиляция Java-кода (сервлета) при первом обращении к нему, выполнение методов этого сервлета и помещение результатов выполнения этих методов в набор данных, отправляемых в браузер.

    Новейшая версия технологии Active Server Pages – ASP .NET, являющаяся ключевой в архитектуре Microsoft .NET Framework. С помощью ASP .NET можно создавать Веб-приложения и Веб-сервисы, которые не только позволяют реализовать динамическую генерацию HTML-страниц, но и интегрируются с серверными компонентами и могут использоваться для решения широкого круга бизнес-задач, возникающих перед разработчиками современных Веб-приложений.

    В общем случае клиентом Веб-сервера может быть не только персональный компьютер, оснащенный обычным Веб-браузером. Одновременно с широким распространением мобильных устройств появилась и проблема предоставления Веб-серверами данных, которые могут быть интерпретированы этими устройствами. Поскольку мобильные устройства обладают характеристиками, отличными от характеристик персональных компьютеров (ограниченным размером экрана, малым объемом памяти, а нередко и невозможностью отобразить что-либо, кроме нескольких строк черно-белого текста), для них существуют и другие протоколы передачи данных (WAP – Wireless Access Protocol) и соответствующие языки разметки (WML – Wireless Markup Language, СHTML – Compact HTML и т.п.). При этом возникает задача передачи данных на мобильное устройство в соответствующем формате (и для этой цели существуют специальные сайты), либо, что представляется более удобным, происходит опознание типа устройства в момент его обращения к серверу и преобразование исходного документа (например, в формате XML) в формат, требующийся данному мобильному устройству (например, с помощью XSLT-преобразования).

    Другим способом поддержки различных типов клиентов является создание "разумных" серверных компонентов, которые способны генерировать различный код в зависимости от типа клиента. Такой подход, в частности, реализован в Microsoft ASP .NET.

    Другим направлением развития клиентских частей Веб-приложений стало размещение некоторой части логики приложения (такой как проверка корректности вводимых данных) в самом Веб-браузере. В частности, современные Веб-браузеры способны интерпретировать скриптовые языки (VBScript, JavaScript), код на которых, как и ASP-код, внедряется в Веб-страницу, но интерпретируется не Веб-сервером, а браузером и соответственно выполняется на клиентском устройстве. Кроме того, современные браузеры способны отображать и выполнять Java-аплеты – специальные Java-приложения, которые пользователь получает в составе Веб-страницы, а некоторые из браузеров могут также служить контейнерами для элементов управления ActiveX – выполняющихся в адресном пространстве браузера специальных COM-серверов, также получаемых в составе Веб-страницы. И в Java-аплетах, и в элементах управления ActiveX можно реализовать практически любую функциональность.

    Отметим, что с ростом объема используемых данных и числа посетителей Веб-сайтов возрастают и требования к надежности, производительности и масштабируемости Веб-приложений. Следующим этапом эволюции подобных приложений стало отделение бизнес-логики, реализованной в Веб-приложении, а нередко и сервисов обработки данных и реализации транзакций от его интерфейса. В этом случае в самом Веб-приложении обычно остается так называемая презентационная часть, а бизнес-логика, обработка данных и реализация транзакций переносятся в сервер приложений в виде бизнес-объектов. В зависимости от типа сервера приложений подобные бизнес-объекты могут быть выполняющимися самостоятельно COM-серверами, CORBA-серверами, а также объектами COM+, выполняющимися с помощью служб компонентов Windows 2000, или объектами EJB (Enterprise Java Beans), исполняемыми сервером приложений, поддерживающим спецификаци ю J2EE (Java 2 Enterprise Edition). В качестве механизма доступа к данным подобные объекты могут использовать OLE DB, ODBC, JDBC (это зависит от того, как реализован бизнес-объект).

    Нередко подобные бизнес-объекты предоставляют доступ к данным корпоративных информационных систем либо реализуют какую-либо часть их функциональности. Нередко они позволяют, например, интегрировать Веб-сайт с CRM-системами (Customer Relationship Management) или с ERP-системами (Enterprise Resource Planning), сохраняя в корпоративных системах сведения о посетителях сайта и предоставляя потенциальным клиентам сведения об имеющейся продукции для осуществления заказов.

    Поскольку современный Интернет – это не столько средство демонстрации присутствия компании на рынке или инструмент маркетинга, сколько инструмент ведения бизнеса, достаточно важными становятся задачи реализации организации через Интернет таких взаимоотношений с клиентами, как продажа товаров и услуг. И здесь довольно важными становятся решения для электронной коммерции типа "предприятие-клиент" (B2C – business-to-consumer). Не менее важными становятся и задачи интеграции Веб-приложений c данными и приложениями партнеров с целью реализации схемы "предприятие-предприятие" (B2B – business-to-business), позволяющей заключать торговые сделки между предприятиями, обмениваться каталогами товаров, проводить аукционы, создавать электронные торговые площадки.

    Отметим, что, будучи составной частью подобного решения, Веб-сервер должен уметь не только выполнять приложения и взаимодействовать с сервером приложений, но и использовать сервисы интеграции, сервисы управления приложениями и данными, а также сервисы для разработчиков.

    Следующим шагом эволюции Веб-приложений, помимо доступа к корпоративным данным и данным партнеров, стало получение доступа к корпоративным приложениям. Для решения этой задачи интеграции Веб-приложений с внутренними информационными системами предприятий и с приложениями, обеспечивающими взаимодействие с клиентами и партнерами, используются специальные решения, называемые корпоративными порталами.

    Нередко частью портального решения являются средства управления информационным наполнением Веб-сайта – ведь объем данных, доступных пользователям с помощью сайтов крупных компаний и порталов, сейчас таков, что управление этими данными "вручную" не представляется возможным.

    Обобщая вышесказанное можно выделить основные особенности веб-архитектуры [19, 20]:

  • отсутствие необходимости использовать дополнительное ПО на стороне клиента – это позволяет автоматически реализовать клиентскую часть на всех платформах;
  • возможность подключения практически неограниченного количества клиентов;
  • благодаря единственному месту хранения данных и наличия системы управления базами данных обеспечиваются минимальные требования для поддержания целостности данных;
  • доступность при работоспособности сервера и каналов связи;
  • недоступность при отсутствии работоспособности сервера или каналов связи;
  • достаточно низкая скорость Веб сервера и каналов передачи данных;
  • относительно объема данных – архитектура Веб систем не имеет существенных ограничений.
  • Схематически такую архитектуру (в трехзвенном варианте) можно представить, как показано на рис. 5.9.

    (рис 5.9) Архитектура Веб-приложений

    5.1.8. Сервис-ориентированная архитектура

    Решение многих описанных выше задач, возникающих при создании современных Веб-приложений, теперь начинает возлагаться на Веб-сервисы – не зависящие от платформы, объектной модели и клиента программные компоненты, которые можно вызывать из клиентских Веб-приложений (а также из самих Веб-сервисов) через основанный на протоколе HTTP и языке XML протокол SOAP [20]. Для описания Веб-сервисов используется XML-подобный язык WSDL, а для организации реестров Веб-сервисов, в которых разработчики и компании могут искать необходимые им сервисы, а также публиковать данные о своих сервисах – интерфейс UDDI.

    Поддержка Веб-сервисов стала одним из главных стратегических направлений для многих компаний, специализирующихся на выпуске серверов приложений, систем управления базами данных и средств разработки приложений.

    Сервис-ориентированная архитектура (SOA, service-oriented architecture) – модульный подход к разработке программного обеспечения, основанный на использовании сервисов (служб) со стандартизированными интерфейсами [21].

    OASIS (Организация по распространению открытых стандартов структурированной информации) определяет SOA следующим образом (OASIS Reference Model for Service Oriented Architecture V 1.0): Сервисно-ориентированная архитектура – это парадигма организации и использования распределенных информационных ресурсов таких как: приложения и данные, находящихся в сфере ответственности разных владельцев, для достижения желаемых результатов потребителем, которым может быть: конечный пользователь или другое приложение.

    В основе SOA лежат принципы многократного использования функциональных элементов ИТ, ликвидации дублирования функциональности в ПО, унификации типовых операционных процессов, обеспечения перевода операционной модели компании на централизованные процессы и функциональную организацию на основе промышленной платформы интеграции.

    Компоненты программы могут быть распределены по разным узлам сети, и предлагаются как независимые, слабо связанные, заменяемые сервисы-приложения. Программные комплексы, разработанные в соответствии с SOA, часто реализуются как набор веб-сервисов, интегрированных при помощи известных стандартных протоколов (SOAP, WSDL, и т. п.)

    Интерфейс компонентов SОА-программы предоставляет инкапсуляцию деталей реализации конкретного компонента (ОС, платформы, языка программирования, вендора, и т. п.) от остальных компонентов. Таким образом, SOA предоставляет гибкий и элегантный способ комбинирования и многократного использования компонентов для построения сложных распределенных программных комплексов.

    SOA хорошо зарекомендовала себя для построения крупных корпоративных программных приложений. Целый ряд разработчиков и интеграторов предлагают инструменты и решения на основе SOA (например, платформы IBM WebSphere, Oracle/BEA Aqualogic, Microsoft Windows Communication Foundation, SAP NetWeaver, ИВК Юпитер, TIBCO, Diasoft).

    Основными целями применения SOA для крупных информационных систем, уровня предприятия, и выше являются [21]:

  • сокращение издержек при разработке приложений, за счет упорядочивания процесса разработки;
  • расширение повторного использования кода;
  • независимость от используемых платформ, инструментов, языков разработки;
  • повышение масштабируемости создаваемых систем;
  • улучшение управляемости создаваемых систем.
  • Принципы SOA:

  • архитектура, как таковая, не привязана к какой-то определенной технологии;
  • независимость организации системы от используемой вычислительной платформы (платформ);
  • независимость организации системы от применяемых языков программирования;
  • использование сервисов, независимых от конкретных приложений, с единообразными интерфейсами доступа к ним;
  • организация сервисов как слабосвязанных компонентов для построения систем.
  • Архитектура не привязана к какой-то определенной технологии. Она может быть реализована с использованием широкого спектра технологий, включая такие технологии как REST, RPC, DCOM, CORBA или веб-сервисы. SOA может быть реализована, используя один из этих протоколов и, например, может использовать, дополнительно, механизм файловой системы, для обмена данными.

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

    SOA также может рассматриваться как стиль архитектуры информационных систем, который позволяет создавать приложения, построенные путем комбинации слабосвязанных и взаимодействующих сервисов. Эти сервисы взаимодействуют на основе какого-либо строго определенного платформо-независимого и языково-независимого интерфейса (например, WSDL). Определение интерфейса скрывает языково-зависимую реализацию сервиса.

    Таким образом, системы, основанные на SOA, могут быть независимы от технологий разработки и платформ (таких как Java, .NET и т. д.). К примеру, сервисы, написанные на C#, работающие на платформах .Net и сервисы на Java, работающие на платформах Java EE, могут быть с одинаковым успехом вызваны общим составным приложением. Приложения, работающие на одних платформах, могут вызывать сервисы, работающие на других платформах, что облегчает повторное использование компонентов.

    SOA может поддерживать интеграцию и консолидацию операций в составе сложных систем, однако SOA не определяет и не предоставляет методологий или фреймворков для документирования сервисов.

    Языки высокого уровня, такие как BPEL, или спецификации, такие как WS-CDL и WS-Coordination, расширяют концепцию сервиса, предоставляя метод оркестрации, для объединения мелких сервисов в более обширные бизнес-сервисы, которые, в свою очередь, могут быть включены в состав технологических процессов и бизнес-процессов, реализованных в виде составных приложений или порталов.

    5.1.9. Ключевые термины

    Архитектура, Централизованная архитектура, Архитектура "файл-сервер", Двухзвенная архитектура "клиент-сервер", , Терминал, Сервер приложений, Сервер базы данных, Архитектура распределенных систем, Архитектура Веб-приложений, Сервис-ориентированная архитектура.

    5.2. Шаблоны проектирования

    5.2.1. Общие сведения

    В качестве основы проектирования информационных систем применяются "типовые решения" или "шаблоны проектирования" (Patterns).

    Шаблоны проектирования (паттерн, design pattern) – это многократно применяемая архитектурная конструкция, предоставляющая решение общей проблемы проектирования в рамках конкретного контекста и описывающая значимость этого решения [22].

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

    В 1970-е годы архитектор Кристофер Александр составил набор шаблонов проектирования [23]. В области архитектуры эта идея не получила такого развития, как позже в области программной разработки. Согласно определению Кристофера Александера: "Каждое типовое решение описывает некую повторяющуюся проблему и ключ к ее разгадке, причем таким образом, что вы можете пользоваться этим ключом многократно, ни разу не придя к одному и тому же результату" [18].

    В 1987 году Кент Бэк и Вард Каннигем взяли идеи Александра и разработали шаблоны применительно к разработке программного обеспечения для разработки графических оболочек на языке Smalltalk.

    В 1988 году Эрих Гамма начал писать докторскую диссертацию при Цюрихском университете об общей переносимости этой методики на разработку программ.

    В 1989-1991 годах Джеймс Коплин трудился над разработкой идиом для программирования на C++ и опубликовал в 1991 году книгу Advanced C++ Idioms. В этом же году Эрих Гамма заканчивает свою докторскую диссертацию и переезжает в США, где в сотрудничестве с Ричардом Хелмом, Ральфом Джонсоном и Джоном Влиссидсом публикует книгу Design Patterns – Elements of Reusable Object-Oriented Software [24]. В этой книге описаны 23 шаблона проектирования. Также команда авторов этой книги известна общественности под названием Банда четырех (Gang of Four, часто сокращается до GoF). Именно эта книга стала причиной роста популярности шаблонов проектирования.

    Другим видным деятелем в области проектирования программных систем, который поддержал использование паттернов, является Мартин Фаулер, написавший книгу "Архитектура корпоративных программных приложений" (Patterns of Enterprise Application Architecture). Как отметил Мартин Фаулер в своей книге "собираясь воспользоваться типовыми решениями, не забывайте, что они только отправная точка, а не пункт назначения" [18].

    В книге Крейга Лармана "Применение UML и шаблонов проектирования" описано 9 шаблонов GRASP (General Responsibility Assignment Software Patterns, общие образцы распределения обязанностей) – паттернов, используемых в объектно-ориентированном проектировании для решения общих задач по назначению обязанностей классам и объектам. Каждый из них помогает решить некоторую проблему, возникающую при объектно-ориентированном анализе, и которая возникает практически в любом проекте по разработке программного обеспечения.

    Главная польза каждого отдельного шаблона состоит в том, что он описывает решение целого класса абстрактных проблем. Также тот факт, что каждый шаблон имеет свое имя, облегчает дискуссию об абстрактных структурах данных (ADT) между разработчиками, так как они могут ссылаться на известные шаблоны. Таким образом, за счет шаблонов производится унификация терминологии, названий модулей и элементов проекта.

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

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

    Есть мнение, что слепое применение шаблонов из справочника, без осмысления причин и предпосылок выделения каждого отдельного шаблона, замедляет профессиональный рост программиста, так как подменяет творческую работу механическим подставлением шаблонов. Люди, придерживающиеся данного мнения, считают, что знакомиться со списками шаблонов надо тогда, когда "дорос" до них в профессиональном плане – и не раньше. Хороший критерий нужной степени профессионализма – выделение шаблонов самостоятельно, на основании собственного опыта. При этом, разумеется, знакомство с теорией, связанной с шаблонами, полезно на любом уровне профессионализма и направляет развитие программиста в правильную сторону. Сомнению подвергается только использование шаблонов "по справочнику".

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

    Шаблоны проектирования классифицируют следующим образом [18, 25]:

  • Паттерны проектирования классов/объектов
  • Структурные паттерны проектирования классов/объектов
  • Адаптер (Adapter) – GoF
  • Декоратор (Decorator) или Оболочка (Wrapper) – GoF
  • Заместитель (Proxy) или Суррогат (Surrogate) – GoF
  • Информационный эксперт (Information Expert)- GRASP
  • Компоновщик (Composite) – GoF
  • Мост (Bridge), Handle (описатель) или Тело (Body) – GoF
  • Низкая связанность (Low Coupling) – GRASP
  • Приспособленец (Flyweight) – GoF
  • Устойчивый к изменениям (Protected Variations) – GRASP
  • Фасад (Facade) – GoF
  • Паттерны проектирования поведения классов/объектов
  • Интерпретатор (Interpreter ) – GoF
  • Итератор (Iterator) или Курсор (Cursor) – GoF
  • Команда (Command), Действие (Action) или Транзакция (Транзакция) – GoF
  • Наблюдатель (Observer), Опубликовать – подписаться (Publish – Subscribe) или Delegation Event Model – GoF
  • Не разговаривайте с неизвестными (Don't talk to strangers) – GRASP
  • Посетитель (Visitor) – GoF
  • Посредник (Mediator) – GoF
  • Состояние (State) – GoF
  • Стратегия (Strategy) – GoF
  • Хранитель (Memento) – GoF
  • Цепочка обязанностей (Chain of Responsibility) – GoF
  • Шаблонный метод (Template Method) – GoF
  • Высокое зацепление (High Cohesion) – GRASP
  • Контроллер (Controller) – GRASP
  • Полиморфизм (Polymorphism) – GRASP
  • Искусственный (Pure Fabrication) – GRASP
  • Перенаправление (Indirection) – GRASP
  • Порождающие паттерны проектирования
  • Абстрактная фабрика (Abstract Factory, Factory), др. название Инструментарий (Kit) – GoF
  • Одиночка (Singleton) – GoF
  • Прототип (Prototype) – GoF
  • Создатель экземпляров класса (Creator) – GRASP
  • Строитель (Builder) – GoF
  • Фабричный метод (Factory Method) или Виртуальный конструктор (Virtual Constructor) – GoF
  • Архитектурные системные паттерны
  • Структурные паттерны
  • Репозиторий
  • Клиент/сервер
  • Обьектно – ориентированный, Модель предметной области (Domain Model), модуль таблицы (Data Mapper)
  • Многоуровневая система (Layers) или абстрактная машина
  • Потоки данных (конвейер или фильтр)
  • Паттерны управления
  • Паттерны централизованного управления
  • Вызов – возврат (сценарий транзакции – частный случай)
  • Диспетчер
  • Паттерны управления, основанные на событиях
  • Передача сообщений
  • Управляемый прерываниями
  • Паттерны, обеспечивающие взаимодействие с базой данных
  • Активная запись (Active Record)
  • Единица работы (Unit Of Work)
  • Загрузка по требованию (Lazy Load)
  • Коллекция объектов (Identity Map)
  • Множество записей (Record Set)
  • Наследование с одной таблицей (Single Table Inheritance)
  • Наследование с таблицами для каждого класса (Class Table Inheritance)
  • Оптимистическая автономная блокировка (Optimistic Offline Lock)
  • Отображение с помощью внешних ключей
  • Отображение с помощью таблицы ассоциаций (Association Table Mapping)
  • Пессимистическая автономная блокировка (Pessimistic Offline Lock)
  • Поле идентификации (Identity Field)
  • Преобразователь данных (Data Mapper)
  • Cохранение сеанса на стороне клиента (Client Session State)
  • Cохранение сеанса на стороне сервера (Server Session State)
  • Шлюз записи данных (Row Data Gateway)
  • Шлюз таблицы данных (Table Data Gateway)
  • Паттерны, предназначенные для представления данных в Web
  • Модель-представление-контроллер (Model View Controller)
  • Контроллер страниц (Page Controller)
  • Контроллер запросов (Front Controller)
  • Представление по шаблону (Template View)
  • Представление с преобразованием (Transform View)
  • Двухэтапное представление (Two Step View)
  • Контроллер приложения (Application Controller)
  • Паттерны интеграции корпоративных информационных систем
  • Структурные паттерны интеграции
  • Взаимодействие "точка – точка"
  • Взаимодействие "звезда" (интегрирующая среда)
  • Смешанный способ взаимодействия
  • Паттерны по методу интеграции
  • Интеграция систем по данным (data-centric)
  • Функционально-центрический (function-centric) подход
  • Объектно-центрический (object-centric)
  • Интеграция на основе единой понятийной модели предметной области (concept-centric)
  • Паттерны интеграции по типу обмена данными
  • Файловый обмен
  • Общая база данных
  • Удаленный вызов процедур
  • Обмен сообщениями
  • Также на сегодняшний день существует ряд других шаблонов [22]:

  • Carrier Rider Mapper, предоставление доступа к хранимой информации;
  • аналитические шаблоны, описывают основной подход для составления требований для программного обеспечения (requirement analysis) до начала самого процесса программной разработки;
  • коммуникационные шаблоны, описывают процесс общения между отдельными участниками/сотрудниками организации;
  • организационные шаблоны, описывают организационную иерархию предприятия/фирмы;
  • Анти-паттерны (Anti-Design-Patterns) описывают как не следует поступать при разработке программ, показывая характерные ошибки в дизайне и в реализации;
  • и др.
  • Рассмотрим подробнее некоторые из паттернов проектирования.

    5.2.2. Обзор паттернов

    5.2.2.1. Паттерны проектирования классов/объектов

    5.2.2.1.1. Структурные паттерны (Structural)

    К структурным паттернам относятся [25]:

  • Адаптер (Adapter) – GoF;
  • Декоратор (Decorator) или Оболочка (Wrapper) – GoF;
  • Заместитель (Proxy) или Суррогат (Surrogate) – GoF;
  • Информационный эксперт (Information Expert)- GRASP;
  • Компоновщик (Composite) – GoF;
  • Мост (Bridge), Handle (описатель) или Тело (Body) – GoF;
  • Низкая связанность (Low Coupling) – GRASP;
  • Приспособленец (Flyweight) – GoF;
  • Устойчивый к изменениям (Protected Variations) – GRASP;
  • Фасад (Facade) – GoF.
  • Приведем примеры 2-х их данных паттернов (табл. 5.1) [25].

    Примеры структурных паттернов классов/объектов
    Компоновщик (Composite) – GoF
    Проблема Как обрабатывать группу или композицию структур объектов одновременно?
    Решение

    Определить классы для композитных и атомарных объектов таким образом, чтобы они реализовывали один и тот же интерфейс.

    (рис 5.10) 04_10
    Фасад (Facade) – GoF
    Проблема Как обеспечить унифицированный интерфейс с набором разрозненных реализаций или интерфейсов, например, с подсистемой, если нежелательно высокое связывание с этой подсистемой или реализация подсистемы может измениться?
    Решение

    Определить одну точку взаимодействия с подсистемой – фасадный объект, обеспечивающий общий интерфейс с подсистемой и возложить на него обязанность по взаимодействию с ее компонентами. Фасад – это внешний объект, обеспечивающий единственную точку входа для служб подсистемы. Реализация других компонентов подсистемы закрыта и не видна внешним компонентам. Фасадный объект обеспечивает реализацию паттерна "Устойчивый к изменениям" с точки зрения защиты от изменений в реализации подсистемы.

    (рис 5.11) 04_11

    5.2.2.1.2. Паттерны проектирования поведения (Behavioral)

    К поведенческим паттернам относятся [25]:

  • Интерпретатор (Interpreter ) – GoF;
  • Итератор (Iterator) или Курсор (Cursor) – GoF;
  • Команда (Command), Действие (Action) или Транзакция (Транзакция) – GoF;
  • Наблюдатель (Observer), Опубликовать – подписаться (Publish – Subscribe) или Delegation Event Model – GoF;
  • Не разговаривайте с неизвестными (Don't talk to strangers) – GRASP;
  • Посетитель (Visitor) – GoF;
  • Посредник (Mediator) – GoF;
  • Состояние (State) – GoF;
  • Стратегия (Strategy) – GoF;
  • Хранитель (Memento) – GoF;
  • Цепочка обязанностей (Chain of Responsibility) – GoF;
  • Шаблонный метод (Template Method) – GoF;
  • Высокое зацепление (High Cohesion) – GRASP;
  • Контроллер (Controller) – GRASP;
  • Полиморфизм (Polymorphism) – GRASP;
  • Искусственный (Pure Fabrication) – GRASP;
  • Перенаправление (Indirection) – GRASP.
  • Приведем примеры 3-х их данных паттернов (табл. 5.2) [25].

    Примеры поведенческих паттернов классов/объектов
    Итератор (Iterator) или Курсор (Cursor) – GoF
    Проблема Составной объект, например, список, должен предоставлять доступ к своим элементам (объектам), не раскрывая их внутреннюю структуру, причем перебирать список требуется по-разному в зависимости от задачи.
    Решение

    Создается класс "Итератор", который определяет интерфейс для доступа и перебора элементов, "КонкретныйИтератор" реализует интерфейс класса "Итератор" и следит за текущей позицией при обходе "Агрегата". "Агрегат" определяет интерфейс для создания объекта – итератора. "КонкретныйАгрегат" реализует интерфейс создания итератора и возвращает экземпляр класса "КонкретныйИтератор", "КонкретныйИтератор" отслеживает текущий объект в агрегате и может вычислить следующий объект при переборе.

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

    (рис 5.12) 04_12
    Посетитель (Visitor) – GoF
    Проблема Над каждым объектом некоторой структуры выполняется операция. Определить новую операцию, не изменяя классы объектов.
    Решение

    Клиент, использующий данный паттерн, должен создать объект класса "КонкретныйПосетитель", а затем посетить каждый элемент структуры. "Посетитель" объявляет операцию "Посетить" для каждого класса "КонкретныйЭлемент" (имя и сигнатура данной операции идентифицируют класс, элемент которого посещает "Посетитель" – то есть, посетитель может обращаться к элементу напрямую). "КонкретныйПосетитель" реализует все операции, объявленные в классе "Посетитель". Каждая операция реализует фрагмент алгоритма, определенного для класса соответствующего объекта в структуре.

    Класс "КонкретныйПосетитель" предоставляет контекст для этого алгоритма и сохраняет его локальное состояние. "Элемент" определяет операцию "Принять", которая принимает "Посетителя" в качестве аргумента, "КонкретныйЭлемент" реализует операцию "Принять", которая принимает "Посетителя" в качестве аргумента. "СтруктураОбьекта" может перечислить свои аргументы и предоставить посетителю высокоуровневый интерфейс для посещения своих элементов.

    Данный паттерн логично использовать, если в структуре присутствуют объекты многих классов с различными интерфейсами, и необходимо выполнить над ними операции, зависящие от конкретных классов, или если классы, устанавливающие структуру объектов, изменяются редко, но новые операции над этой структурой добавляются часто.

    Данный паттерн упрощается добавление новых операций, объединяет родственные операции в классе "Посетитель".

    В данном паттерне затруднено добавление новых классов "КонкретныйЭлемент", поскольку требуется объявление новой абстрактной операции в классе "Посетитель".

    (рис 5.13) 04_13
    Состояние (State) – GoF
    Проблема Варьировать поведение объекта в зависимости от его внутреннего состояния
    Решение

    Класс "Контекст" делегирует зависящие от состояния запросы текущему объекту "КонкретноеСостояние" (хранит экземпляр подкласса "КонкретноеСостояние", которым определяется текущее состояние), и определяет интерфейс, представляющий интерес для клиентов. "КонкретноеСостояние" реализует поведение, ассоциированное с неким состоянием объекта "Контекст". "Состояние" определяет интерфейс для инкапсуляции поведения, ассоциированного с конкретным экземпляром "Контекста".

    Данный паттерн локализует зависящее от состояния поведение и делит его на части, соответствующие состояниям, переходы между состояниями становятся явными.

    (рис 5.14) 04_14

    5.2.2.1.3. Порождающие паттерны проектирования

    К порождающим паттернам относятся [25]:

  • Абстрактная фабрика (Abstract Factory, Factory) – GoF;
  • Одиночка (Singleton) – GoF;
  • Прототип (Prototype) – GoF;
  • Создатель экземпляров класса (Creator) – GRASP;
  • Строитель (Builder) – GoF;
  • Фабричный метод (Factory Method) или Виртуальный конструктор (Virtual Constructor) – GoF.
  • Приведем примеры 2-х их данных паттернов (табл. 5.3) [25].

    Примеры порождающих паттернов классов/объектов
    Одиночка (Singleton) – GoF
    Проблема Какой специальный класс должен создавать "Абстрактную фабрику" и как получить к ней доступ? Необходим лишь один экземпляр специального класса, различные объекты должны обращаться к этому экземпляру через единственную точку доступа.
    Решение

    Создать класс и определить статический метод класса, возвращающий этот единственный объект. Разумнее создавать именно статический экземпляр специального класса, а не объявить требуемые методы статическими, поскольку при использовании методов экземпляра можно применить механизм наследования и создавать подклассы. Статические методы в языках программирования не полиморфны и не допускают перекрытия в производных классах. Решение на основе создания экземпляра является более гибким, поскольку впоследствии может потребоваться уже не единственный экземпляр объекта, а несколько.

    (рис 5.15) 04_15
    Фабричный метод (Factory Method) или Виртуальный конструктор (Virtual Constructor) – GoF
    Проблема Определить интерфейс для создания объекта, но оставить подклассам решение о том, какой класс инстанцировать, то есть, делегировать инстанцирование подклассам.
    Решение

    Абстрактный класс "Создатель" объявляет Фабричный Метод, возвращающий объект типа "Продукт" (абстрактный класс, определяющий интерфейс объектов, создаваемых фабричным методом). "Создатель" также может определить реализацию по умолчанию Фабричного Метода, который возвращает "КонкретныйПродукт". "КонкретныйСоздатель" замещает Фабричный Метод, возвращающий объект "КонкретныйПродукт". "Создатель" "полагается" на свои подклассы в определении Фабричного Метода, возвращающего объект "КонкретныйПродукт". Данный паттерн избавляет проектировщика от необходимости встраивать в код зависящие от приложения классы. Однако при применении данного паттерна возникает дополнительный уровень подклассов.

    (рис 5.16) 04_16

    5.2.2.2. Архитектурные системные паттерны

    5.2.2.2.1. Структурные паттерны

    К структурным паттернам относятся [25]:

  • Репозиторий;
  • Клиент/сервер;
  • Обьектно – ориентированный, Модель предметной области (Domain Model), модуль таблицы (Data Mapper);
  • Многоуровневая система (Layers) или абстрактная машина;
  • Потоки данных (конвейер или фильтр).
  • Приведем пример одного их данных паттернов (табл. 5.4) [25].

    Примеры стуктурных паттернов архитектуры
    Многоуровневая система (Layers) или абстрактная машина
    Описание

    В соответствии с паттерном "Многоуровневая система" структурные элементы системы организуются в отдельные уровни с взаимосвязанными обязанностями таким образом, чтобы на нижнем уровне располагались низкоуровневые службы и службы общего назначения, а на более высоких – объекты уровня логики приложения. При этом взаимодействие и связывание уровней происходит сверху вниз. Связывания объектов снизу вверх следует избегать.

    На рисунке показаны типичные уровни логической архитектуры системы.

    (рис 5.17) 04_17

    Слой представления охватывает все, что имеет отношение к общению пользователя с системой. К главным функциям слоя представления относится отображение информации и интерпретация вводимых пользователем команд с преобразованием их в соответствующие операции в контексте домена (бизнес – логики) и источника данных.

    Источник данных – подмножество функций, обеспечивающих взаимодействие со сторонними системами, которые выполняют

    В отличие от архитектурного паттерна "Клиент – сервер", слои вовсе не обязательно должны располагаться на разных машинах.

    Многоуровневая система может быть разработана пошагово (итеративно).

    Недостатками данного паттерна являются:

  • Изменение исходного кода влечет за собой переделку всех элементов системы, поскольку все элементы системы тесно связаны друг с другом.
  • Логика приложения тесно связана с интерфейсом пользователя – затруднительно менять интерфейс или принципы реализации логики. Из-за высокой связанности, работу по реализации системы сложно разделить между разработчиками и, кроме того, сложно модифицировать функции приложения или переходить на новые технологии.
  • 5.2.2.2.2. Паттерны управления

    К паттернам управления относятся [25]:

  • Паттерны централизованного управления:
  • Вызов – возврат (сценарий транзакции – частный случай);
  • Диспетчер;
  • Паттерны управления, основанные на событиях:
  • Передача сообщений;
  • Управляемый прерываниями;
  • Паттерны, обеспечивающие взаимодействие с базой данных:
  • Активная запись (Active Record);
  • Единица работы (Unit Of Work);
  • Загрузка по требованию (Lazy Load);
  • Коллекция объектов (Identity Map);
  • Множество записей (Record Set);
  • Наследование с одной таблицей (Single Table Inheritance);
  • Наследование с таблицами для каждого класса (Class Table Inheritance);
  • Оптимистическая автономная блокировка (Optimistic Offline Lock);
  • Отображение с помощью внешних ключей;
  • Отображение с помощью таблицы ассоциаций (Association Table Mapping);
  • Пессимистическая автономная блокировка (Pessimistic Offline Lock);
  • Поле идентификации (Identity Field);
  • Преобразователь данных (Data Mapper);
  • Cохранение сеанса на стороне клиента (Client Session State);
  • Cохранение сеанса на стороне сервера (Server Session State);
  • Шлюз записи данных (Row Data Gateway);
  • Шлюз таблицы данных (Table Data Gateway).
  • В данной лекции примеры паттернов управления рассматриваться не будут.

    5.2.2.2.3. Паттерны, предназначенные для представления данных в Web

    К паттернам, предназначенным для представления данных в Web, относятся [18]:

  • Модель-представление-контроллер (Model View Controller);
  • Контроллер страниц (Page Controller);
  • Контроллер запросов (Front Controller);
  • Представление по шаблону (Template View);
  • Представление с преобразованием (Transform View);
  • Двухэтапное представление (Two Step View);
  • Контроллер приложения (Application Controller).
  • Приведем пример 4-х их данных паттернов (табл. 5.5) [18].

    Примеры паттернов, предназначенных для представления данных в Web
    Модель-представление-контроллер (Model View Controller)
    Описание (рис 5.18) 04_18

    Типовое решение модель-представление-контроллер подразумевает выделение трех отдельных ролей. Модель – это объект, предоставляющий некоторую информацию о домене. У модели нет визуального интерфейса, она содержит в себе все данные и поведение, не связанные с пользовательским интерфейсом. В объектно-ориентированном контексте наиболее "чистой" формой модели является объект модели предметной области. В качестве модели можно рассматривать и сценарий транзакции, если он не содержит в себе никакой логики, связанной с пользовательским интерфейсом. Подобное определение не очень расширяет понятие модели, однако полностью соответствует распределению ролей в рассматриваемом типовом решении.

    Представление отображает содержимое модели средствами графического интерфейса. Таким образом, если модель – это объект покупателя, соответствующее представление может быть фреймом с кучей элементов управления или HTML-страницей, заполненной информацией о покупателе. Функции представления заключаются только в отображении информации на экране. Все изменения информации обрабатываются третьим "участником" системы – контроллером. Контроллер получает входные данные от пользователя, выполняет операции над моделью и указывает представлению на необходимость соответствующего обновления. В этом плане графический интерфейс можно рассматривать как совокупность представления и контроллера.

    Говоря о типовом решении модель-представление-контроллер, нельзя не подчеркнуть два принципиальных типа разделения: отделение представления от модели и отделение контроллера от представления.

    Отделение представления от модели – это один из фундаментальных принципов проектирования программного обеспечения. Наличие подобного разделения весьма важно по ряду причин:

  • Представление и модель относятся к совершенно разным сферам программирования.
  • Пользователи хотят, чтобы, в зависимости от ситуации, одна и та же информация могла быть отображена разными способами.
  • Объекты, не имеющие визуального интерфейса, гораздо легче тестировать, чем объекты с интерфейсом.
  • Ключевым моментом в отделении представления от модели является направление зависимостей: представление зависит от модели, но модель не зависит от представления. Это означает, что изменение представления не требует изменения модели.

    Отделение контроллера от представления. Классическим примером необходимости подобного разделения является поддержка редактируемого и нередактируемого поведения. Этого можно достичь при наличии одного представления и двух контроллеров (для двух вариантов использования), где контроллеры являются стратегиями, используемыми представлением. Между тем на практике в большинстве систем каждому представлению соответствует только один контроллер, поэтому разделение между ними не проводится. О данном решении вспомнили только при появлении Web-интерфейсов, где отделение контроллера от представления оказалось чрезвычайно полезным.

    Контроллер страниц (Page Controller)
    Описание (рис 5.19) 04_19

    В основе контроллера страниц лежит идея создания компонентов, которые будут выполнять роль контроллеров для каждой страницы Веб-сайта. На практике количество контроллеров не всегда в точности соответствует количеству страниц, поскольку иногда при щелчке на ссылке открываются страницы с разным динамическим содержимым. Если говорить более точно, контроллер необходим для каждого действия, под которым подразумевается щелчок на кнопке или гиперссылке.

    Контроллер страниц может быть реализован в виде сценария (сценария CGI, сервлета и т.п.) или страницы сервера (ASP, PHP, JSP и т.п.). Использование страницы сервера обычно предполагает сочетание в одном файле контроллера страниц и представления по шаблону. Это хорошо для представления по шаблону, но не очень подходит для контроллера страниц, поскольку значительно затрудняет правильное структурирование этого компонента. Данная проблема не столь важна, если страница применяется только для простого отображения информации. Тем не менее, если использование страницы предполагает наличие логики, связанной с извлечением пользовательских данных или выбором представления для отображения результатов, страница сервера может заполниться кодом "скриптлета", т.е. внедренного сценария.

    Чтобы избежать подобных проблем, можно воспользоваться вспомогательным объектом (helper object). При получении запроса страница сервера вызывает вспомогательный объект для обработки всей имеющейся логики. В зависимости от ситуации, вспомогательный объект может вернуть управление первоначальной странице сервера или же обратиться к другой странице сервера, чтобы она выступила в качестве представления. В этом случае обработчиком запросов является страница сервера, однако большая часть логики контроллера заключена во вспомогательном объекте.

    Возможной альтернативой описанному подходу является реализация обработчика и контроллера в виде сценария. В этом случае при поступлении запроса Веб-сервер передает управление сценарию; сценарий выполняет все действия, возложенные на контроллер, после чего отображает полученные результаты с помощью нужного представления.

    Ниже перечислены основные обязанности контроллера страниц.

  • Проанализировать адрес URL и извлечь данные, введенные пользователем в соответствующие формы, чтобы собрать все сведения, необходимые для выполнения действия.
  • Создать объекты модели и вызвать их методы, необходимые для обработки данных.
  • Определить представление, которое должно быть использовано для отображения результатов, и передать ему необходимую информацию, полученную от модели.
  • Контроллер страниц не обязательно должен представлять собой единственный класс, зато все классы контроллеров могут использовать одни и те же вспомогательные объекты. Это особенно удобно, если на Веб-сервере должно быть несколько обработчиков, выполняющих аналогичные задания. В этом случае использование вспомогательного объекта позволяет избежать дублирования кода.

    При необходимости одни адреса URL можно обрабатывать с помощью страниц сервера, а другие – с помощью сценариев. Те адреса URL, у которых нет или почти нет логики контроллера, хорошо обрабатывать с помощью страниц сервера, потому что последние представляют собой простой механизм, удобный для понимания и внесения изменений. Все остальные адреса, для обработки которых необходима более сложная логика, требуют применения сценариев.

    Контроллер запросов (Front Controller)
    Описание (рис 5.20) 04_20

    Контроллер запросов обрабатывает все запросы, поступающие к Веб-сайту, и обычно состоит из двух частей: Веб-обработчика и иерархии команд. Веб-обработчик – это объект, который выполняет фактическое получение POST- или GET-запросов, поступивших на Веб-сервер. Он извлекает необходимую информацию из адреса URL и входных данных запроса, после чего решает, какое действие необходимо инициировать, и делегирует его выполнение соответствующей команде.

    Веб-обработчик обычно реализуется в виде класса, а не страницы сервера, поскольку он не генерирует никаких откликов. Команды также являются классами, а не страницами сервера; более того, им не нужно знать о наличии Веб-окружения, несмотря на то, что им часто передается информация из HTTP-запросов. В большинстве случаев Веб-обработчик – это довольно простая программа, функции которой заключаются в выборе нужной команды.

    Выбор команды может происходить статически или динамически. Статический выбор команды подразумевает проведение синтаксического анализа адреса URL и применение условной логики, а динамический – извлечение некоторого стандартного фрагмента адреса URL и динамическое создание экземпляра класса команды.

    Преимущества статического выбора команды состоят в использовании явного кода, наличии проверки времени компиляции и высокой гибкости возможных вариантов написания адресов URL. В свою очередь, использование динамического подхода позволяет добавлять новые команды, не требуя изменения Веб-обработчика.

    При динамическом выборе команд имя класса команды можно поместить непосредственно в адрес URL либо воспользоваться файлом свойств, который будет привязывать адреса URL к именам классов команд. Разумеется, это потребует создания дополнительного файла свойств, однако позволит легко и непринужденно изменять имена классов, не просматривая все имеющиеся на сервере Веб-страницы.

    Представление по шаблону (Template View)
    Описание (рис 5.21) 04_21

    Основная идея, лежащая в основе типового решения представление по шаблону, – вставка маркеров в текст готовой статической HTML-страницы. При вызове страницы для обслуживания запроса эти маркеры будут заменены результатами некоторых вычислений (например, результатами выполнения запросов к базе данных). Подобная схема позволяет создавать статическую часть страницы с помощью обычных средств, например текстовых редакторов, работающих по принципу WYSIWYG, и не требует знания языков программирования. Для получения динамической информации маркеры обращаются к отдельным программам.

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

    5.2.2.3. Паттерны интеграции корпоративных информационных систем

    5.2.2.3.1. Структурные паттерны интеграции

    К структурным паттернам интеграции относятся [25]:

  • Взаимодействие "точка – точка";
  • Взаимодействие "звезда" (интегрирующая среда);
  • Смешанный способ взаимодействия.
  • В данной лекции примеры структурных паттернов интеграции рассматриваться не будут.

    5.2.2.3.2. Паттерны по методу интеграции

    К паттернам по методу интеграции относятся [25]:

  • Интеграция систем по данным (data-centric);
  • Функционально-центрический (function-centric) подход;
  • Объектно-центрический (object-centric);
  • Интеграция на основе единой понятийной модели предметной области (concept-centric).
  • В данной лекции примеры паттернов по методу интеграции рассматриваться не будут.

    5.2.2.3.3. Паттерны интеграции по типу обмена данными

    К паттернам интеграции по типу обмена данными относятся [25]:

  • Файловый обмен;
  • Общая база данных;
  • Удаленный вызов процедур;
  • Обмен сообщениями.
  • В данной лекции примеры паттернов интеграции по типу обмена рассматриваться не будут.

    5.2.3. Ключевые термины

    Шаблон проектирования, Паттерн.

    5.3. Способы передачи данных в Веб

    5.3.1. Общие сведения

    Рассмотрим в качестве дополнительной темы способы передачи данных в Веб. Эти знания понадобятся при рассмотрении следующих лекций.

    Протокол HTTP имеет два самых часто используемых вида запросов GET и POST [26].

    Основное различие методов GET и POST состоит в способе передачи данных веб-формы обрабатывающему скрипту, а именно [27]:

  • Метод GET [28]

    Используется для запроса содержимого указанного ресурса.

    GET http://www.example.com/index.html HTTP/1.1
    

    Данная команда говорит серверу "Дай мне файл index.html, который находится в директории (на сайте) http://www.example.com/".

    С помощью метода GET можно также начать какой-либо процесс. В этом случае в тело ответного сообщения следует включить информацию о ходе выполнения процесса.

    Клиент может передавать параметры выполнения запроса в URI целевого ресурса после символа "?":

    GET /path/resource?param1=value1param2=value2 HTTP/1.1
    

    Согласно стандарту HTTP, запросы типа GET считаются идемпотентными – многократное повторение одного и того же запроса GET должно приводить к одинаковым результатам (при условии, что сам ресурс не изменился за время между запросами). Это позволяет кэшировать ответы на запросы GET.

    Кроме обычного метода GET, различают еще условный GET и частичный GET. Условные запросы GET содержат заголовки If-Modified-Since, If-Match, If-Range и подобные. Частичные GET содержат в запросе Range. Порядок выполнения подобных запросов определен стандартами отдельно.

    Итак, все, что отображается в адресной строке и любые ссылки, на которые можно нажать или скопировать – все они используют GET. Этот вид запроса позволяет вам посылать информацию на сервер, делать с ней что-то на сервере, и возвращать результат.

    Плюсы GET [26, 29]

  • Страницу всегда можно сохранить в закладках (СЕО-дружелюбен).
  • Он быстрее POST, так как вся информация находится в заголовках.
  • Информация, посылаемая на сервер, всегда видима (в адресной строке).
  • Минусы GET [26, 29]

  • Метод GET ограничивает объем передаваемой информации (максимальная длина URL не оговаривается спецификациями протокола HTTP, но на практике она в каждом конкретном случае зависит как от версии браузера, так и от настроек сервера).
  • Метод GET открыто пересылает введенную информацию в обрабатывающий сценарий, что может неблагоприятно сказаться на безопасности. Например, каждый человек, которому виден монитор вашего компьютера, может заметить введенный в форму пароль.
  • Метод POST [28]

    Применяется для передачи пользовательских данных заданному ресурсу.

    Например, в блогах посетители обычно могут вводить свои комментарии к записям в HTML-форму, после чего они передаются серверу методом POST и он помещает их на страницу. При этом передаваемые данные включаются в тело запроса. Аналогично с помощью метода POST обычно загружаются файлы.

    В отличие от метода GET, метод POST не считается идемпотентным, то есть многократное повторение одних и тех же запросов POST может возвращать разные результаты (например, после каждой отправки комментария будет появляться одна копия этого комментария).

    Сообщение ответа сервера на выполнение метода POST не кэшируется.

    POST может "симулировать" GET запрос, можно указывать параметры, как и в заголовке запроса, так и в теле.

    Плюсы POST [26, 29]

  • Можно отправить много информации на сервер, объем неограничен.
  • Отправляемая информация не показывается в адресной строке.
  • Метод POST в отличие от метода GET позволяет передавать запросу файлы.
  • Минусы POST [26, 29]

  • Медленнее, чем GET, так как анализируются заголовки и тело запроса.
  • Страницы, сгенерированные как результат запроса POST, нельзя добавить в закладки (СЕО-недружелюбен).
  • Нарушение логики работы кнопки "Назад" – элемента пользовательского интерфейса браузера. Вернуться на страницу, сгенерированную при помощи метода POST, после перехода с нее куда бы то ни было еще, довольно трудно. Internet Explorer, например, выдаст сообщение: "Внимание: страница устарела" с требованием нажать на кнопку "Обновить".
  • В ряде браузеров возникают трудности при сохранении веб-страниц, сгенерированных динамически с применением метода POST, для локального просмотра. Отмечаются также проблемы с распечаткой подобных документов.
  • В HTML формах можно указать, как отправлять информацию на сервер при помощи атрибута method:

    <form method="get">
    или
    <form method="post">
    

    По умолчанию всегда используется GET.

    При выборе использования методов POST и GET можно следовать следующим рекомендациям [30]:

  • 1. Все данные, которые участвуют в формировании страницы лучше передавать методом GET.

    Например:

  • перелистывание страниц;
  • поиск;
  • запрос по ID записи/категории/новости и т.п.
  • 2. Все данные, которые сохраняются в Базу Данных (или файл) лучше передавать методом POST и после записи данных, делать перенаправление (редирект) на страницу, где уведомлять, к примеру, что данные сохранены.
  • 5.3.2. Ключевые термины

    GET, POST.

    5.4. Краткие итоги

    Архитектура информационной системы – концепция, определяющая модель, структуру, выполняемые функции и взаимосвязь компонентов информационной системы.

    Классификация программных систем по их архитектуре:

  • Централизованная архитектура
  • Архитектура "файл-сервер"
  • Двухзвенная архитектура "клиент-сервер"
  • Многозвенная архитектура "клиент-сервер"
  • Архитектура распределенных систем
  • Архитектура Веб-приложений
  • Сервис-ориентированная архитектура
  • Шаблоны проектирования (паттерн, design pattern) – это многократно применяемая архитектурная конструкция, предоставляющая решение общей проблемы проектирования в рамках конкретного контекста и описывающая значимость этого решения.

    Протокол HTTP имеет два самых часто используемых вида запросов GET и POST. Основное различие методов GET и POST состоит в способе передачи данных веб-формы обрабатывающему скрипту.

    Страницы:

    Презентацию к данной лекции Вы можете скачать здесь.

    5.1. Архитектура информационных систем

    5.1.1. Общие сведения

    Современные программные приложения и информационные системы достигли такого уровня развития, что термин "архитектура" в применении к ним уже давно не удивляет. Грамотно построить информационную систему, эффективно и надежно функционирующую не проще, чем сконструировать и возвести современное многофункциональное здание [1].

    Когда речь заходит об "архитектуре информационной системы", обычно не возникает недостатка в определениях. Есть даже Web-сайты, которые собирают такие определения [2].

    Рассмотрим определение "архитектуры информационной системы", которое дают различные источники:

  • Архитектура – это организационная структура системы [3].
  • Архитектура информационной системы – концепция, определяющая модель, структуру, выполняемые функции и взаимосвязь компонентов информационной системы [4].
  • Архитектура – это базовая организация системы, воплощенная в ее компонентах, их отношениях между собой и с окружением, а также принципы, определяющие проектирование и развитие системы [5].
  • Архитектура это набор значимых решений по поводу организации системы программного обеспечения, набор структурных элементов и их интерфейсов, при помощи которых компонуется система, вместе с их поведением, определяемым во взаимодействии между этими элементами, компоновка элементов в постепенно укрупняющиеся подсистемы, а также стиль архитектуры, который направляет эту организацию – элементы и их интерфейсы, взаимодействия и компоновку [6].
  • Архитектура программы или компьютерной системы – это структура или структуры системы, которые включают элементы программы, видимые извне свойства этих элементов и связи между ними [7].
  • Архитектура – это структура организации и связанное с ней поведение системы [8]. Архитектуру можно рекурсивно разобрать на части, взаимодействующие посредством интерфейсов, связи, которые соединяют части, и условия сборки частей. Части, которые взаимодействуют через интерфейсы, включают классы, компоненты и подсистемы.
  • Архитектура программного обеспечения системы или набора систем состоит из всех важных проектных решений по поводу структур программы и взаимодействий между этими структурами, которые составляют системы [9]. Проектные решения обеспечивают желаемый набор свойств, которые должна поддерживать система, чтобы быть успешной. Проектные решения предоставляют концептуальную основу для разработки системы, ее поддержки и обслуживания.
  • Хотя определения несколько отличаются, можно заметить немалую степень сходства. Например, большинство определений указывают на то, что архитектура связана со структурой и поведением, а также только со значимыми решениями, может соответствовать некоторому архитектурному стилю, на нее влияют заинтересованные в ней лица и ее окружение, она воплощает решения на основе логического обоснования.

    Под архитектурой программных систем будем понимать совокупность решений относительно [1, 10]:

  • организации программной системы;
  • выбора структурных элементов, составляющих систему и их интерфейсов;
  • поведения этих элементов во взаимодействии с другими элементами;
  • объединение этих элементов в подсистемы;
  • архитектурного стиля, определяющего логическую и физическую организацию системы: статические и динамические элементы, их интерфейсы и способы их объединения.
  • Архитектура программной системы охватывает не только ее структурные и поведенческие аспекты, но и правила ее использования и интеграции с другими системами, функциональность, производительность, гибкость, надежность, возможность повторного применения, полноту, экономические и технологические ограничения, а также вопрос пользовательского интерфейса.

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

    Для того чтобы построить правильную и надежную архитектуру и грамотно спроектировать интеграцию программных систем необходимо четко следовать современным стандартам в этих областях. Без этого велика вероятность создать архитектуру, которая неспособна развиваться и удовлетворять растущим потребностям пользователей ИТ. В качестве законодателей стандартов в этой области выступают такие международные организации как SEI (Software Engineering Institute), WWW (консорциум World Wide Web), OMG (Object Management Group), организация разработчиков Java – JCP (Java Community Process), IEEE (Institute of Electrical and Electronics Engineers) и другие.

    Рассмотрим классификацию программных систем по их архитектуре:

  • Централизованная архитектура;
  • Архитектура "файл-сервер";
  • Двухзвенная архитектура "клиент-сервер";
  • Многозвенная архитектура "клиент-сервер";
  • Архитектура распределенных систем;
  • Архитектура Веб-приложений;
  • Сервис-ориентированная архитектура.
  • Следует заметить, что, как и любая классификация, данная классификация архитектур информационных систем не является абсолютно жесткой. В архитектуре любой конкретной информационной системы часто можно найти влияния нескольких общих архитектурных решений.

    Далее подробно рассмотрим особенности каждой архитектуры.

    5.1.2. Централизованная архитектура

    Централизованная архитектура вычислительных систем была распространена в 70-х и 80-х годах и реализовывалась на базе мейнфреймов (например, IBM-360/370 или их отечественных аналогов серии ЕС ЭВМ), либо на базе мини-ЭВМ (например, PDP-11 или их отечественного аналога СМ-4) [11]. Характерная особенность такой архитектуры – полная "неинтеллектуальность" терминалов. Их работой управляет хост-ЭВМ.

    Достоинства такой архитектуры [11, 12]:

  • пользователи совместно используют дорогие ресурсы ЭВМ и дорогие периферийные устройства;
  • централизация ресурсов и оборудования облегчает обслуживание и эксплуатацию вычислительной системы;
  • отсутствует необходимость администрирования рабочих мест пользователей;
  • Главным недостатком для пользователя является то, что он полностью зависит от администратора хост-ЭВМ. Пользователь не может настроить рабочую среду под свои потребности – все используемое программное обеспечение является коллективным.

    Использование такой архитектуры является оправданным, если хост-ЭВМ очень дорогая, например, супер-ЭВМ.

    Классическое представление централизованной архитектуры показано на рис. 5.1.

    (рис 5.1) Классическое представление централизованной архитектуры

    Центральная ЭВМ должна иметь большую память и высокую производительность, чтобы обеспечивать комфортную работу большого числа пользователей.

    Все приложения, работающие в такой архитектуре, полностью находятся в основной памяти хост-ЭВМ. Терминалы являются лишь устройствами ввода-вывода и таким образом в минимальной степени поддерживают интерфейс пользователя.

    5.1.3. Архитектура "файл-сервер"

    Файл-серверные приложения – приложения, схожие по своей структуре с локальными приложениями и использующие сетевой ресурс для хранения программы и данных [13].

  • Функции сервера: хранения данных и кода программы.
  • Функции клиента: обработка данных происходит исключительно на стороне клиента.
  • Классическое представление информационной системы в архитектуре "файл-сервер" представлено на рис. 5.2.

    (рис 5.2) Классическое представление архитектуры "файл-сервер"

    Организация информационных систем на основе использования выделенных файл-серверов все еще является распространенной в связи с наличием большого количества персональных компьютеров разного уровня развитости и сравнительной дешевизны связывания PC в локальные сети [14].

    Конечно, основным достоинством данной архитектуры является простота организации. Проектировщики и разработчики информационной системы находятся в привычных и комфортных условиях IBM PC в среде MS-DOS, Windows или какого-либо облегченного варианта Windows Server. Имеются удобные и развитые средства разработки графического пользовательского интерфейса, простые в использовании средства разработки систем баз данных и/или СУБД.

    Достоинства такой архитектуры [12, 13, 14]:

  • многопользовательский режим работы с данными;
  • удобство централизованного управления доступом;
  • низкая стоимость разработки;
  • высокая скорость разработки;
  • невысокая стоимость обновления и изменения ПО.
  • Недостатки [12, 13, 14]:

  • проблемы многопользовательской работы с данными: последовательный доступ, отсутствие гарантии целостности;
  • низкая производительность (зависит от производительности сети, сервера, клиента);
  • плохая возможность подключения новых клиентов;
  • ненадежность системы.
  • Простое, работающее с небольшими объемами информации и рассчитанное на применение в однопользовательском режиме, файл-серверное приложение можно спроектировать, разработать и отладить очень быстро [14]. Очень часто для небольшой компании для ведения, например, кадрового учета достаточно иметь изолированную систему, работающую на отдельно стоящем PC. Однако, в уже ненамного более сложных случаях (например, при организации информационной системы поддержки проекта, выполняемого группой) файл-серверные архитектуры становятся недостаточными.

    5.1.4. Архитектура "клиент-сервер"

    Клиент-сервер (Client-server) – вычислительная или сетевая архитектура, в которой задания или сетевая нагрузка распределены между поставщиками услуг (сервисов), называемых серверами, и заказчиками услуг, называемых клиентами [15]. Нередко клиенты и серверы взаимодействуют через компьютерную сеть и могут быть как различными физическими устройствами, так и программным обеспечением.

    Первоначально системы такого уровня базировались на классической двухуровневой клиент-серверной архитектуре (Two-tier architecture). Под клиент-серверным приложением в этом случае понимается информационная система, основанная на использовании серверов баз данных.

    Схематически такую архитектуру можно представить, как показано на рис. 5.3 [16].

    (рис 5.3) Классическое представление архитектуры "клиент-сервер"

    На стороне клиента выполняется код приложения, в который обязательно входят компоненты, поддерживающие интерфейс с конечным пользователем, производящие отчеты, выполняющие другие специфичные для приложения функции.

    Клиентская часть приложения взаимодействует с клиентской частью программного обеспечения управления базами данных, которая, фактически, является индивидуальным представителем СУБД для приложения.

    Заметим, что интерфейс между клиентской частью приложения и клиентской частью сервера баз данных, как правило, основан на использовании языка SQL. Поэтому такие функции, как, например, предварительная обработка форм, предназначенных для запросов к базе данных, или формирование результирующих отчетов выполняются в коде приложения.

    Наконец, клиентская часть сервера баз данных, используя средства сетевого доступа, обращается к серверу баз данных, передавая ему текст оператора языка SQL.

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

  • Сервер производит компиляцию полученного оператора.
  • Далее (если компиляция завершилась успешно) происходит выполнение оператора.
  • Разработчики и пользователи информационных систем, основанных на архитектуре "клиент-сервер", часто бывают неудовлетворены постоянно существующими сетевыми накладными расходами, которые следуют из потребности обращаться от клиента к серверу с каждым очередным запросом. На практике распространена ситуация, когда для эффективной работы отдельной клиентской составляющей информационной системы в действительности требуется только небольшая часть общей базы данных. Это приводит к идее поддержки локального кэша общей базы данных на стороне каждого клиента.

    Фактически, концепция локального кэширования базы данных является частным случаем концепции реплицированных баз данных. Как и в общем случае, для поддержки локального кэша базы данных программное обеспечение рабочих станций должно содержать компонент управления базами данных – упрощенный вариант сервера баз данных, который, например, может не обеспечивать многопользовательский режим доступа. Отдельной проблемой является обеспечение согласованности (когерентности) кэшей и общей базы данных. Здесь возможны различные решения – от автоматической поддержки согласованности за счет средств базового программного обеспечения управления базами данных до полного перекладывания этой задачи на прикладной уровень.

    Преимуществами данной архитектуры являются [12, 15]:

  • возможность, в большинстве случаев, распределить функции вычислительной системы между несколькими независимыми компьютерами в сети;
  • все данные хранятся на сервере, который, как правило, защищен гораздо лучше большинства клиентов, а также на сервере проще обеспечить контроль полномочий, чтобы разрешать доступ к данным только клиентам с соответствующими правами доступа;
  • поддержка многопользовательской работы;
  • гарантия целостности данных.
  • Недостатки [12, 15]:

  • неработоспособность сервера может сделать неработоспособной всю вычислительную сеть;
  • администрирование данной системы требует квалифицированного профессионала;
  • высокая стоимость оборудования;
  • бизнес логика приложений осталась в клиентском ПО.
  • При проектировании информационной системы, основанной на архитектуре "клиент-сервер", большее внимание следует обращать на грамотность общих решений. Технические средства пилотной версии могут быть минимальными (например, в качестве аппаратной основы сервера баз данных может использоваться одна из рабочих станций). После создания пилотной версии нужно провести дополнительную исследовательскую работу, чтобы выяснить узкие места системы. Только после этого необходимо принимать решение о выборе аппаратуры сервера, которая будет использоваться на практике.

    Увеличение масштабов информационной системы не порождает принципиальных проблем. Обычным решением является замена аппаратуры сервера (и, может быть, аппаратуры рабочих станций, если требуется переход к локальному кэшированию баз данных). В любом случае практически не затрагивается прикладная часть информационной системы.

    Также данный вид архитектуры называют архитектурой с "толстым" клиентом.

    5.1.5. Многоуровневый "клиент-сервер"

    Многоуровневая архитектура клиент-сервер (Multitier architecture) – разновидность архитектуры клиент-сервер, в которой функция обработки данных вынесена на один или несколько отдельных серверов [15]. Это позволяет разделить функции хранения, обработки и представления данных для более эффективного использования возможностей серверов и клиентов.

    Среди многоуровневой архитектуры клиент-сервер наиболее распространена трехуровневая архитектура (трехзвенная архитектура, three-tier), предполагающая наличие следующих компонентов приложения: клиентское приложение (обычно говорят "тонкий клиент" или терминал), подключенное к серверу приложений, который в свою очередь подключен к серверу базы данных [14, 17].

    Схематически такую архитектуру можно представить, как показано на рис. 5.4.

    (рис 5.4) Представление многоуровневой архитектуры "клиент-сервер"
  • Терминал – это интерфейсный (обычно графический) компонент, который представляет первый уровень, собственно приложение для конечного пользователя. Первый уровень не должен иметь прямых связей с базой данных (по требованиям безопасности), быть нагруженным основной бизнес-логикой (по требованиям масштабируемости) и хранить состояние приложения (по требованиям надежности). На первый уровень может быть вынесена и обычно выносится простейшая бизнес-логика: интерфейс авторизации, алгоритмы шифрования, проверка вводимых значений на допустимость и соответствие формату, несложные операции (сортировка, группировка, подсчет значений) с данными, уже загруженными на терминал.
  • Сервер приложений располагается на втором уровне. На втором уровне сосредоточена большая часть бизнес-логики. Вне его остаются фрагменты, экспортируемые на терминалы, а также погруженные в третий уровень хранимые процедуры и триггеры.
  • Сервер базы данных обеспечивает хранение данных и выносится на третий уровень. Обычно это стандартная реляционная или объектно-ориентированная СУБД. Если третий уровень представляет собой базу данных вместе с хранимыми процедурами, триггерами и схемой, описывающей приложение в терминах реляционной модели, то второй уровень строится как программный интерфейс, связывающий клиентские компоненты с прикладной логикой базы данных.
  • В простейшей конфигурации физически сервер приложений может быть совмещен с сервером базы данных на одном компьютере, к которому по сети подключается один или несколько терминалов.

    В "правильной" (с точки зрения безопасности, надежности, масштабирования) конфигурации сервер базы данных находится на выделенном компьютере (или кластере), к которому по сети подключены один или несколько серверов приложений, к которым, в свою очередь, по сети подключаются терминалы.

    Плюсами данной архитектуры являются [12, 14, 16, 17]:

  • клиентское ПО не нуждается в администрировании;
  • масштабируемость;
  • конфигурируемость – изолированность уровней друг от друга позволяет быстро и простыми средствами переконфигурировать систему при возникновении сбоев или при плановом обслуживании на одном из уровней;
  • высокая безопасность;
  • высокая надежность;
  • низкие требования к скорости канала (сети) между терминалами и сервером приложений;
  • низкие требования к производительности и техническим характеристикам терминалов, как следствие снижение их стоимости.
  • Минусы [12, 14, 16, 17]:

  • растет сложность серверной части и, как следствие, затраты на администрирование и обслуживание;
  • более высокая сложность создания приложений;
  • сложнее в разворачивании и администрировании;
  • высокие требования к производительности серверов приложений и сервера базы данных, а, значит, и высокая стоимость серверного оборудования;
  • высокие требования к скорости канала (сети) между сервером базы данных и серверами приложений.
  • Некоторые авторы (например, Мартин Фаулер [18]) представляют многозвенную архитектуру (трехзвенную) в виде пяти уровней (рис. 5.5):

  • Представление;
  • Уровень представления;
  • Уровень логики;
  • Уровень данных;
  • Данные.
  • (рис 5.5) Пять уровней многозвенной архитектуры "клиент-сервер"

    К представлению относится вся информация, непосредственно отображаемая пользователю: сгенерированные html-страницы, таблицы стилей, изображения.

    Уровень представления охватывает все, что имеет отношение к общению пользователя с системой. К главным функциям слоя представления относятся отображение информации и интерпретация вводимых пользователем команд с преобразованием их в соответствующие операции в контексте логики и данных.

    Уровень логики содержит основные функции системы, предназначенные для достижения поставленной перед ним цели. К таким функциям относятся вычисления на основе вводимых и хранимых данных, проверка всех элементов данных и обработка команд, поступающих от слоя представления, а также передача информации уровню данных.

    Уровень доступа к данным – это подмножество функций, обеспечивающих взаимодействие со сторонними системами, которые выполняют задания в интересах приложения.

    Данные системы обычно хранятся в базе данных.

    5.1.6. Архитектура распределенных систем

    Такой тип систем является более сложным с точки зрения организации системы. Суть распределенной системы заключается в том, чтобы хранить локальные копии важных данных [19].

    Схематически такую архитектуру можно представить, как показано на рис. 5.6.

    (рис 5.6) Архитектура распределенных систем

    Более 95 % данных, используемых в управлении предприятием, могут быть размещены на одном персональном компьютере, обеспечив возможность его независимой работы [16]. Поток исправлений и дополнений, создаваемый на этом компьютере, ничтожен по сравнению с объемом данных, используемых при этом. Поэтому если хранить непрерывно используемые данные на самих компьютерах, и организовать обмен между ними исправлениями и дополнениями к хранящимся данным, то суммарный передаваемый трафик резко снизится. Это позволяет понизить требования к каналам связи между компьютерами и чаще использовать асинхронную связь, и благодаря этому создавать надежно функционирующие распределенные информационные системы, использующие для связи отдельных элементов неустойчивую связь типа Интернета, мобильную связь, коммерческие спутниковые каналы. А минимизация трафика между элементами сделает вполне доступной стоимость эксплуатации такой связи. Конечно, реализация такой системы не элементарна, и требует решения ряда проблем, одна из которых своевременная синхронизация данных.

    Каждый АРМ независим, содержит только ту информацию, с которой должен работать, а актуальность данных во всей системе обеспечивается благодаря непрерывному обмену сообщениями с другими АРМами. Обмен сообщениями между АРМами может быть реализован различными способами, от отправки данных по электронной почте до передачи данных по сетям.

    Еще одним из преимуществ такой схемы эксплуатации и архитектуры системы, является обеспечение возможности персональной ответственности за сохранность данных. Так как данные, доступные на конкретном рабочем месте, находятся только на этом компьютере, при использовании средств шифрования и личных аппаратных ключей исключается доступ к данным посторонних, в том числе и IT администраторов.

    Такая архитектура системы также позволяет организовать распределенные вычисления между клиентскими машинами. Например, расчет какой-либо задачи, требующей больших вычислений, можно распределить между соседними АРМами благодаря тому, что они, как правило, обладают одной информацией в своих БД и, таким образом, добиться максимальной производительности системы.

    Распределенные системы с репликацией

    Данными между различными рабочими станциями и централизованным хранилищем данных, передаются репликацией [19] (рис. 5.7). При вводе информации на рабочих станциях – данные также записываются в локальную базу данных, а лишь затем синхронизируются.

    (рис 5.7) Архитектура распределенных систем с репликацией

    Распределенные системы с элементами удаленного исполнения

    Существуют определенные особенности, которые невозможно качественно реализовать на обычной распределенной системе репликативного типа. К этим особенностям можно отнести [19]:

  • использование данных из сущностей, которые хранятся на удаленном сервере (узле);
  • использование данных из сущностей, хранящихся на разных серверах (узлах) частично;
  • использование обособленного функционала, на выделенном сервере (узле).
  • У каждого из описанных типов используется общий принцип: программа клиент или обращается к выделенному (удаленному) серверу непосредственно или обращается к локальной базе, которая инкапсулирует в себе обращение к удаленному серверу (рис. 5.8).

    (рис 5.8) Архитектура распределенных систем с удаленным исполнением

    5.1.7. Архитектура Веб-приложений

    Обычно Веб-приложения создаются как приложения в архитектуре "клиент-сервер", но серверная часть имеет различные архитектурные решения [20].

    Изначально World Wide Web (WWW) представлялась ее создателям как "пространство для обмена информацией, в котором люди и компьютеры могут общаться между собой". Поэтому первые Веб-приложения представляли собой примитивные файловые серверы, которые возвращали статические HTML-страницы запросившим их клиентам. Таким образом, Веб начиналась как документо-ориентированная.

    Следующим этапом развития Веб стало появление понятия приложений, которые базировались на таких интерфейсах, как CGI (или FastCGI), а в дальнейшем – на ISAPI. Common Gateway Interface (CGI) – это стандартный интерфейс работы с серверами, позволяющий выполнять серверные приложения, вызываемые через URL. Входной информацией для таких приложений служило содержимое HTTP-заголовка (и тело запроса при использовании протокола POST). CGI-приложения генерировали HTML-код, который возвращался браузеру. Основной проблемой CGI-приложений было то, что при каждом клиентском запросе сервер выполнял CGI-программу в реальном времени, загружая ее в отдельное адресное пространство.

    Появление Internet Server API (ISAPI) позволило не только решить проблемы производительности, которые возникали с CGI-приложениями, но и предоставить в распоряжение разработчиков более богатый программный интерфейс. ISAPI DLL можно было ассоциировать с расширениями имен файлов через специальную мета-базу. Эти два механизма (CGI и ISAPI) послужили основой создания первого типа Веб-приложений, в которых, в зависимости от каких-либо клиентских действий, выполнялся серверный код. Таким образом, стала возможной динамическая генерация содержимого Веб-страниц и наполнение Веб перестало быть чисто статическим.

    Интерфейс ISAPI – это особенность Microsoft Internet Information Server. ISAPI-приложения представляют собой динамические загружаемые библиотеки (DLL), которые выполняются в адресном пространстве Веб-сервера. У других Веб-серверов через некоторое время также появилась возможность выполнять приложения, реализованные в виде библиотек. В случае Веб-серверов Netscape этот программный интерфейс назывался NSAPI (Netscape Server API). У довольно популярного Веб-сервера Apache также имеется возможность выполнять Веб-приложения, реализованные в виде библиотек; такие библиотеки называются Apache DSO (Dynamic Shared Objects).

    Естественно, что при использовании как CGI-, так и ISAPI-приложений разработчики в основном решали одни и те же задачи, поэтому естественным шагом стало появление нового, высокоуровневого интерфейса, который упростил задачи генерации HTML-кода, позволил обращаться к компонентам и использовать базы данных. Таким интерфейсом стала объектная модель Active Server Pages (ASP), построенная на основе ISAPI-фильтра.

    Основной идеей ASP с точки зрения создания интерфейса приложения является то, что на Веб-странице присутствуют фрагменты кода, который интерпретируется Веб-сервером и вместо которого пользователь получает результат выполнения этих фрагментов кода.

    Вскоре после появления ASP были созданы и другие технологии, реализующие идею размещения внутри Веб-страницы кода, выполняемого Веб-сервером. Наиболее известная из них на сегодняшний день – технология JSP (Java Server Pages), основной идеей которой является однократная компиляция Java-кода (сервлета) при первом обращении к нему, выполнение методов этого сервлета и помещение результатов выполнения этих методов в набор данных, отправляемых в браузер.

    Новейшая версия технологии Active Server Pages – ASP .NET, являющаяся ключевой в архитектуре Microsoft .NET Framework. С помощью ASP .NET можно создавать Веб-приложения и Веб-сервисы, которые не только позволяют реализовать динамическую генерацию HTML-страниц, но и интегрируются с серверными компонентами и могут использоваться для решения широкого круга бизнес-задач, возникающих перед разработчиками современных Веб-приложений.

    В общем случае клиентом Веб-сервера может быть не только персональный компьютер, оснащенный обычным Веб-браузером. Одновременно с широким распространением мобильных устройств появилась и проблема предоставления Веб-серверами данных, которые могут быть интерпретированы этими устройствами. Поскольку мобильные устройства обладают характеристиками, отличными от характеристик персональных компьютеров (ограниченным размером экрана, малым объемом памяти, а нередко и невозможностью отобразить что-либо, кроме нескольких строк черно-белого текста), для них существуют и другие протоколы передачи данных (WAP – Wireless Access Protocol) и соответствующие языки разметки (WML – Wireless Markup Language, СHTML – Compact HTML и т.п.). При этом возникает задача передачи данных на мобильное устройство в соответствующем формате (и для этой цели существуют специальные сайты), либо, что представляется более удобным, происходит опознание типа устройства в момент его обращения к серверу и преобразование исходного документа (например, в формате XML) в формат, требующийся данному мобильному устройству (например, с помощью XSLT-преобразования).

    Другим способом поддержки различных типов клиентов является создание "разумных" серверных компонентов, которые способны генерировать различный код в зависимости от типа клиента. Такой подход, в частности, реализован в Microsoft ASP .NET.

    Другим направлением развития клиентских частей Веб-приложений стало размещение некоторой части логики приложения (такой как проверка корректности вводимых данных) в самом Веб-браузере. В частности, современные Веб-браузеры способны интерпретировать скриптовые языки (VBScript, JavaScript), код на которых, как и ASP-код, внедряется в Веб-страницу, но интерпретируется не Веб-сервером, а браузером и соответственно выполняется на клиентском устройстве. Кроме того, современные браузеры способны отображать и выполнять Java-аплеты – специальные Java-приложения, которые пользователь получает в составе Веб-страницы, а некоторые из браузеров могут также служить контейнерами для элементов управления ActiveX – выполняющихся в адресном пространстве браузера специальных COM-серверов, также получаемых в составе Веб-страницы. И в Java-аплетах, и в элементах управления ActiveX можно реализовать практически любую функциональность.

    Отметим, что с ростом объема используемых данных и числа посетителей Веб-сайтов возрастают и требования к надежности, производительности и масштабируемости Веб-приложений. Следующим этапом эволюции подобных приложений стало отделение бизнес-логики, реализованной в Веб-приложении, а нередко и сервисов обработки данных и реализации транзакций от его интерфейса. В этом случае в самом Веб-приложении обычно остается так называемая презентационная часть, а бизнес-логика, обработка данных и реализация транзакций переносятся в сервер приложений в виде бизнес-объектов. В зависимости от типа сервера приложений подобные бизнес-объекты могут быть выполняющимися самостоятельно COM-серверами, CORBA-серверами, а также объектами COM+, выполняющимися с помощью служб компонентов Windows 2000, или объектами EJB (Enterprise Java Beans), исполняемыми сервером приложений, поддерживающим спецификаци ю J2EE (Java 2 Enterprise Edition). В качестве механизма доступа к данным подобные объекты могут использовать OLE DB, ODBC, JDBC (это зависит от того, как реализован бизнес-объект).

    Нередко подобные бизнес-объекты предоставляют доступ к данным корпоративных информационных систем либо реализуют какую-либо часть их функциональности. Нередко они позволяют, например, интегрировать Веб-сайт с CRM-системами (Customer Relationship Management) или с ERP-системами (Enterprise Resource Planning), сохраняя в корпоративных системах сведения о посетителях сайта и предоставляя потенциальным клиентам сведения об имеющейся продукции для осуществления заказов.

    Поскольку современный Интернет – это не столько средство демонстрации присутствия компании на рынке или инструмент маркетинга, сколько инструмент ведения бизнеса, достаточно важными становятся задачи реализации организации через Интернет таких взаимоотношений с клиентами, как продажа товаров и услуг. И здесь довольно важными становятся решения для электронной коммерции типа "предприятие-клиент" (B2C – business-to-consumer). Не менее важными становятся и задачи интеграции Веб-приложений c данными и приложениями партнеров с целью реализации схемы "предприятие-предприятие" (B2B – business-to-business), позволяющей заключать торговые сделки между предприятиями, обмениваться каталогами товаров, проводить аукционы, создавать электронные торговые площадки.

    Отметим, что, будучи составной частью подобного решения, Веб-сервер должен уметь не только выполнять приложения и взаимодействовать с сервером приложений, но и использовать сервисы интеграции, сервисы управления приложениями и данными, а также сервисы для разработчиков.

    Следующим шагом эволюции Веб-приложений, помимо доступа к корпоративным данным и данным партнеров, стало получение доступа к корпоративным приложениям. Для решения этой задачи интеграции Веб-приложений с внутренними информационными системами предприятий и с приложениями, обеспечивающими взаимодействие с клиентами и партнерами, используются специальные решения, называемые корпоративными порталами.

    Нередко частью портального решения являются средства управления информационным наполнением Веб-сайта – ведь объем данных, доступных пользователям с помощью сайтов крупных компаний и порталов, сейчас таков, что управление этими данными "вручную" не представляется возможным.

    Обобщая вышесказанное можно выделить основные особенности веб-архитектуры [19, 20]:

  • отсутствие необходимости использовать дополнительное ПО на стороне клиента – это позволяет автоматически реализовать клиентскую часть на всех платформах;
  • возможность подключения практически неограниченного количества клиентов;
  • благодаря единственному месту хранения данных и наличия системы управления базами данных обеспечиваются минимальные требования для поддержания целостности данных;
  • доступность при работоспособности сервера и каналов связи;
  • недоступность при отсутствии работоспособности сервера или каналов связи;
  • достаточно низкая скорость Веб сервера и каналов передачи данных;
  • относительно объема данных – архитектура Веб систем не имеет существенных ограничений.
  • Схематически такую архитектуру (в трехзвенном варианте) можно представить, как показано на рис. 5.9.

    (рис 5.9) Архитектура Веб-приложений

    5.1.8. Сервис-ориентированная архитектура

    Решение многих описанных выше задач, возникающих при создании современных Веб-приложений, теперь начинает возлагаться на Веб-сервисы – не зависящие от платформы, объектной модели и клиента программные компоненты, которые можно вызывать из клиентских Веб-приложений (а также из самих Веб-сервисов) через основанный на протоколе HTTP и языке XML протокол SOAP [20]. Для описания Веб-сервисов используется XML-подобный язык WSDL, а для организации реестров Веб-сервисов, в которых разработчики и компании могут искать необходимые им сервисы, а также публиковать данные о своих сервисах – интерфейс UDDI.

    Поддержка Веб-сервисов стала одним из главных стратегических направлений для многих компаний, специализирующихся на выпуске серверов приложений, систем управления базами данных и средств разработки приложений.

    Сервис-ориентированная архитектура (SOA, service-oriented architecture) – модульный подход к разработке программного обеспечения, основанный на использовании сервисов (служб) со стандартизированными интерфейсами [21].

    OASIS (Организация по распространению открытых стандартов структурированной информации) определяет SOA следующим образом (OASIS Reference Model for Service Oriented Architecture V 1.0): Сервисно-ориентированная архитектура – это парадигма организации и использования распределенных информационных ресурсов таких как: приложения и данные, находящихся в сфере ответственности разных владельцев, для достижения желаемых результатов потребителем, которым может быть: конечный пользователь или другое приложение.

    В основе SOA лежат принципы многократного использования функциональных элементов ИТ, ликвидации дублирования функциональности в ПО, унификации типовых операционных процессов, обеспечения перевода операционной модели компании на централизованные процессы и функциональную организацию на основе промышленной платформы интеграции.

    Компоненты программы могут быть распределены по разным узлам сети, и предлагаются как независимые, слабо связанные, заменяемые сервисы-приложения. Программные комплексы, разработанные в соответствии с SOA, часто реализуются как набор веб-сервисов, интегрированных при помощи известных стандартных протоколов (SOAP, WSDL, и т. п.)

    Интерфейс компонентов SОА-программы предоставляет инкапсуляцию деталей реализации конкретного компонента (ОС, платформы, языка программирования, вендора, и т. п.) от остальных компонентов. Таким образом, SOA предоставляет гибкий и элегантный способ комбинирования и многократного использования компонентов для построения сложных распределенных программных комплексов.

    SOA хорошо зарекомендовала себя для построения крупных корпоративных программных приложений. Целый ряд разработчиков и интеграторов предлагают инструменты и решения на основе SOA (например, платформы IBM WebSphere, Oracle/BEA Aqualogic, Microsoft Windows Communication Foundation, SAP NetWeaver, ИВК Юпитер, TIBCO, Diasoft).

    Основными целями применения SOA для крупных информационных систем, уровня предприятия, и выше являются [21]:

  • сокращение издержек при разработке приложений, за счет упорядочивания процесса разработки;
  • расширение повторного использования кода;
  • независимость от используемых платформ, инструментов, языков разработки;
  • повышение масштабируемости создаваемых систем;
  • улучшение управляемости создаваемых систем.
  • Принципы SOA:

  • архитектура, как таковая, не привязана к какой-то определенной технологии;
  • независимость организации системы от используемой вычислительной платформы (платформ);
  • независимость организации системы от применяемых языков программирования;
  • использование сервисов, независимых от конкретных приложений, с единообразными интерфейсами доступа к ним;
  • организация сервисов как слабосвязанных компонентов для построения систем.
  • Архитектура не привязана к какой-то определенной технологии. Она может быть реализована с использованием широкого спектра технологий, включая такие технологии как REST, RPC, DCOM, CORBA или веб-сервисы. SOA может быть реализована, используя один из этих протоколов и, например, может использовать, дополнительно, механизм файловой системы, для обмена данными.

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

    SOA также может рассматриваться как стиль архитектуры информационных систем, который позволяет создавать приложения, построенные путем комбинации слабосвязанных и взаимодействующих сервисов. Эти сервисы взаимодействуют на основе какого-либо строго определенного платформо-независимого и языково-независимого интерфейса (например, WSDL). Определение интерфейса скрывает языково-зависимую реализацию сервиса.

    Таким образом, системы, основанные на SOA, могут быть независимы от технологий разработки и платформ (таких как Java, .NET и т. д.). К примеру, сервисы, написанные на C#, работающие на платформах .Net и сервисы на Java, работающие на платформах Java EE, могут быть с одинаковым успехом вызваны общим составным приложением. Приложения, работающие на одних платформах, могут вызывать сервисы, работающие на других платформах, что облегчает повторное использование компонентов.

    SOA может поддерживать интеграцию и консолидацию операций в составе сложных систем, однако SOA не определяет и не предоставляет методологий или фреймворков для документирования сервисов.

    Языки высокого уровня, такие как BPEL, или спецификации, такие как WS-CDL и WS-Coordination, расширяют концепцию сервиса, предоставляя метод оркестрации, для объединения мелких сервисов в более обширные бизнес-сервисы, которые, в свою очередь, могут быть включены в состав технологических процессов и бизнес-процессов, реализованных в виде составных приложений или порталов.

    5.1.9. Ключевые термины

    Архитектура, Централизованная архитектура, Архитектура "файл-сервер", Двухзвенная архитектура "клиент-сервер", , Терминал, Сервер приложений, Сервер базы данных, Архитектура распределенных систем, Архитектура Веб-приложений, Сервис-ориентированная архитектура.

    5.2. Шаблоны проектирования

    5.2.1. Общие сведения

    В качестве основы проектирования информационных систем применяются "типовые решения" или "шаблоны проектирования" (Patterns).

    Шаблоны проектирования (паттерн, design pattern) – это многократно применяемая архитектурная конструкция, предоставляющая решение общей проблемы проектирования в рамках конкретного контекста и описывающая значимость этого решения [22].

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

    В 1970-е годы архитектор Кристофер Александр составил набор шаблонов проектирования [23]. В области архитектуры эта идея не получила такого развития, как позже в области программной разработки. Согласно определению Кристофера Александера: "Каждое типовое решение описывает некую повторяющуюся проблему и ключ к ее разгадке, причем таким образом, что вы можете пользоваться этим ключом многократно, ни разу не придя к одному и тому же результату" [18].

    В 1987 году Кент Бэк и Вард Каннигем взяли идеи Александра и разработали шаблоны применительно к разработке программного обеспечения для разработки графических оболочек на языке Smalltalk.

    В 1988 году Эрих Гамма начал писать докторскую диссертацию при Цюрихском университете об общей переносимости этой методики на разработку программ.

    В 1989-1991 годах Джеймс Коплин трудился над разработкой идиом для программирования на C++ и опубликовал в 1991 году книгу Advanced C++ Idioms. В этом же году Эрих Гамма заканчивает свою докторскую диссертацию и переезжает в США, где в сотрудничестве с Ричардом Хелмом, Ральфом Джонсоном и Джоном Влиссидсом публикует книгу Design Patterns – Elements of Reusable Object-Oriented Software [24]. В этой книге описаны 23 шаблона проектирования. Также команда авторов этой книги известна общественности под названием Банда четырех (Gang of Four, часто сокращается до GoF). Именно эта книга стала причиной роста популярности шаблонов проектирования.

    Другим видным деятелем в области проектирования программных систем, который поддержал использование паттернов, является Мартин Фаулер, написавший книгу "Архитектура корпоративных программных приложений" (Patterns of Enterprise Application Architecture). Как отметил Мартин Фаулер в своей книге "собираясь воспользоваться типовыми решениями, не забывайте, что они только отправная точка, а не пункт назначения" [18].

    В книге Крейга Лармана "Применение UML и шаблонов проектирования" описано 9 шаблонов GRASP (General Responsibility Assignment Software Patterns, общие образцы распределения обязанностей) – паттернов, используемых в объектно-ориентированном проектировании для решения общих задач по назначению обязанностей классам и объектам. Каждый из них помогает решить некоторую проблему, возникающую при объектно-ориентированном анализе, и которая возникает практически в любом проекте по разработке программного обеспечения.

    Главная польза каждого отдельного шаблона состоит в том, что он описывает решение целого класса абстрактных проблем. Также тот факт, что каждый шаблон имеет свое имя, облегчает дискуссию об абстрактных структурах данных (ADT) между разработчиками, так как они могут ссылаться на известные шаблоны. Таким образом, за счет шаблонов производится унификация терминологии, названий модулей и элементов проекта.

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

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

    Есть мнение, что слепое применение шаблонов из справочника, без осмысления причин и предпосылок выделения каждого отдельного шаблона, замедляет профессиональный рост программиста, так как подменяет творческую работу механическим подставлением шаблонов. Люди, придерживающиеся данного мнения, считают, что знакомиться со списками шаблонов надо тогда, когда "дорос" до них в профессиональном плане – и не раньше. Хороший критерий нужной степени профессионализма – выделение шаблонов самостоятельно, на основании собственного опыта. При этом, разумеется, знакомство с теорией, связанной с шаблонами, полезно на любом уровне профессионализма и направляет развитие программиста в правильную сторону. Сомнению подвергается только использование шаблонов "по справочнику".

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

    Шаблоны проектирования классифицируют следующим образом [18, 25]:

  • Паттерны проектирования классов/объектов
  • Структурные паттерны проектирования классов/объектов
  • Адаптер (Adapter) – GoF
  • Декоратор (Decorator) или Оболочка (Wrapper) – GoF
  • Заместитель (Proxy) или Суррогат (Surrogate) – GoF
  • Информационный эксперт (Information Expert)- GRASP
  • Компоновщик (Composite) – GoF
  • Мост (Bridge), Handle (описатель) или Тело (Body) – GoF
  • Низкая связанность (Low Coupling) – GRASP
  • Приспособленец (Flyweight) – GoF
  • Устойчивый к изменениям (Protected Variations) – GRASP
  • Фасад (Facade) – GoF
  • Паттерны проектирования поведения классов/объектов
  • Интерпретатор (Interpreter ) – GoF
  • Итератор (Iterator) или Курсор (Cursor) – GoF
  • Команда (Command), Действие (Action) или Транзакция (Транзакция) – GoF
  • Наблюдатель (Observer), Опубликовать – подписаться (Publish – Subscribe) или Delegation Event Model – GoF
  • Не разговаривайте с неизвестными (Don't talk to strangers) – GRASP
  • Посетитель (Visitor) – GoF
  • Посредник (Mediator) – GoF
  • Состояние (State) – GoF
  • Стратегия (Strategy) – GoF
  • Хранитель (Memento) – GoF
  • Цепочка обязанностей (Chain of Responsibility) – GoF
  • Шаблонный метод (Template Method) – GoF
  • Высокое зацепление (High Cohesion) – GRASP
  • Контроллер (Controller) – GRASP
  • Полиморфизм (Polymorphism) – GRASP
  • Искусственный (Pure Fabrication) – GRASP
  • Перенаправление (Indirection) – GRASP
  • Порождающие паттерны проектирования
  • Абстрактная фабрика (Abstract Factory, Factory), др. название Инструментарий (Kit) – GoF
  • Одиночка (Singleton) – GoF
  • Прототип (Prototype) – GoF
  • Создатель экземпляров класса (Creator) – GRASP
  • Строитель (Builder) – GoF
  • Фабричный метод (Factory Method) или Виртуальный конструктор (Virtual Constructor) – GoF
  • Архитектурные системные паттерны
  • Структурные паттерны
  • Репозиторий
  • Клиент/сервер
  • Обьектно – ориентированный, Модель предметной области (Domain Model), модуль таблицы (Data Mapper)
  • Многоуровневая система (Layers) или абстрактная машина
  • Потоки данных (конвейер или фильтр)
  • Паттерны управления
  • Паттерны централизованного управления
  • Вызов – возврат (сценарий транзакции – частный случай)
  • Диспетчер
  • Паттерны управления, основанные на событиях
  • Передача сообщений
  • Управляемый прерываниями
  • Паттерны, обеспечивающие взаимодействие с базой данных
  • Активная запись (Active Record)
  • Единица работы (Unit Of Work)
  • Загрузка по требованию (Lazy Load)
  • Коллекция объектов (Identity Map)
  • Множество записей (Record Set)
  • Наследование с одной таблицей (Single Table Inheritance)
  • Наследование с таблицами для каждого класса (Class Table Inheritance)
  • Оптимистическая автономная блокировка (Optimistic Offline Lock)
  • Отображение с помощью внешних ключей
  • Отображение с помощью таблицы ассоциаций (Association Table Mapping)
  • Пессимистическая автономная блокировка (Pessimistic Offline Lock)
  • Поле идентификации (Identity Field)
  • Преобразователь данных (Data Mapper)
  • Cохранение сеанса на стороне клиента (Client Session State)
  • Cохранение сеанса на стороне сервера (Server Session State)
  • Шлюз записи данных (Row Data Gateway)
  • Шлюз таблицы данных (Table Data Gateway)
  • Паттерны, предназначенные для представления данных в Web
  • Модель-представление-контроллер (Model View Controller)
  • Контроллер страниц (Page Controller)
  • Контроллер запросов (Front Controller)
  • Представление по шаблону (Template View)
  • Представление с преобразованием (Transform View)
  • Двухэтапное представление (Two Step View)
  • Контроллер приложения (Application Controller)
  • Паттерны интеграции корпоративных информационных систем
  • Структурные паттерны интеграции
  • Взаимодействие "точка – точка"
  • Взаимодействие "звезда" (интегрирующая среда)
  • Смешанный способ взаимодействия
  • Паттерны по методу интеграции
  • Интеграция систем по данным (data-centric)
  • Функционально-центрический (function-centric) подход
  • Объектно-центрический (object-centric)
  • Интеграция на основе единой понятийной модели предметной области (concept-centric)
  • Паттерны интеграции по типу обмена данными
  • Файловый обмен
  • Общая база данных
  • Удаленный вызов процедур
  • Обмен сообщениями
  • Также на сегодняшний день существует ряд других шаблонов [22]:

  • Carrier Rider Mapper, предоставление доступа к хранимой информации;
  • аналитические шаблоны, описывают основной подход для составления требований для программного обеспечения (requirement analysis) до начала самого процесса программной разработки;
  • коммуникационные шаблоны, описывают процесс общения между отдельными участниками/сотрудниками организации;
  • организационные шаблоны, описывают организационную иерархию предприятия/фирмы;
  • Анти-паттерны (Anti-Design-Patterns) описывают как не следует поступать при разработке программ, показывая характерные ошибки в дизайне и в реализации;
  • и др.
  • Рассмотрим подробнее некоторые из паттернов проектирования.

    5.2.2. Обзор паттернов

    5.2.2.1. Паттерны проектирования классов/объектов

    5.2.2.1.1. Структурные паттерны (Structural)

    К структурным паттернам относятся [25]:

  • Адаптер (Adapter) – GoF;
  • Декоратор (Decorator) или Оболочка (Wrapper) – GoF;
  • Заместитель (Proxy) или Суррогат (Surrogate) – GoF;
  • Информационный эксперт (Information Expert)- GRASP;
  • Компоновщик (Composite) – GoF;
  • Мост (Bridge), Handle (описатель) или Тело (Body) – GoF;
  • Низкая связанность (Low Coupling) – GRASP;
  • Приспособленец (Flyweight) – GoF;
  • Устойчивый к изменениям (Protected Variations) – GRASP;
  • Фасад (Facade) – GoF.
  • Приведем примеры 2-х их данных паттернов (табл. 5.1) [25].

    Примеры структурных паттернов классов/объектов
    Компоновщик (Composite) – GoF
    Проблема Как обрабатывать группу или композицию структур объектов одновременно?
    Решение

    Определить классы для композитных и атомарных объектов таким образом, чтобы они реализовывали один и тот же интерфейс.

    (рис 5.10) 04_10
    Фасад (Facade) – GoF
    Проблема Как обеспечить унифицированный интерфейс с набором разрозненных реализаций или интерфейсов, например, с подсистемой, если нежелательно высокое связывание с этой подсистемой или реализация подсистемы может измениться?
    Решение

    Определить одну точку взаимодействия с подсистемой – фасадный объект, обеспечивающий общий интерфейс с подсистемой и возложить на него обязанность по взаимодействию с ее компонентами. Фасад – это внешний объект, обеспечивающий единственную точку входа для служб подсистемы. Реализация других компонентов подсистемы закрыта и не видна внешним компонентам. Фасадный объект обеспечивает реализацию паттерна "Устойчивый к изменениям" с точки зрения защиты от изменений в реализации подсистемы.

    (рис 5.11) 04_11

    5.2.2.1.2. Паттерны проектирования поведения (Behavioral)

    К поведенческим паттернам относятся [25]:

  • Интерпретатор (Interpreter ) – GoF;
  • Итератор (Iterator) или Курсор (Cursor) – GoF;
  • Команда (Command), Действие (Action) или Транзакция (Транзакция) – GoF;
  • Наблюдатель (Observer), Опубликовать – подписаться (Publish – Subscribe) или Delegation Event Model – GoF;
  • Не разговаривайте с неизвестными (Don't talk to strangers) – GRASP;
  • Посетитель (Visitor) – GoF;
  • Посредник (Mediator) – GoF;
  • Состояние (State) – GoF;
  • Стратегия (Strategy) – GoF;
  • Хранитель (Memento) – GoF;
  • Цепочка обязанностей (Chain of Responsibility) – GoF;
  • Шаблонный метод (Template Method) – GoF;
  • Высокое зацепление (High Cohesion) – GRASP;
  • Контроллер (Controller) – GRASP;
  • Полиморфизм (Polymorphism) – GRASP;
  • Искусственный (Pure Fabrication) – GRASP;
  • Перенаправление (Indirection) – GRASP.
  • Приведем примеры 3-х их данных паттернов (табл. 5.2) [25].

    Примеры поведенческих паттернов классов/объектов
    Итератор (Iterator) или Курсор (Cursor) – GoF
    Проблема Составной объект, например, список, должен предоставлять доступ к своим элементам (объектам), не раскрывая их внутреннюю структуру, причем перебирать список требуется по-разному в зависимости от задачи.
    Решение

    Создается класс "Итератор", который определяет интерфейс для доступа и перебора элементов, "КонкретныйИтератор" реализует интерфейс класса "Итератор" и следит за текущей позицией при обходе "Агрегата". "Агрегат" определяет интерфейс для создания объекта – итератора. "КонкретныйАгрегат" реализует интерфейс создания итератора и возвращает экземпляр класса "КонкретныйИтератор", "КонкретныйИтератор" отслеживает текущий объект в агрегате и может вычислить следующий объект при переборе.

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

    (рис 5.12) 04_12
    Посетитель (Visitor) – GoF
    Проблема Над каждым объектом некоторой структуры выполняется операция. Определить новую операцию, не изменяя классы объектов.
    Решение

    Клиент, использующий данный паттерн, должен создать объект класса "КонкретныйПосетитель", а затем посетить каждый элемент структуры. "Посетитель" объявляет операцию "Посетить" для каждого класса "КонкретныйЭлемент" (имя и сигнатура данной операции идентифицируют класс, элемент которого посещает "Посетитель" – то есть, посетитель может обращаться к элементу напрямую). "КонкретныйПосетитель" реализует все операции, объявленные в классе "Посетитель". Каждая операция реализует фрагмент алгоритма, определенного для класса соответствующего объекта в структуре.

    Класс "КонкретныйПосетитель" предоставляет контекст для этого алгоритма и сохраняет его локальное состояние. "Элемент" определяет операцию "Принять", которая принимает "Посетителя" в качестве аргумента, "КонкретныйЭлемент" реализует операцию "Принять", которая принимает "Посетителя" в качестве аргумента. "СтруктураОбьекта" может перечислить свои аргументы и предоставить посетителю высокоуровневый интерфейс для посещения своих элементов.

    Данный паттерн логично использовать, если в структуре присутствуют объекты многих классов с различными интерфейсами, и необходимо выполнить над ними операции, зависящие от конкретных классов, или если классы, устанавливающие структуру объектов, изменяются редко, но новые операции над этой структурой добавляются часто.

    Данный паттерн упрощается добавление новых операций, объединяет родственные операции в классе "Посетитель".

    В данном паттерне затруднено добавление новых классов "КонкретныйЭлемент", поскольку требуется объявление новой абстрактной операции в классе "Посетитель".

    (рис 5.13) 04_13
    Состояние (State) – GoF
    Проблема Варьировать поведение объекта в зависимости от его внутреннего состояния
    Решение

    Класс "Контекст" делегирует зависящие от состояния запросы текущему объекту "КонкретноеСостояние" (хранит экземпляр подкласса "КонкретноеСостояние", которым определяется текущее состояние), и определяет интерфейс, представляющий интерес для клиентов. "КонкретноеСостояние" реализует поведение, ассоциированное с неким состоянием объекта "Контекст". "Состояние" определяет интерфейс для инкапсуляции поведения, ассоциированного с конкретным экземпляром "Контекста".

    Данный паттерн локализует зависящее от состояния поведение и делит его на части, соответствующие состояниям, переходы между состояниями становятся явными.

    (рис 5.14) 04_14

    5.2.2.1.3. Порождающие паттерны проектирования

    К порождающим паттернам относятся [25]:

  • Абстрактная фабрика (Abstract Factory, Factory) – GoF;
  • Одиночка (Singleton) – GoF;
  • Прототип (Prototype) – GoF;
  • Создатель экземпляров класса (Creator) – GRASP;
  • Строитель (Builder) – GoF;
  • Фабричный метод (Factory Method) или Виртуальный конструктор (Virtual Constructor) – GoF.
  • Приведем примеры 2-х их данных паттернов (табл. 5.3) [25].

    Примеры порождающих паттернов классов/объектов
    Одиночка (Singleton) – GoF
    Проблема Какой специальный класс должен создавать "Абстрактную фабрику" и как получить к ней доступ? Необходим лишь один экземпляр специального класса, различные объекты должны обращаться к этому экземпляру через единственную точку доступа.
    Решение

    Создать класс и определить статический метод класса, возвращающий этот единственный объект. Разумнее создавать именно статический экземпляр специального класса, а не объявить требуемые методы статическими, поскольку при использовании методов экземпляра можно применить механизм наследования и создавать подклассы. Статические методы в языках программирования не полиморфны и не допускают перекрытия в производных классах. Решение на основе создания экземпляра является более гибким, поскольку впоследствии может потребоваться уже не единственный экземпляр объекта, а несколько.

    (рис 5.15) 04_15
    Фабричный метод (Factory Method) или Виртуальный конструктор (Virtual Constructor) – GoF
    Проблема Определить интерфейс для создания объекта, но оставить подклассам решение о том, какой класс инстанцировать, то есть, делегировать инстанцирование подклассам.
    Решение

    Абстрактный класс "Создатель" объявляет Фабричный Метод, возвращающий объект типа "Продукт" (абстрактный класс, определяющий интерфейс объектов, создаваемых фабричным методом). "Создатель" также может определить реализацию по умолчанию Фабричного Метода, который возвращает "КонкретныйПродукт". "КонкретныйСоздатель" замещает Фабричный Метод, возвращающий объект "КонкретныйПродукт". "Создатель" "полагается" на свои подклассы в определении Фабричного Метода, возвращающего объект "КонкретныйПродукт". Данный паттерн избавляет проектировщика от необходимости встраивать в код зависящие от приложения классы. Однако при применении данного паттерна возникает дополнительный уровень подклассов.

    (рис 5.16) 04_16

    5.2.2.2. Архитектурные системные паттерны

    5.2.2.2.1. Структурные паттерны

    К структурным паттернам относятся [25]:

  • Репозиторий;
  • Клиент/сервер;
  • Обьектно – ориентированный, Модель предметной области (Domain Model), модуль таблицы (Data Mapper);
  • Многоуровневая система (Layers) или абстрактная машина;
  • Потоки данных (конвейер или фильтр).
  • Приведем пример одного их данных паттернов (табл. 5.4) [25].

    Примеры стуктурных паттернов архитектуры
    Многоуровневая система (Layers) или абстрактная машина
    Описание

    В соответствии с паттерном "Многоуровневая система" структурные элементы системы организуются в отдельные уровни с взаимосвязанными обязанностями таким образом, чтобы на нижнем уровне располагались низкоуровневые службы и службы общего назначения, а на более высоких – объекты уровня логики приложения. При этом взаимодействие и связывание уровней происходит сверху вниз. Связывания объектов снизу вверх следует избегать.

    На рисунке показаны типичные уровни логической архитектуры системы.

    (рис 5.17) 04_17

    Слой представления охватывает все, что имеет отношение к общению пользователя с системой. К главным функциям слоя представления относится отображение информации и интерпретация вводимых пользователем команд с преобразованием их в соответствующие операции в контексте домена (бизнес – логики) и источника данных.

    Источник данных – подмножество функций, обеспечивающих взаимодействие со сторонними системами, которые выполняют

    В отличие от архитектурного паттерна "Клиент – сервер", слои вовсе не обязательно должны располагаться на разных машинах.

    Многоуровневая система может быть разработана пошагово (итеративно).

    Недостатками данного паттерна являются:

  • Изменение исходного кода влечет за собой переделку всех элементов системы, поскольку все элементы системы тесно связаны друг с другом.
  • Логика приложения тесно связана с интерфейсом пользователя – затруднительно менять интерфейс или принципы реализации логики. Из-за высокой связанности, работу по реализации системы сложно разделить между разработчиками и, кроме того, сложно модифицировать функции приложения или переходить на новые технологии.
  • 5.2.2.2.2. Паттерны управления

    К паттернам управления относятся [25]:

  • Паттерны централизованного управления:
  • Вызов – возврат (сценарий транзакции – частный случай);
  • Диспетчер;
  • Паттерны управления, основанные на событиях:
  • Передача сообщений;
  • Управляемый прерываниями;
  • Паттерны, обеспечивающие взаимодействие с базой данных:
  • Активная запись (Active Record);
  • Единица работы (Unit Of Work);
  • Загрузка по требованию (Lazy Load);
  • Коллекция объектов (Identity Map);
  • Множество записей (Record Set);
  • Наследование с одной таблицей (Single Table Inheritance);
  • Наследование с таблицами для каждого класса (Class Table Inheritance);
  • Оптимистическая автономная блокировка (Optimistic Offline Lock);
  • Отображение с помощью внешних ключей;
  • Отображение с помощью таблицы ассоциаций (Association Table Mapping);
  • Пессимистическая автономная блокировка (Pessimistic Offline Lock);
  • Поле идентификации (Identity Field);
  • Преобразователь данных (Data Mapper);
  • Cохранение сеанса на стороне клиента (Client Session State);
  • Cохранение сеанса на стороне сервера (Server Session State);
  • Шлюз записи данных (Row Data Gateway);
  • Шлюз таблицы данных (Table Data Gateway).
  • В данной лекции примеры паттернов управления рассматриваться не будут.

    5.2.2.2.3. Паттерны, предназначенные для представления данных в Web

    К паттернам, предназначенным для представления данных в Web, относятся [18]:

  • Модель-представление-контроллер (Model View Controller);
  • Контроллер страниц (Page Controller);
  • Контроллер запросов (Front Controller);
  • Представление по шаблону (Template View);
  • Представление с преобразованием (Transform View);
  • Двухэтапное представление (Two Step View);
  • Контроллер приложения (Application Controller).
  • Приведем пример 4-х их данных паттернов (табл. 5.5) [18].

    Примеры паттернов, предназначенных для представления данных в Web
    Модель-представление-контроллер (Model View Controller)
    Описание (рис 5.18) 04_18

    Типовое решение модель-представление-контроллер подразумевает выделение трех отдельных ролей. Модель – это объект, предоставляющий некоторую информацию о домене. У модели нет визуального интерфейса, она содержит в себе все данные и поведение, не связанные с пользовательским интерфейсом. В объектно-ориентированном контексте наиболее "чистой" формой модели является объект модели предметной области. В качестве модели можно рассматривать и сценарий транзакции, если он не содержит в себе никакой логики, связанной с пользовательским интерфейсом. Подобное определение не очень расширяет понятие модели, однако полностью соответствует распределению ролей в рассматриваемом типовом решении.

    Представление отображает содержимое модели средствами графического интерфейса. Таким образом, если модель – это объект покупателя, соответствующее представление может быть фреймом с кучей элементов управления или HTML-страницей, заполненной информацией о покупателе. Функции представления заключаются только в отображении информации на экране. Все изменения информации обрабатываются третьим "участником" системы – контроллером. Контроллер получает входные данные от пользователя, выполняет операции над моделью и указывает представлению на необходимость соответствующего обновления. В этом плане графический интерфейс можно рассматривать как совокупность представления и контроллера.

    Говоря о типовом решении модель-представление-контроллер, нельзя не подчеркнуть два принципиальных типа разделения: отделение представления от модели и отделение контроллера от представления.

    Отделение представления от модели – это один из фундаментальных принципов проектирования программного обеспечения. Наличие подобного разделения весьма важно по ряду причин:

  • Представление и модель относятся к совершенно разным сферам программирования.
  • Пользователи хотят, чтобы, в зависимости от ситуации, одна и та же информация могла быть отображена разными способами.
  • Объекты, не имеющие визуального интерфейса, гораздо легче тестировать, чем объекты с интерфейсом.
  • Ключевым моментом в отделении представления от модели является направление зависимостей: представление зависит от модели, но модель не зависит от представления. Это означает, что изменение представления не требует изменения модели.

    Отделение контроллера от представления. Классическим примером необходимости подобного разделения является поддержка редактируемого и нередактируемого поведения. Этого можно достичь при наличии одного представления и двух контроллеров (для двух вариантов использования), где контроллеры являются стратегиями, используемыми представлением. Между тем на практике в большинстве систем каждому представлению соответствует только один контроллер, поэтому разделение между ними не проводится. О данном решении вспомнили только при появлении Web-интерфейсов, где отделение контроллера от представления оказалось чрезвычайно полезным.

    Контроллер страниц (Page Controller)
    Описание (рис 5.19) 04_19

    В основе контроллера страниц лежит идея создания компонентов, которые будут выполнять роль контроллеров для каждой страницы Веб-сайта. На практике количество контроллеров не всегда в точности соответствует количеству страниц, поскольку иногда при щелчке на ссылке открываются страницы с разным динамическим содержимым. Если говорить более точно, контроллер необходим для каждого действия, под которым подразумевается щелчок на кнопке или гиперссылке.

    Контроллер страниц может быть реализован в виде сценария (сценария CGI, сервлета и т.п.) или страницы сервера (ASP, PHP, JSP и т.п.). Использование страницы сервера обычно предполагает сочетание в одном файле контроллера страниц и представления по шаблону. Это хорошо для представления по шаблону, но не очень подходит для контроллера страниц, поскольку значительно затрудняет правильное структурирование этого компонента. Данная проблема не столь важна, если страница применяется только для простого отображения информации. Тем не менее, если использование страницы предполагает наличие логики, связанной с извлечением пользовательских данных или выбором представления для отображения результатов, страница сервера может заполниться кодом "скриптлета", т.е. внедренного сценария.

    Чтобы избежать подобных проблем, можно воспользоваться вспомогательным объектом (helper object). При получении запроса страница сервера вызывает вспомогательный объект для обработки всей имеющейся логики. В зависимости от ситуации, вспомогательный объект может вернуть управление первоначальной странице сервера или же обратиться к другой странице сервера, чтобы она выступила в качестве представления. В этом случае обработчиком запросов является страница сервера, однако большая часть логики контроллера заключена во вспомогательном объекте.

    Возможной альтернативой описанному подходу является реализация обработчика и контроллера в виде сценария. В этом случае при поступлении запроса Веб-сервер передает управление сценарию; сценарий выполняет все действия, возложенные на контроллер, после чего отображает полученные результаты с помощью нужного представления.

    Ниже перечислены основные обязанности контроллера страниц.

  • Проанализировать адрес URL и извлечь данные, введенные пользователем в соответствующие формы, чтобы собрать все сведения, необходимые для выполнения действия.
  • Создать объекты модели и вызвать их методы, необходимые для обработки данных.
  • Определить представление, которое должно быть использовано для отображения результатов, и передать ему необходимую информацию, полученную от модели.
  • Контроллер страниц не обязательно должен представлять собой единственный класс, зато все классы контроллеров могут использовать одни и те же вспомогательные объекты. Это особенно удобно, если на Веб-сервере должно быть несколько обработчиков, выполняющих аналогичные задания. В этом случае использование вспомогательного объекта позволяет избежать дублирования кода.

    При необходимости одни адреса URL можно обрабатывать с помощью страниц сервера, а другие – с помощью сценариев. Те адреса URL, у которых нет или почти нет логики контроллера, хорошо обрабатывать с помощью страниц сервера, потому что последние представляют собой простой механизм, удобный для понимания и внесения изменений. Все остальные адреса, для обработки которых необходима более сложная логика, требуют применения сценариев.

    Контроллер запросов (Front Controller)
    Описание (рис 5.20) 04_20

    Контроллер запросов обрабатывает все запросы, поступающие к Веб-сайту, и обычно состоит из двух частей: Веб-обработчика и иерархии команд. Веб-обработчик – это объект, который выполняет фактическое получение POST- или GET-запросов, поступивших на Веб-сервер. Он извлекает необходимую информацию из адреса URL и входных данных запроса, после чего решает, какое действие необходимо инициировать, и делегирует его выполнение соответствующей команде.

    Веб-обработчик обычно реализуется в виде класса, а не страницы сервера, поскольку он не генерирует никаких откликов. Команды также являются классами, а не страницами сервера; более того, им не нужно знать о наличии Веб-окружения, несмотря на то, что им часто передается информация из HTTP-запросов. В большинстве случаев Веб-обработчик – это довольно простая программа, функции которой заключаются в выборе нужной команды.

    Выбор команды может происходить статически или динамически. Статический выбор команды подразумевает проведение синтаксического анализа адреса URL и применение условной логики, а динамический – извлечение некоторого стандартного фрагмента адреса URL и динамическое создание экземпляра класса команды.

    Преимущества статического выбора команды состоят в использовании явного кода, наличии проверки времени компиляции и высокой гибкости возможных вариантов написания адресов URL. В свою очередь, использование динамического подхода позволяет добавлять новые команды, не требуя изменения Веб-обработчика.

    При динамическом выборе команд имя класса команды можно поместить непосредственно в адрес URL либо воспользоваться файлом свойств, который будет привязывать адреса URL к именам классов команд. Разумеется, это потребует создания дополнительного файла свойств, однако позволит легко и непринужденно изменять имена классов, не просматривая все имеющиеся на сервере Веб-страницы.

    Представление по шаблону (Template View)
    Описание (рис 5.21) 04_21

    Основная идея, лежащая в основе типового решения представление по шаблону, – вставка маркеров в текст готовой статической HTML-страницы. При вызове страницы для обслуживания запроса эти маркеры будут заменены результатами некоторых вычислений (например, результатами выполнения запросов к базе данных). Подобная схема позволяет создавать статическую часть страницы с помощью обычных средств, например текстовых редакторов, работающих по принципу WYSIWYG, и не требует знания языков программирования. Для получения динамической информации маркеры обращаются к отдельным программам.

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

    5.2.2.3. Паттерны интеграции корпоративных информационных систем

    5.2.2.3.1. Структурные паттерны интеграции

    К структурным паттернам интеграции относятся [25]:

  • Взаимодействие "точка – точка";
  • Взаимодействие "звезда" (интегрирующая среда);
  • Смешанный способ взаимодействия.
  • В данной лекции примеры структурных паттернов интеграции рассматриваться не будут.

    5.2.2.3.2. Паттерны по методу интеграции

    К паттернам по методу интеграции относятся [25]:

  • Интеграция систем по данным (data-centric);
  • Функционально-центрический (function-centric) подход;
  • Объектно-центрический (object-centric);
  • Интеграция на основе единой понятийной модели предметной области (concept-centric).
  • В данной лекции примеры паттернов по методу интеграции рассматриваться не будут.

    5.2.2.3.3. Паттерны интеграции по типу обмена данными

    К паттернам интеграции по типу обмена данными относятся [25]:

  • Файловый обмен;
  • Общая база данных;
  • Удаленный вызов процедур;
  • Обмен сообщениями.
  • В данной лекции примеры паттернов интеграции по типу обмена рассматриваться не будут.

    5.2.3. Ключевые термины

    Шаблон проектирования, Паттерн.

    5.3. Способы передачи данных в Веб

    5.3.1. Общие сведения

    Рассмотрим в качестве дополнительной темы способы передачи данных в Веб. Эти знания понадобятся при рассмотрении следующих лекций.

    Протокол HTTP имеет два самых часто используемых вида запросов GET и POST [26].

    Основное различие методов GET и POST состоит в способе передачи данных веб-формы обрабатывающему скрипту, а именно [27]:

  • Метод GET [28]

    Используется для запроса содержимого указанного ресурса.

    GET http://www.example.com/index.html HTTP/1.1
    

    Данная команда говорит серверу "Дай мне файл index.html, который находится в директории (на сайте) http://www.example.com/".

    С помощью метода GET можно также начать какой-либо процесс. В этом случае в тело ответного сообщения следует включить информацию о ходе выполнения процесса.

    Клиент может передавать параметры выполнения запроса в URI целевого ресурса после символа "?":

    GET /path/resource?param1=value1param2=value2 HTTP/1.1
    

    Согласно стандарту HTTP, запросы типа GET считаются идемпотентными – многократное повторение одного и того же запроса GET должно приводить к одинаковым результатам (при условии, что сам ресурс не изменился за время между запросами). Это позволяет кэшировать ответы на запросы GET.

    Кроме обычного метода GET, различают еще условный GET и частичный GET. Условные запросы GET содержат заголовки If-Modified-Since, If-Match, If-Range и подобные. Частичные GET содержат в запросе Range. Порядок выполнения подобных запросов определен стандартами отдельно.

    Итак, все, что отображается в адресной строке и любые ссылки, на которые можно нажать или скопировать – все они используют GET. Этот вид запроса позволяет вам посылать информацию на сервер, делать с ней что-то на сервере, и возвращать результат.

    Плюсы GET [26, 29]

  • Страницу всегда можно сохранить в закладках (СЕО-дружелюбен).
  • Он быстрее POST, так как вся информация находится в заголовках.
  • Информация, посылаемая на сервер, всегда видима (в адресной строке).
  • Минусы GET [26, 29]

  • Метод GET ограничивает объем передаваемой информации (максимальная длина URL не оговаривается спецификациями протокола HTTP, но на практике она в каждом конкретном случае зависит как от версии браузера, так и от настроек сервера).
  • Метод GET открыто пересылает введенную информацию в обрабатывающий сценарий, что может неблагоприятно сказаться на безопасности. Например, каждый человек, которому виден монитор вашего компьютера, может заметить введенный в форму пароль.
  • Метод POST [28]

    Применяется для передачи пользовательских данных заданному ресурсу.

    Например, в блогах посетители обычно могут вводить свои комментарии к записям в HTML-форму, после чего они передаются серверу методом POST и он помещает их на страницу. При этом передаваемые данные включаются в тело запроса. Аналогично с помощью метода POST обычно загружаются файлы.

    В отличие от метода GET, метод POST не считается идемпотентным, то есть многократное повторение одних и тех же запросов POST может возвращать разные результаты (например, после каждой отправки комментария будет появляться одна копия этого комментария).

    Сообщение ответа сервера на выполнение метода POST не кэшируется.

    POST может "симулировать" GET запрос, можно указывать параметры, как и в заголовке запроса, так и в теле.

    Плюсы POST [26, 29]

  • Можно отправить много информации на сервер, объем неограничен.
  • Отправляемая информация не показывается в адресной строке.
  • Метод POST в отличие от метода GET позволяет передавать запросу файлы.
  • Минусы POST [26, 29]

  • Медленнее, чем GET, так как анализируются заголовки и тело запроса.
  • Страницы, сгенерированные как результат запроса POST, нельзя добавить в закладки (СЕО-недружелюбен).
  • Нарушение логики работы кнопки "Назад" – элемента пользовательского интерфейса браузера. Вернуться на страницу, сгенерированную при помощи метода POST, после перехода с нее куда бы то ни было еще, довольно трудно. Internet Explorer, например, выдаст сообщение: "Внимание: страница устарела" с требованием нажать на кнопку "Обновить".
  • В ряде браузеров возникают трудности при сохранении веб-страниц, сгенерированных динамически с применением метода POST, для локального просмотра. Отмечаются также проблемы с распечаткой подобных документов.
  • В HTML формах можно указать, как отправлять информацию на сервер при помощи атрибута method:

    <form method="get">
    или
    <form method="post">
    

    По умолчанию всегда используется GET.

    При выборе использования методов POST и GET можно следовать следующим рекомендациям [30]:

  • 1. Все данные, которые участвуют в формировании страницы лучше передавать методом GET.

    Например:

  • перелистывание страниц;
  • поиск;
  • запрос по ID записи/категории/новости и т.п.
  • 2. Все данные, которые сохраняются в Базу Данных (или файл) лучше передавать методом POST и после записи данных, делать перенаправление (редирект) на страницу, где уведомлять, к примеру, что данные сохранены.
  • 5.3.2. Ключевые термины

    GET, POST.

    5.4. Краткие итоги

    Архитектура информационной системы – концепция, определяющая модель, структуру, выполняемые функции и взаимосвязь компонентов информационной системы.

    Классификация программных систем по их архитектуре:

  • Централизованная архитектура
  • Архитектура "файл-сервер"
  • Двухзвенная архитектура "клиент-сервер"
  • Многозвенная архитектура "клиент-сервер"
  • Архитектура распределенных систем
  • Архитектура Веб-приложений
  • Сервис-ориентированная архитектура
  • Шаблоны проектирования (паттерн, design pattern) – это многократно применяемая архитектурная конструкция, предоставляющая решение общей проблемы проектирования в рамках конкретного контекста и описывающая значимость этого решения.

    Протокол HTTP имеет два самых часто используемых вида запросов GET и POST. Основное различие методов GET и POST состоит в способе передачи данных веб-формы обрабатывающему скрипту.

    Вернуться к учебному плану