Главная > Документ


257

Введение

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

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

Настоящий курс посвящен рассмотрению основ создания интернет приложений на основе с использованием языка программирования C#. В качестве среды, используемой для разработки выбрана Visual Studio 2005. Курс предназначен для изучения базовых принципов разработки интернет приложений. Для его успешного усвоения необходимо понимание основ программирования, знания основных принципов работы Web приложений, синтаксиса языка HTML, а также начальные сведения об архитектуре .NET Framework.

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

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

Занятие 1.Принципы работы и структура Web приложений на основе

Архитектура Web приложений

Web приложения представляют собой особый тип программ, построенных по архитектуре «клиент-сервер». Особенность заключается в том, что само Web приложение находится и выполняется на сервере, клиент при этом получает только результаты работы. Работа приложения основывается на получении запросов от пользователя (клиента), их обработке и выдачи результата. Передача запросов и результатов их обработки происходит через Интернет (рис.1.1).

Рис. 1.1. Архитектура Web приложения. Слайд 1.

Отображением результатов запросов, а также приемом данных от клиента и их передачей на сервер обычно занимается специальное приложение – браузер (Internet Expolrer, Mozilla, Opera и т.д.). Как известно, одной из функций браузера является отображения данных, полученных из Интернета в виде страницы, описанной на языке HTML, следовательно, результат, передаваемый сервером клиенту должен быть представлен на этом языке.

На стороне сервера Web приложение выполняется специальным программным обеспечением (Web сервером), который и принимает запросы клиентов, обрабатывает их, формирует ответ в виде страницы, описанной на языке HTML и передает его клиенту. Одним из таких Web серверов является Internet Information Services (IIS) компании Microsoft. Это единственный Web сервер, способный выполнять Web приложения, созданные с использованием технологии .

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

За счет наличия исполняемой части, Web приложения способны выполнять практически те же операции, что и обычные Windows приложения, с тем лишь ограничением, что код исполняется на сервере, в качестве интерфейса системы выступает браузер, а в качестве среды, посредством которой происходит обмен данными – Интернет. К наиболее типичным операциям, выполняемым Web приложениями относятся:

  • прием данных от пользователя и сохранение их на сервере;

  • выполнение различных действий по запросу пользователя: извлечение данных из базы данных (БД), добавление, удаление, изменение данных в БД, проводить сложные вычисления;

  • аутентифицировать пользователя и отображать интерфейс системы, соответствующий данному пользователю;

  • отображать оперативную постоянно изменяющуюся информацию

  • и т.д.

Краткое описание архитектуры и .NET Framework

– это платформа для создания Web-приложений и Web-сервисов, работающих под управлением IIS. Сегодня существуют другие технологии, позволяющие создавать Web-приложения. К ним относятся прежде всего, очень популярные сегодня языки PHP и PERL, более старая и менее популярная сегодня технология CGI и т.д. Однако, отличается от них высокой степенью интеграции с серверными продуктами, а также с инструментами Microsoft для разработки, доступа к данным и обеспечения безопасности. Кроме того, использование позволяет разрабатывать Web и Windows приложения используя очень похожие технологические цепочки, одинаковые языки программирования, технологии доступа к данным и т.д. Более того, базовые языки программирования, с помощью которых сегодня возможна разработка Web приложений являются полностью объектно-ориентированными, что делает разработку исполнимой части, а также ее модификацию, обслуживание, отладку и повторное использование гораздо более простым занятием, чем в других технологиях. Существует достаточно большой перечень сильных сторон использования для создания сложных Web приложений. Целью данного курса не является описание всех сильных и слабых сторон этой платформы. Более подробно об этом можно узнать на сайте , а также в [1].

Заметим лишь, что функционирует исключительно на серверах Windows, так как требует наличия IIS. Для создания Web-приложений, не требующих IIS, а использующих, например, Web сервер Apache и работающих на серверах под управлением операционных систем, отличных от Windows, применяются другие технологии.

Важным моментом в понимании архитектуры является тот факт, что она является частью инфраструктуры .NET Framework. Более подробно об архитектуре и принципах работы .NET Framework можно узнать в [2]. Так как эта тема является слишком объемной и выходит за рамки данного курса, ограничимся лишь кратким описанием инфраструктуры .NET Framework.

Архитектура .NET Framework

Как утверждает корпорация Microsoft, до 80% средств, направленных на исследования и разработки, тратится на платформу .NET и связанные с ней технологии. Результаты такой политики на сегодняшний день выглядят впечатляюще. Так, область охвата платформы .NET просто огромна. Платформа состоит из четырех групп программных продуктов:

набор языков, куда входят С# и Visual Basic .NET; набор инструментальных средств разработки, в том числе Visual Studio .NET; обширная библиотека классов для построения веб-служб и приложений, работающих в Windows и в Интернете; а также среда выполнения программ CLR (Common Language Runtime, общеязыковая среда выполнения), в которой выполняются объекты, построенные на этой платформе;

набор серверов.NET Enterprise Servers, ранее известных под именами SQL Server 2000, Exchange 2000, BizTalk 2000 и др., которые предоставляют специализированные функциональные возможности для обращения к реляционным базам данных, использования электронной почты, оказания коммерческих услуг «бизнес-бизнес» (В2В) и т. д.;

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

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

Microsoft .NET поддерживает не только языковую независимость, но и языковую интеграцию. Это означает, что разработчик может наследовать от классов, обрабатывать исключения и использовать преимущества полиморфизма при одновременной работе с несколькими языками. Платформа .NET Framework предоставляет такую возможность с помощью спецификации Common Type System (CTS, общая система типов), которая полностью описывает все типы данных, поддерживаемые средой выполнения, определяет, как одни типы данных могут взаимодействовать с другими и как они будут представлены в формате метаданных .NET. Например, в .NET любая сущность является объектом какого-нибудь класса, производного от корневого класса System.Object. Спецификация CTS поддерживает такие общие понятия, как классы, делегаты (с поддержкой обратных вызовов), ссылочные и размерные типы.

Важно понимать, что не во всех языках программирования .NET обязательно должны поддерживаться все типы данных, которые определены в CTS. Спецификация Common Language Specification (CLS, общая языковая спецификация) – устанавливает основные правила, определяющие законы, которым должны следовать все языки, такие как ключевые слова, типы, примитивные типы, перегрузки методов и т.п. Спецификация CLS определяет минимальные требования, предъявляемые к языку платформы .NET. Компиляторы, удовлетворяющие этой спецификации, создают объекты, способные взаимодействовать друг с другом. Любой язык, соответствующий требованиям CLS, может использовать все возможности библиотеки FCL (Framework Class Library, библиотека классов платформы). CLS позволяет и разработчикам, и поставщикам, и производителям программного обеспечения не выходить за пределы общего набора правил для языков, компиляторов и типов данных.

Платформа .NET Framework является надстройкой над операционной системой, в качестве которой может выступать любая версия Windows1. На сегодняшний день платформа .NET Framework включает в себя:

  • четыре официальных языка: С#, , Managed C++ (управляемый C++) и JScript .NET;

  • объектно-ориентированную среду CLR (Common Language Runtime), совместно используемую этими языками для создания приложений под Windows и для Internet;

  • ряд связанных между собой библиотек классов под общим именем FCL (Framework Class Library).

Отношения с концептуальной точки зрения архитектурных компонентов платформы .NET Framework представлены на рис.1.2Введение.

Рис. 1.2. Архитектура .NET Framework. Слайд 2

Самым важным компонентом платформы .NET Framework является CLR(CommonLanguageRuntime), предоставляющая среду, в которой выполняются программы. Главная ее роль заключается в том, чтобы обнаруживать и загружать типы .NET и производить управление ими в соответствии с полученными командами. CLR включает в себя виртуальную машину, во многих отношениях аналогичную виртуальной машине Java. На верхнем уровне среда активизирует объекты, производит проверку безопасности, размещает объекты в памяти, выполняет их, а также запускает сборщик мусора.

Под сборкой мусора понимается освобождение памяти, занятой объектами, которые стали бесполезными и не используются в дальнейшей работе приложения. В ряде языков программирования (например, C/C++) память освобождает сам программист, в явной форме отдавая команды как на создание, так и на удаление объекта. В этом есть своя логика – ";я тебя породил, я тебя и убью";. Однако в CLRзадача сборки мусора (и другие вопросы, связанные с использованием памяти) решается в нужное время и в нужном месте исполнительной средой, ответственной за выполнение вычислений.

На рис.1.2 над уровнем CLR находится набор базовых классов платформы, а над ним расположены слой классов данных и XML, а также слой классов для создания веб-служб (Web Services), веб- и Windows-приложений (Web Forms и Windows Forms). Собранные воедино, эти классы известны под общим именем FCL (Framework Class Library). Это одна из самых больших библиотек классов в истории программирования. Она окрывает доступ к системным функциям, включая и те, что прежде были доступны только через API Windows, а также к прикладным функциям для Web-разработки (), для доступа к данным (), обеспечения безопасности и удаленного управления. Имея в своем составе более 4000 классов, библиотека FCL способствует быстрой разработке настольных, клиент-серверных и других приложений и веб-служб.

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

Над этим уровнем находится уровень классов, которые расширяют базовые классы с целью обеспечения управления данными и XML. Классы данных позволяют реализовать управление информацией, хранящейся в серверных базах данных. В число этих классов входят классы SQL (Structured Query Language, язык структурированных запросов), дающие программисту возможность обращаться к долговременным хранилищам данных через стандартный интерфейс SQL. Кроме того, набор классов, называемый , позволяет оперировать постоянными данными. Платформа .NET Framework поддерживает также целый ряд классов, позволяющих манипулировать XML-данными и выполнять поиск и преобразования XML.

Базовые классы, классы данных и XML расширяются классами, предназначенными для построения приложений на основе трех различных технологий: Web Services (веб-службы), Web Forms (веб-формы) и Windows Forms (Windows-формы). Веб-службы включают в себя ряд классов, поддерживающих разработку облегченных распределяемых компонентов, которые могут работать даже с брандмауэрами и программами трансляции сетевых адресов (NAT). Поскольку веб-службы применяют в качестве базовых протоколов связи стандартные протоколы HTTP и SOAP, эти компоненты поддерживают в киберпространстве подход «plug-and-play».

Инструментальные средства Web Forms и Windows Forms позволяют применять технику Rapid Application Development (RAD, быстрая разработка приложений) для построения веб- и Windows-приложений. Эта техника сводится к перетаскиванию элементов управления с панели инструментов на форму, двойному щелчку по элементу и написанию кода, обрабатывающего события, связанные с этим элементом.

Компиляция и язык MSIL

.NET-приложения исполняются иначе, чем традиционные Windows-приложения. Такие программы компилируются фактически в два этапа. На первом этапе исходный код компилируется во время построения проекта и вместо исполняемого файла с машинными кодами получается сборка2 (assembly), содержащая команды промежуточного языка Microsoft Intermediate Language – (MSIL, промежуточный язык Microsoft). Код IL сохраняется в файле на диске. При этом, файлы MSIL (сокращенно IL), генерируемые компилятором, например, С#, идентичныIL-файлам, генерируемым компиляторами с других языков .NET. В этом смысле платформа остается в неведении относительно языка. Самой важной характеристикой среды CLR является то, что она общая; одна среда выполняет как программы, написанные на С#, так и программы на языке .

Второй этап компиляции наступает непосредственно перед фактическим выполнением страницы. На этом этапе CLR транслирует промежуточный код IL в низкоуровневый собственный машинный код, выполняемый процессором. Процесс происходит следующим образом: при выполнении .NET-программы системы CLR активизирует JIT-компилятор, который затем превращает MSIL во внутренний код процессора. Этот этап известен как оперативная компиляция «точно к нужному моменту» (Just-In-Time) или JIT-компиляция (JIT'ing) и он проходит одинаково для всех приложений .NET(включая, например, приложения Windows). При исполнении программы CLR берет на себя управление памятью, контроль типов и решает за приложение ряд других задач. На рис.1.3 показан этот двухэтапный процесс компиляции.

Рис. 1.3. Схема компиляции .NET-приложения.

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

Спецификация CLS подразумевает, что все языки платформы .NET генерируют очень похожий IL-код. Кроме того, при компилировании программы в дополнение к MSIL формируется еще один компонент – метаданные, которые описывают данные, используемые программой, что позволяет коду взаимодействовать с другим кодом. В результате объекты, созданные на одном языке, доступны и могут наследоваться на другом. То есть можно создать базовый класс на языке , а производный от него класс – на языке С#.

В целом, при написании приложения создается так называемый управляемый код (managed code), который выполняется под контролем не зависящей от языка среды исполнения CLR приложения. Поскольку приложение запускается под контролем CLR, управляемый код должен соответствовать определенным требованиям (т.е. компилятор должен создать MSIL-файл, предназначенный для CLR, а также использовать библиотеки .Net Framework3), при выполнении которых он получает множество преимуществ, включая современное управление памятью, способность совмещать языки, высокий уровень безопасности передачи данных, поддержку контроля версии и понятный способ взаимодействия компонентов программного обеспечения4.

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

Конечно, компиляция не будет столь полезна, если ее выполнение будет необходимо каждый раз при запросе пользователем Web-страницы. К счастью, приложения не нужно компилировать всякий раз при запросе Web-страницы или Web-службы. Вместо этого код IL создается один раз и повторно генерируется только при изменении исходного кода. Подобным образом файлы собственного машинного кода кэшируются в системном каталоге с путем вроде С:\[WinDir]\\Framework\[Version]\Temporary Files, где WinDir является каталогом Windows, a Version – номером установленной в данный момент версии .NET.

Архитектура

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

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

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

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

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

На рис.1.4 представлен пример простейшей страницы Web приложения, содержащего всего лишь один элемент – кнопку. Как видно из рисунка, основой страницы является тело стандартного HTML документа, внутри которого находится элемент form, а также кнопка button. Кроме того, здесь присутствуют некоторые дополнительные элементы вначале документа, которые будут рассмотрены позднее.

Рис. 1.4. Пример простейшей страницы Web приложения

При запуске приложения данная страница отображается в окне браузера и выглядит следующим образом (рис.1.5).

Рис. 1.5. Отображение страницы Web приложения в окне браузера

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

Рис. 1.6. Файл, содержащий программный код Web страницы

На самом деле, при разработке Web приложений на основе возможны два варианта организации Web форм.

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

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

В примере, рассмотренном ранее, Web страница разделена на две части, при этом форма и программный код хранятся в разных файлах.

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

Рис. 1.7. Пример Web формы, содержащей описание формы и
программный код в одном файле

Изучив этот пример, можно описать типовой сценарий взаимодействия элементов Web приложения друг с другом и с клиентом, осуществляющим запрос формы этого приложения (рис.1.8).

Рис. 1.8. Типовой сценарий взаимодействия элементов
Web приложения с клиентом.

Как видно из рис.1.8, при обращении клиента к Web приложению, последнее запускается на сервере IIS. Запущенное приложение формирует отклик. Для этого на сервере создается экземпляр запрошенной Web формы, которая генерирует HTML текст отклика, который и передается браузеру клиента. Сразу после этого экземпляр Web формы уничтожается. Пользователь, получив HTML страницу, сгенерированную приложением, имеет возможность заполнять различные поля формы (тестовые поля, переключатели и т.п.). После заполнения всех необходимых полей формы, пользователь инициирует отправку данных, введенных им в страницу обратно на сервер. Это происходит за счет использования технологии обратной отсылки, которая вызывается при выполнении определенных действий (например, нажатия на кнопку). Получив данные от пользователя, сервер создает новый экземпляр Web формы, заполняет его полученными данными и обрабатывает все необходимые события. По окончании обработки, сервер формирует HTML код ответа и отправляет его клиенту, а затем уничтожает экземпляр Web формы. Более подробно описанный сценарий изображен на рис.1.9 и 1.10.

Рис. 1.9. Подробный сценарий взаимодействия элементов
Web приложения с клиентом при первом запросе.

Рис. 1.10. Подробный сценарий взаимодействия элементов
Web приложения с клиентом при запросе обратной отсылки.

В момент окончания работы с Web приложением, пользователь либо закрывает браузер, либо переходит на другую интернет страницу. В этот момент завершается сеанс работы пользователя с данным приложением, однако само приложение может быть завершено сервером не сразу после окончания последнего сеанса работы пользователя. Это связано с управлением распределением памяти платформой .NET Framework, которая основана на периодической проверке ссылок объектов. Если в результате такой проверки обнаружится, что объект больше не используется, сервер уничтожает его, освобождая таки образом занимаемую им память. Таким образом, нельзя точно сказать когда именно наступит событие Application_End для данного Web приложения.

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

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



Скачать документ

Похожие документы:

  1. Приложение 4 Аннотации поточных учебных дисциплин

    Документ
    ... компонент; Применение визуальных средств и быстрых технологийразработкиприложений; Компонентный подход; Организация построения web ...
  2. Технология разработки программных систем

    Автореферат диссертации
    ... методов промышленной разработки. Курс "Технологияразработки программных систем" ... модели процессов, проектирование архитектуры приложения. Обзор и анализ информации ... Этапы модели процессов, реализация приложения. Физический дизайн. Презентационный ...
  3. Технология разработки программных систем

    Автореферат диссертации
    ... методов промышленной разработки. Курс "Технологияразработки программных систем" ... модели процессов, проектирование архитектуры приложения. Обзор и анализ информации ... Этапы модели процессов, реализация приложения. Физический дизайн. Презентационный ...
  4. Технология разработки масштабируемых параллельных вычислений для smp-систем на базе mpi

    Документ
    ТЕХНОЛОГИЯРАЗРАБОТКИ МАСШТАБИРУЕМЫХ ПАРАЛЛЕЛЬНЫХ ВЫЧИСЛЕНИЙ ДЛЯ SMP- ... параллельных приложений с одной платформы на другую. Другим, определяющим фактором, влияющим на технологиюразработки ...
  5. Технология разработки масштабируемых параллельных вычислений для smp-систем на базе mpi

    Документ
    ТЕХНОЛОГИЯРАЗРАБОТКИ МАСШТАБИРУЕМЫХ ПАРАЛЛЕЛЬНЫХ ВЫЧИСЛЕНИЙ ДЛЯ SMP- ... параллельных приложений с одной платформы на другую. Другим, определяющим фактором, влияющим на технологиюразработки ...

Другие похожие документы..