Остановимся прежде всего на некоторых вопросах, касающихся тенденций развития программирования за последние
десятилетия. Почти до самого конца 20 века все наиболее распространенные технологии программирования ориентировались на
вычислительные машины, разработка архитектуры которых приписывается американскому математику фон Нейману. Этот
период можно охарактеризовать как централизованное программирование централизованных систем. Иными словами,
программирование системы контролируется из одного
центра и сама разрабатываемая система имеет централизованное
управление.
В последнее десятилетие 20 века огромное влияние на определение путей дальнейшего развития технологии программирования
оказывает Интернет. Глобальная сеть предстает перед программистами как новая вычислительная система, для
программирования которой нужны новые технологии. Эти новые технологии должны учитывать децентрализованность на всех
уровнях. Физически сеть состоит
из множества узлов, соединенных каналами ограниченной пропускной способности. На
логическом уровне единая система может создаваться независимо работающими, не знающими друг о друге разработчиками,
использующими различные платформы и языки программирования. Организационно различные части системы могут
управляться различными лицами и организациями. Как следствие особое внимание должно уделяться вопросам безопасности,
надежности и масштабируемости проектируемых
приложений.
Ранее в данном курсе упомянутые вопросы уже рассматривались при рассмотрении технологии COM (COM+). Новая технология
(.NET) во многом основана на идеях COM. Пришло время, когда все программисты, работающие на платформе Windows, должны
будут познакомиться с этими идеями.
Данный раздел посвящен введению в .NET. Обычно такое введение посвящено беглому рассказу о всех технологиях .NET,
включая и работу
с базами данных, и с Web, и методы построения пользовательского интерфейса. Данный курс посвящен
компонентному программированию и упор будет сделан именно на компоненты.
В .NET о компонентах говорится особо. Имеется пространство имен
System.ComponentModel, в котором определяются классы и
интерфейсы, поддерживающие некоторую модель компонентного программирования. В рамках этой модели компонентами
называются классы (производные от некоторых специальных классов или реализующие некоторые специалные интерфейсы),
используемые прежде всего при разработке пользовательского интерфейса. Но уже в COM подход к понятию компонента был
значительно шире. В данном курсе понятие компонента
не определяется строго. Неформально понятие компонент связывается с
технологией, ориентированной на распределенное программирование распредеденных систем. Базы данных, интерфейс
пользователя - это важные темы, но они не относятся исключительно к распределенным системам и, в связи с этим, не
затрагиваются в данном курсе.
Можно выделить две компонентные модели, поддерживаемые технологией .NET. Во-первых, это уровень
CLR (Common
Language Runtime) - основа всей технологии .NET. Данная модель наиболее близка к COM. Во-вторых, это очень популярная
сегодня модель XML Web-сервисов, в рамках которой возможно взаимодействие программ, исполняющихся на разных
платформах при условии, что взаимодействующие программы понимают протокол SOAP.
Здесь мы будем говорить только о первой модели. Это представляется вполне естественным при переходе от таких тем
как COM
и COM+. И изложение будет основано на сопоставлении компонентной модели COM и модели, поддерживаемой в CLR.
Интерфейсы
Интерфейсы являются основой COM. Там их роль состоит в изоляции клиента от компонента, благодаря чему клиент без
перекомпиляции может работать с разными версиями компонента. Кроме того, интерфейсы обеспечивают в COM независимость
от языка программирования, на котором написаны клиент и компонент.
В COM и в COM+ мы видим огромное множество интерфейсов, совокупность которых можно рассматривать как
некоторое
компонентно - ориентированное расширение базового языка программирования (например, C++). Стоит отметить, что изучать
эти интерфейсы весьма не просто в силу их многочисленности и отсутствия единой систематизирующей структуры.
Роль интерфейсов в .NET резко сокращена. На взгляд автора, теперь интерфейсы прежде всего служат для расширения множества
типов, приписанных данному классу. В отличие от COM, где
не было наследования реализации, в .NET класс может наследовать
одному классу (по умолчанию классу
System.Object) и любому числу интерфейсов, которые не имеют реализации и не
наследуют корневому классу
System.Object.
Относительное снижение значимости интерфейсов в .NET по сравнению с COM в .NET компенсируется следующим:
z Клиент больше не изолируется от компонента
Если в COM клиент был максимально изолирован от компонента, то в .NET ему доступна разнообразная информация о
компоненте. Это обеспечивается тем, что в коде компонента хранятся описывающие его метаданные, доступ к которым
клиент может получить используя механизм рефлексии.
z Многие интерфейсы более не нужны
Многие интерфейсы, играющие важную роль в COM, более не нужны в .NET. С помощью представленного ниже примера
будет объяснено, почему, например, стал не нужен базовый интерфейс для COM -
IUnknown. Те возможности, которые
ранее программисты получали за счет реализации и использования большого числа интерфейсов, теперь можно получить за
счет использования среды разработки и исполнения, предоставляемой .NET. Это и CLR, и общая система типов CTS, и
промежуточный язык MSIL, на который транслируются программы со всех других языков, поддержанных .NET.
Сервер в процессе клиента
Рассмотрим в качестве примера процесс построения и использования сервера, который в рамках COM-терминологии получил бы
классификацию "сервер в процессе клиента", т.к. он будет исполняться в адресном процессе клиента. Код представлен на C#.
Сервер