Программный компонент

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

Определение

Термин «компонент» происходит от латинского componere («составлять»). В программной инженерии понятие компонента употребляется в различных смыслах. Часто это слово ошибочно используется как синоним модуля, что подчеркивает схожесть обоих понятий (см. раздел «Компонентные интерфейсы»).

В 1996 году на Европейской конференции по объектно-ориентированному программированию (ECOOP) программный компонент был определён следующим образом:

«Программный компонент — это элемент сборки с контрактно определёнными интерфейсами и исключительно явно заданными контекстными зависимостями. Программный компонент может распространяться независимо и использоваться третьими сторонами в их собственных сборках.»[1]

В более общем виде и в контексте нового подхода компонентно-ориентированной разработки можно дать другое определение компонента:

«Программный компонент — это программный элемент, соответствующий компонентной модели и способный без изменений связываться и выполняться с другими компонентами в соответствии со стандартом композиции.»[2]

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

Компонентные интерфейсы

Интерфейс компонента — это определённый контракт (англ. interface) между компонентом и остальной частью программного обеспечения. Интерфейс можно рассматривать как договор между компонентом и программной системой. Благодаря явному описанию контекстных зависимостей становится ясно, насколько компонент независим от окружающей среды.

Интерфейсы и чётко определённые условия контекста обеспечивают повторное использование компонента. Чем меньше контекстных зависимостей у компонента, тем меньше требований нужно соблюдать для его применения. Следовательно, чем меньше зависимостей, тем проще повторное использование; в то же время низкая степень зависимости позволяет независимо развивать и сопровождать компонент. Однако высокая независимость компонентов зачастую приводит к появлению избыточности — разработчику приходится искать компромисс.

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

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

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

  • Графический пользовательский интерфейс (GUI), также известный как человеко-машинный интерфейс (HMI): позволяет пользователю взаимодействовать с компонентом с помощью графического интерфейса (например, мышь, экран).
  • Командная строка (CLI): особенно актуальна, когда компоненты должны вызываться системой без участия пользователя, например, для выполнения повторяющихся задач по расписанию; взаимодействие — через ввод команд в терминал.
  • Данные-интерфейсы: позволяют компоненту читать и записывать собственные данные; обычно к такому интерфейсу обращаются из внутреннего кода программы.
  • Программный интерфейс (API): предоставляет программисту или другим компонентам доступ к функциональности и сервисам компонента через программные вызовы. В дальнейшем под интерфейсом чаще всего подразумевается именно API компонента.

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

Преимущества и польза

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

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

Формы повторного использования

В зависимости от формы повторного использования программные компоненты условно делятся на следующие типы:

blackbox
Чёрный ящик — компонент интегрируется как полностью готовая и неделимая сущность; его нельзя изменить, сведения о реализации и внутренней структуре отсутствуют. Использование строится исключительно на основе его интерфейсов и спецификаций.
whitebox
Белый ящик — компонент предназначен для модификации; сведения о внутренней структуре доступны для анализа и доработки, что позволяет адаптировать его к новым требованиям. Использование происходит не только через интерфейсы, но и через изучение реализации.
greybox
Промежуточные формы между blackbox и whitebox.

Компоненты на этапе разработки

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

Пример палитры компонентов

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

Реализации

Стандарты

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

Инструменты разработки

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

Примечания

  1. Szyperski, Clemens. Component Software — Beyond Object-Oriented Programming : [англ.]. — Addison-Wesley, 2002. — P. 41. — ISBN 0-201-74572-0.
  2. Councill, William T. Component-Based Software Engineering : [англ.] / William T. Councill, Heineman, George T.. — Addison-Wesley, 2001. — ISBN 0-201-70485-4.
  3. Dumke, Reiner. Software Engineering : [нем.]. — 4. — Friedr. Vieweg & Sohn Verlagsgesellschaft/GWV Fachverlage GmbH, 2003.
  4. 1 2 Open Source – kurz & gut (нем.). O’Reilly (2002). Дата обращения: 15 июня 2024. Архивировано 2 февраля 2020 года.

Литература

  • Олаф Цвинтцшер. Обзор программных компонентов. W3L, 2004. ISBN 3937137602.
  • Клеменс Шиперски. Программное обеспечение-компоненты — за пределами объектно-ориентированного программирования. Второе издание, 2002. ISBN 0-201-74572-0.
  • M. D. McIlroy. Mass produced software components // Software Engineering, Report on a conference sponsored by the NATO Science Committee, Garmisch, Germany, 7th to 11th October 1968. 1969. С. 138–155. Текст (англ.)

Ссылки

Категории