Компонентное мышление программирование

Компонентно-ориентированное программирование требует как систем. Поддерживающих подход. Так и программистов. Придерживающихся его дисциплины и основных принципов. Однако часто трудно сказать разницу между истинным принципом и простой особенностью используемой компонентной технологии. По мере того. Как поддерживающие технологии станут более мощными. Без сомнения. Программная инженерия расширит свое понимание того. Что представляет собой компонентно-ориентированное программирование. И охватит новые идеи. А основные принципы будут продолжать развиваться. К наиболее важным принципам компонентно-ориентированного программирования относятся:

  • Разделение интерфейса и реализации

  • Бинарная совместимость

  • Языковая независимость

  • Прозрачность местоположения

  • Управление параллелизмом

  • Контроль версий

  • Безопасность на основе компонентов

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

Отделение интерфейса от реализации

Фундаментальный принцип компонентно-ориентированного программирования заключается в том. Что основной единицей в приложении является двоичный совместимый интерфейс.

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

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

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

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

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

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

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

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

Бинарная совместимость между Клиентом и Сервером

Другим основным принципом компонентно-ориентированного программирования является бинарная совместимость между клиентом и сервером. Традиционное объектно-ориентированное программирование требует. Чтобы все вовлеченные стороны—клиенты и серверы—были частью одного монолитного приложения.

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

Эта бинарная совместимость является основой для контракта между компонентом и клиентом. Пока новая версия компонента соблюдает этот контракт. Клиент не пострадает. В главе 2вы увидите , как .NET обеспечивает двоичную совместимость.

Независимость языка

В отличие от традиционного объектно-ориентированного программирования. В компонентно-ориентированном программировании сервер разрабатывается независимо от клиента. Поскольку клиент взаимодействует с сервером только во время выполнения. Единственное. Что связывает их. — это двоичная совместимость.

Отсюда следует. Что языки программирования. Реализующие клиент и сервер. Не должны влиять на их способность взаимодействовать во время выполнения. Независимость языка это означает именно это: когда вы разрабатываете и развертываете компоненты. Ваш выбор языка программирования не должен иметь значения. Языковая независимость способствует взаимозаменяемости компонентов. Их усвоению и повторному использованию. .NET достигает языковой независимости с помощью архитектуры и реализации. Называемой Common Language Runtime (CLR). Которая рассматривается далее в главе 2.

Прозрачность местоположения

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

Технология базового компонента необходима для обеспечения прозрачности местоположения клиента , что позволяет клиентскому коду не обращать внимания на фактические местоположения объектов. Которые он использует. Прозрачность расположения означает. Что в коде клиента нет ничего. Относящегося к тому. Где выполняются объекты. Один и тот же клиентский код должен быть способен обрабатывать все случаи расположения объектов (см. рис. 1-3), хотя клиент также должен иметь возможность настаивать на определенном месте. Обратите внимание, что на рисунке объект может находиться в одном и том же процессе (например, Процесс 1 на машине А), в разных процессах на одной и той же машине (например, Процесс 1 и Процесс 2 на машине А), на разных машинах в одной и той же локальной сети (например, Машина В) или даже на разных машинах через Интернет (например, Машина С).

Рисунок 1-3. При прозрачности местоположения клиент не обращает внимания на фактическое местоположение объекта

Прозрачность местоположения имеет решающее значение для компонентно-ориентированного программирования по целому ряду причин. Во-первых, он позволяет разрабатывать клиент и компоненты локально (что приводит к более простой и продуктивной отладке). Но при этом развертывать одну и ту же базу кода в распределенных сценариях. Во-вторых, выбор того. Использовать ли один и тот же процесс для всех компонентов или несколько процессов для нескольких машин. Оказывает значительное влияние на производительность и простоту управления по сравнению с масштабируемостью. Доступностью. Надежностью. Пропускной способностью и безопасностью. Организации имеют разные приоритеты и предпочтения для этих компромиссов. Но один и тот же набор компонентов от конкретного поставщика или команды должен быть в состоянии справиться со всеми сценариями. В-третьих, расположение компонентов. Как правило. Меняется по мере изменения требований приложения с течением времени. Если локации прозрачны для клиента. То это перемещение не вызывает проблем.

Чтобы минимизировать затраты на долгосрочное обслуживание и расширяемость. Следует избегать того. Чтобы клиентский код делал какие-либо предположения относительно расположения объектов. Которые он использует. И избегал явных вызовов между процессами или между машинами. .NET remoting -это название технологии. Которая позволяет осуществлять удаленные вызовы в .NET. Глава 10 посвящена .NET remoting и обсуждает поддержку .NET для прозрачности местоположения.

Управление параллелизмом

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

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

Поддержка управления версиями

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

Компонентная безопасность

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

Чтобы уменьшить опасность. Компонентная технология должна обеспечить инфраструктуру безопасности для работы с этими сценариями. Не связывая компоненты и клиентские приложения друг с другом. Требования безопасности. Политики и события (например. Новые пользователи) относятся к числу наиболее изменчивых аспектов жизненного цикла приложения. А политики безопасности различаются между приложениями и клиентами. Производительная компонентная технология должна позволять компонентам иметь как можно меньше политик безопасности и как можно меньше знаний о безопасности в самом коде. Он также должен позволять системным администраторам настраивать политику безопасности приложений и управлять ею. Не требуя внесения изменений в код. Богатая инфраструктура безопасности .NET — это тема главы 12.