Введение
Измерение способности и требуемых усилий для расширения функциональности заданной системы. Расширяемость – это принцип разработки программного обеспечения и системного проектирования, обеспечивающий возможность дальнейшего развития. Расширяемость определяет, насколько легко можно расширить систему и какие усилия для этого потребуются. Расширение может достигаться как добавлением новой функциональности, так и модификацией существующей. Этот принцип позволяет вносить улучшения, не нарушая работу уже существующих функций системы. Расширяемая система характеризуется минимальным или отсутствующим влиянием новой или измененной функциональности на ее внутреннюю структуру и потоки данных; например, для изменения поведения системы создателем или другими программистами может не потребоваться перекомпиляция или изменение исходного кода. Поскольку программные системы имеют длительный жизненный цикл и будут модифицироваться для добавления новых функций и возможностей по требованию пользователей, расширяемость позволяет разработчикам наращивать или добавлять возможности программного обеспечения и способствует систематическому повторному использованию кода. К методам обеспечения расширяемости относятся, в частности, возможность встраивания пользовательских программных процедур, а также возможность определения новых типов данных и новых тегов форматирования.
Extensibility is a software engineering and systems design principle that provides for future growth. Extensibility is a measure of the ability to extend a system and the level of effort required to implement the extension. Extensions can be through the addition of new functionality or through modification of existing functionality. The principle provides for enhancements without impairing existing system functions. An extensible system is one whose internal structure and dataflow are minimally or not affected by new or modified functionality, for example recompiling or changing the original source code might be unnecessary when changing a system’s behavior, either by the creator or other programmers. Because software systems are long lived and will be modified for new features and added functionalities demanded by users, extensibility enables developers to expand or add to the software’s capabilities and facilitates systematic reuse. Some of its approaches include facilities for allowing users’ own program routines to be inserted and the abilities to define new data types as well as to define new formatting markup tags.
Расширяемая конструкция
Расширяемый дизайн в разработке программного обеспечения предполагает признание того, что не все можно спроектировать заранее. Вместо этого предоставляется легковесный программный каркас, допускающий внесение изменений. Для сохранения возможности расширения создаются небольшие, модульные компоненты, следуя принципу разделения задач на понятные и независимые единицы, чтобы избежать типичных проблем разработки, таких как низкая связанность и высокая зависимость, и обеспечить возможность дальнейшей разработки. Принятие изменений является ключевым для расширяемого дизайна, в котором добавления будут происходить постоянно. Каждый модуль системы должен функционировать независимо от любых изменений, а идея развития через добавление новых элементов лежит в основе всей архитектуры. Расширяемый дизайн поддерживает частую переоценку приоритетов и позволяет реализовывать функциональность небольшими, инкрементными шагами по мере необходимости, что соответствует принципам гибких методологий и итеративной разработки. Расширяемость подразумевает меньшее количество и более четкие зависимости в процессе разработки, снижение связанности, повышение связанности абстракций и наличие хорошо определенных интерфейсов.
Важность
Непостоянство лежит в основе всего программного обеспечения из-за человеческого фактора, поскольку программное обеспечение представляет собой "развивающуюся систему", разрабатываемую и поддерживаемую людьми, что влечет за собой непрерывные изменения в спецификации и реализации. Компоненты программного обеспечения часто разрабатываются и внедряются различными сторонами независимо друг от друга. Адаптируемые компоненты необходимы, так как компоненты от сторонних поставщиков редко идеально подходят для конкретного сценария развертывания, особенно если учитывать пользователей, отличных от производителя. Многие программные системы и семейства программных продуктов создаются на основе базовой системы, которая имеет общую архитектуру программного обеспечения или, в некоторых случаях, значительную часть функциональности и реализации, но может быть оснащена различными компонентами, требующими расширяемой базовой системы. Создание программных систем с возможностью независимого расширения – важная задача. Система с независимым расширением позволяет не только двум разработчикам независимо создавать расширения, но и объединять эти расширения без проведения глобальной проверки целостности.
Классификация механизмов расширяемости
Существует три различных формы расширяемости программного обеспечения: расширяемость "белого ящика", расширяемость "серого ящика" и расширяемость "черного ящика", которые различаются по типу используемых артефактов и способу их изменения.
Белый ящик
В рамках этой формы расширяемости программную систему можно расширить, изменяя исходный код, что является наиболее гибким и наименее ограничивающим подходом. В зависимости от способа внесения изменений, выделяют две подформы расширяемости: расширяемость с открытым исходным кодом и расширяемость с прозрачным исходным кодом.
Открытый ящик
Изменения выполняются инвазивно в расширяемых системах с открытым доступом к коду; то есть, исходный код подвергается непосредственному редактированию. Для этого требуется доступ к исходному коду и лицензия, разрешающая его модификацию. Расширяемость с открытым доступом к коду наиболее актуальна для исправления ошибок, рефакторинга внутреннего кода или разработки следующей версии программного продукта.
Стеклянная коробка
Расширяемость "стеклянной коробки" (также называемая архитектурно-ориентированными фреймворками) позволяет расширять программную систему, используя доступный исходный код, но может не допускать его изменения. Расширения должны быть отделены от основной системы таким образом, чтобы не влиять на её работу. Одним из примеров такой расширяемости являются объектно-ориентированные прикладные фреймворки, которые обычно реализуют её посредством наследования и динамического связывания.
Черный ящик
В расширяемости "черного ящика" (также называемой фреймворками, управляемыми данными) для реализации развертываний или расширений не используются сведения о реализации системы; предоставляются только спецификации интерфейсов. Этот подход более ограничен по сравнению с различными подходами "белого ящика". Расширения "черного ящика" обычно реализуются посредством приложений системной конфигурации или использования специализированных языков сценариев для приложений, определяя интерфейсы компонентов.
Серая коробка
Расширяемость "серого ящика" – это компромисс между подходами "белого ящика" и "черного ящика", который не требует полного раскрытия исходного кода. Программистам может быть предоставлен интерфейс специализации системы, содержащий перечень всех доступных абстракций для доработки и спецификации, определяющие порядок разработки расширений.
Расширяемость против многоразовой использования
Расширяемость и повторное использование имеют множество общих важных характеристик, включая слабую связанность, модульность и способность элементов с высоким уровнем риска быть использованными при создании различных программных систем, что обусловлено тем, что программные системы часто используют общие компоненты. Повторное использование в сочетании с расширяемостью позволяет переносить технологию в другой проект с меньшими затратами времени на разработку и сопровождение, а также повышает надежность и согласованность.
Безопасность
Современные операционные системы поддерживают расширяемость посредством драйверов устройств и загружаемых модулей ядра. Многие современные приложения поддерживают расширяемость через плагины, языки расширения, апплеты и т.п. Растущая тенденция к расширяемости негативно сказывается на безопасности программного обеспечения. CGI является одним из основных способов обеспечения расширяемости веб-серверами. Некоторые считают CGI-скрипты "огромной брешью в системе безопасности".