Введение в теорию программирования. Объектно-ориентированный подход

       

Платформа.NET и ее применение для объектно-ориентированного подхода к программированию


Исследуем особенности приложения идеологии .NET для проектирования и реализации объектно-ориентированных программ.

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

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

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

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

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

Говоря о .NET как о технологической платформе, нельзя не отметить тот факт, что она обеспечивает одновременную поддержку проектирования и реализации программного обеспечения с использованием различных языков программирования.
При этом поддерживаются десятки языков программирования, начиная от самых первых (в частности, COBOL и FORTRAN) и заканчивая современными (например, C# и Visual Basic). Ранние языки программирования до сих пор активно используются, в частности, для обеспечения совместимости с ранее созданными приложениями, критичными для бизнеса (скажем, COBOL весьма широко применялся для создания прикладных программ, поддерживающих финансовую деятельность).

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

Под интероперабельностью понимается возможность интегрированной обработки гетерогенных данных, поступающих от разнородных прикладных программ. Именно благодаря интероперабельности возможна унификация взаимодействия пользователей через приложение с операционной системой на основе специализированного интерфейса прикладных программ, или API-интерфейса (Application Programming Interface).

Следует отметить и то обстоятельство, что новая технология .NET не только востребована мировой общественностью, но и официально признана, что отражено в соответствующих стандартах ECMA (European Computer Manufacturers Association).

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

Прежде всего, необходимо отметить поддержку многоязыковой среды разработки приложений CLR (Common Language Runtime).

Эта возможность появилась благодаря универсальному межъязыковому интерфейсу Common Language Infrastructure, или CLI, который поддерживает разработку программных компонентов на различных языках программирования.



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

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



Среда выполнения CLR реализует управление памятью, типами данных, межъязыковым взаимодействием, развертыванием (deployment) приложений.


Рис. 14.1.  Архитектурная схема .NET Framework и Visual Studio.NET.

Существенным преимуществом конструктивного решения .NET является компонентно-ориентированный подход к проектированию и реализации программного обеспечения. Суть подхода состоит в принципиальной возможности создания независимых составляющих программного обеспечения с унифицированной интерфейсной частью для многократного повторного и распределенного использования. При этом продуктивность решения обусловлена многоязычностью интегрируемых программных проектов (концепция .NET потенциально поддерживает произвольный язык программирования, в числе наиболее известных языков – C#, Visual Basic, C++ и др.).

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

Под Common Language Specification (или CLS) понимается набор правил, определяющих подмножество обобщенных типов данных, в отношении которых гарантируется, что они безопасны при использовании во всех языках .NET.

Интерфейсы реализуются посредством форм Windows и ASP.NET для веб-приложений.

В ходе выполнения процедуры трансляции исходный текст программы (написанный на SML, C#, Visual Basic, C++ или любом другом языке программирования, который поддерживается .NET) преобразуется компилятором в так называемую сборку (assembly) и сохраняется в виде файла динамически присоединяемой библиотеки (Dynamically Linked Library, DLL) или исполняемого файла (Executable, EXE).


Рис. 14.2.  Схема компиляции Common Language Runtime.

Естественно, что для каждого компилятора (будь то компилятор языка C#, csc.exe или Visual Basic, vbc.exe) средой времени выполнения производится необходимое отображение используемых типов в типы CTS, а программного кода – в код "абстрактной машины" .NET – MSIL (Microsoft Intermediate Language).



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

Рассмотрим достаточно обобщенный пример трансляции многокомпонентного гетерогенного программного проекта под управлением Microsoft .NET (см. рис. 14.3).

Предположим, что компоненты проекта написаны на трех языках программирования: уже знакомом нам языке SML, изучаемом языке C#, а также языке С++, который характеризуется возможностью создания потенциально небезопасного кода (в частности, динамического распределения памяти).



Исходные тексты компонент проекта транслируются, соответственно, компиляторами с языков SML, C# и C++ в унифицированный MSIL-код и сохраняются в файлах в виде сборок.

В ходе компоновки и выполнения программного проекта Just-In-Time (JIT) компилятор среды CLR производит выполнение проекта с "ленивым" (по мере необходимости) означиванием оттранслированного промежуточного кода сборок.


Рис. 14.3.  Схема выполнения CLR.

Существенно, что потенциально небезопасный код на языке C++ принципиально невыполним собственно JIT-компилятором, но исполняется посредством сервисов операционной системы. Ответственность за работоспособность программы и безопасность кода в этом случае лежит уже не на среде проектирования и разработки программного обеспечения .NET, а на программисте-разработчике.

Существенным позитивным отличием Microsoft .NET от существующих аналогов на современном рынке программного обеспечения является универсальная система типизации.

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


Рис. 14.4.  Универсальная система типизации (UTS).



Система типизации Microsoft . NET представляет собой частично упорядоченное множество, которое на качественном уровне может пониматься как ISA-иерархия (аббревиатура ISA происходит от английских слов "is a", которые означают "является одним из").

Так, например, высказывание STUDENT ISA PERSON означает, что тип STUDENT является подтипом типа PERSON (здесь вполне уместна аналогия с множествами и вполне точна аналогия с доменами).

Таким образом, система типов Microsoft .NET образует иерархию с возрастанием общности снизу вверх (см. рис. 14.4), в которой явно выделяются две большие группы типов, а именно, типы-ссылки и типы-значения. Различие между последними определяется особенностями вызова в процедурах: по имени или по значению (call-by-name, CBN) и по ссылке (call-by-reference, CBR).

Заметим также, что система типизации Microsoft .NET помимо развитой иерархии предопределенных типов позволяет пользователю создавать собственные типы (как типы-ссылки, так и типы-значения) на основе уже существующих.

Изложение важнейших аспектов Microsoft .NET было бы неполным, если бы мы не упомянули о таком существенном архитектурном принципе как веб-сервисы.

Значение веб-сервисов заключается в распределении возможностей разработанных прикладных систем по каналам Internet.


Рис. 14.5.  Веб-серверы в .NET.

Заметим, что центральным блоком в схеме (рис. 14.5) является .NET Framework, который можно рассматривать как библиотеку базовых объектов и операций над ними.

В качестве среды разработки прикладных систем целесообразно использовать Microsoft Visual Studio .NET, предоставляющую целый комплекс развитых средств создания, редактирования и отладки программного кода на различных языках программирования. В случае несложных задач можно ограничиться примитивными редакторами текста программ, подобных Notepad.

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



В качестве языка реализации может использоваться язык гипертекстовой разметки HTML (HyperText Markup Language). Взаимодействие между клиентом и приложением в простейшем случае осуществляется с использованием традиционного Internet-протокола передачи данных HTTP (HyperText Transfer Protocol).

Структурированные данные хранятся в формате XML (вариант HTML с более строгим синтаксисом).

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

Попытаемся сформулировать определение понятия "веб-сервис" (или, иначе, "веб-служба").

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

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

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

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

  1. HTTP – стандартный протокол обмена гипертекстовыми документами в Internet с возможностью передачи данных посредством веб-форм;
  2. XML – формат хранения структурированных данных с возможностью обмена ими по Internet-каналам;
  3. SOAP – стандартный протокол взаимодействия компонент (глобально) распределенного приложения (Simple Object Access Protocol);
  4. UDDI – стандарт интеграции приложений (Universal Description, Discovery and Integration);
  5. WSDL – универсальный язык описания веб-сервисов (Web Service Description Language),


а также целом ряде других менее употребительных протоколов.



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

Центральной концепцией подхода (и это очевидно уже из названия) является понятие компонента.

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

В отличие от "традиционных" объектов ООП компоненты обладают следующими характеристическими свойствами:

  • в целом компонент обладает более высоким уровнем абстракции по сравнению с объектом (под последним понимается конструкция уровня языка программирования);


  • компоненты могут содержать в своем составе множественные классы;


  • компоненты с точки зрения пользователя являются инвариантами по отношению к тому языку программирования, на котором они реализованы.


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

Заметим, что попытки построения компонентных программных систем предпринимались и рядом других разработчиков программного обеспечения (в частности, технология JavaBeans производства Sun Microsystems), а также международных ассоциаций, объединяющих усилия исследователей и практиков в области объектного программирования (например, стандарт брокеров объектных запросов CORBA организации Object Management Group).

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

Прежде всего, рассмотрим компонентную модель Microsoft, которая обычно обозначается в литературе аббревиатурой COM (Component Object Model).



Компонентная объектная модель COM является основным стандартом Microsoft для компонентного проектирования и реализации программного обеспечения. На сегодня это самая развитая, и, пожалуй, самая удачная в практическом плане модель, которая обеспечивает возможность инициализации и использования компонентов как внутри одного процесса, так и между процессами или между компьютерами независимо от языка реализации. COM-модель поддерживается в идеологии .NET для целого ряда языков программирования (C#, SML, Visual Basic, C++ и др.), является основой для ActiveX, OLE, а также для многих других технологий Microsoft.

В отличие от СОМ, модель Java Beans, базовый стандарт Sun Microsystems для компонент, оказывается зависимой от языка реализации.

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

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

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

При этом под классом понимается базовая сущность, определяемая как совокупность элементов.

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



Принципиально новым является наличие в COM-модели сборок – самодостаточных единиц информации для инсталляции и развертывания программных продуктов.

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

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

Во-первых, разработчики отмечают достаточно высокие требования к аппаратному обеспечению (в частности, объем оперативной памяти должен быть не менее 256 мегабайт, свободный объем жесткого диска для работы с Microsoft Visual Studio .NET – не менее 10 гигабайт).

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

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

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

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

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



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


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

Для более подробного самостоятельного ознакомления с тематикой лекции рекомендуется следующий список источников: [25, 41, 60, 64, 82].


Содержание раздела