Расширяемость — это принцип разработки программного обеспечения и проектирования систем , который обеспечивает будущий рост. Расширяемость — это мера способности расширять систему и уровень усилий, необходимых для реализации расширения. Расширения могут осуществляться путем добавления новых функций или путем модификации существующих функций. Принцип предусматривает улучшения без ухудшения существующих функций системы.
Расширяемая система — это система, внутренняя структура и поток данных которой минимально или совсем не затронуты новой или измененной функциональностью, например, перекомпиляция или изменение исходного кода может быть ненужным при изменении поведения системы как создателем, так и другими программистами. [1] Поскольку программные системы являются долгоживущими и будут модифицироваться для новых функций и дополнительных функций, требуемых пользователями, расширяемость позволяет разработчикам расширять или добавлять возможности программного обеспечения и облегчает систематическое повторное использование. Некоторые из ее подходов включают средства, позволяющие вставлять собственные программные процедуры пользователей, и возможности определять новые типы данных, а также определять новые теги разметки форматирования. [2]
Расширяемый дизайн в программной инженерии заключается в том, чтобы признать, что не все можно спроектировать заранее. Вместо этого предоставляется легкая программная структура , которая позволяет вносить изменения. Небольшие команды создаются для предотвращения потери элемента расширяемости, следуя принципу разделения рабочих элементов на понятные единицы, чтобы избежать традиционных проблем разработки программного обеспечения , включая низкую связность и высокую связанность , и обеспечить непрерывную разработку. Принятие изменений имеет важное значение для расширяемого дизайна, в котором дополнения будут непрерывными. Каждый фрагмент системы будет работоспособен с любыми изменениями, и идея изменения посредством добавления является центром всего дизайна системы. Расширяемый дизайн поддерживает частое изменение приоритетов и позволяет реализовывать функциональность небольшими шагами по запросу, что является принципами, пропагандируемыми методологиями Agile и итеративной разработкой. Расширяемость налагает меньше и более чистые зависимости во время разработки, а также уменьшенную связанность и более связные абстракции, плюс четко определенные интерфейсы. [3]
Непостоянство лежит в основе всего программного обеспечения из-за человеческих феноменов, поскольку программное обеспечение является «развивающейся сущностью», которая разрабатывается и поддерживается людьми, что приводит к постоянным системным изменениям в спецификации и реализации программного обеспечения. Компоненты программного обеспечения часто разрабатываются и развертываются независимыми сторонами. Адаптируемые программные компоненты необходимы, поскольку компоненты от внешних поставщиков вряд ли впишутся в конкретный сценарий развертывания в готовом виде, принимая во внимание сторонних пользователей, отличных от производителя. Многие программные системы и программные линейки продуктов являются производными от базовой системы, которые разделяют общую программную архитектуру или иногда большие части функциональности и реализации, но, возможно, оснащены различными компонентами, которые требуют расширяемой базовой системы. [4]
Создание независимо расширяемых систем программного обеспечения является важной задачей. Независимо расширяемая система не только позволяет двум людям независимо разрабатывать расширения для системы, но и позволяет объединять два расширения без глобальной проверки целостности. [5]
Существует три различных формы расширяемости программного обеспечения: расширяемость по принципу «белого ящика», расширяемость по принципу «серого ящика» и расширяемость по принципу «черного ящика», которые основаны на том, какие артефакты и как они изменяются.
В рамках этой формы расширяемости программная система может быть расширена путем изменения исходного кода , и это наиболее гибкая и наименее ограничительная форма. Существует две подформы расширяемости, расширяемость открытого ящика и расширяемость стеклянного ящика, в зависимости от того, как применяются изменения.
Изменения выполняются инвазивно в системах с открытым исходным кодом, т. е. исходный код напрямую взламывается. Для этого требуется доступный исходный код и лицензия на исходный код, разрешающая модификацию. Расширяемость с открытым исходным кодом наиболее актуальна для исправления ошибок, внутреннего рефакторинга кода или производства следующей версии программного продукта.
Расширяемость Glass-box (также называемая архитектурно-управляемыми фреймворками) позволяет расширять программную систему с помощью доступного исходного кода, но не позволяет изменять код. Расширения должны быть отделены от исходной системы таким образом, чтобы исходная система не была затронута. Одним из примеров этой формы расширяемости являются объектно-ориентированные фреймворки приложений, которые обычно достигают расширяемости с помощью наследования и динамического связывания.
В расширяемости черного ящика (также называемой управляемыми данными фреймворками) не используются никакие подробности о реализации системы для внедрения развертываний или расширений; предоставляются только спецификации интерфейсов . Этот тип подхода более ограничен, чем различные подходы белого ящика. Расширения черного ящика обычно достигаются с помощью приложений конфигурации системы или использования специфичных для приложения языков сценариев путем определения интерфейсов компонентов.
Расширяемость серого ящика — это компромисс между подходом чистого белого ящика и чистого черного ящика, который не полагается полностью на раскрытие исходного кода. Программистам может быть предоставлен интерфейс специализации системы, в котором перечислены все доступные абстракции для уточнения и спецификации того, как должны разрабатываться расширения. [6]
Расширяемость и возможность повторного использования имеют много общих подчеркнутых свойств, включая низкую связанность, модульность и способность элементов с высоким риском конструироваться для многих различных программных систем, что мотивируется наблюдением за программными системами, часто разделяющими общие элементы. Возможность повторного использования вместе с расширяемостью позволяет переносить технологию в другой проект с меньшими затратами на разработку и обслуживание, а также с повышенной надежностью и согласованностью. [7]
Современные операционные системы поддерживают расширяемость через драйверы устройств и загружаемые модули ядра . Многие современные приложения поддерживают расширяемость через плагины , языки расширений , апплеты и т. д. Тенденция к увеличению расширяемости негативно влияет на безопасность программного обеспечения. [8]
CGI — одно из основных средств, с помощью которых веб-серверы обеспечивают расширяемость. Некоторые люди считают скрипты CGI «огромной дырой в безопасности». [9]