Лекция
Привет, Вы узнаете о том , что такое компонентно-ориентированное программирование, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое компонентно-ориентированное программирование, система компонентов сущности, ecs , настоятельно рекомендую прочитать все из категории Разработка программного обеспечения и информационных систем.
Компонентная разработка программного обеспечения ( CBSE ), также называемая компонентной разработкой ( CBD ), представляет собой стиль разработки программного обеспечения, целью которого является создание программного обеспечения из слабосвязанных модульных компонентов. Он подчеркивает разделение задач между различными частями программной системы .
С момента создания первого программируемого компьютера в 1946 году программирование не сбавляло обороты. Требования к программам росли, а вместе с ними появлялись все более мощные языки и более революционные подходы программирования. Так и сейчас
компонентно-ориентированное программирование начинает плавно, но уверенно вытеснять объектно-ориентированное. Необходимо определить объективные причины, по которым компонентно-ориентированное программирование в наше время набирает. все большую популярность.
Сейчас очень остро стоят задачи быстрой и слаженной разработки крупных и сложных продуктов. Любая программа должна иметь гибкую структуру и способность к исправлению и дополнению функциональности.
минимальные затраты ресурсов. Даже малейшая ошибка в вопросе выбора структуры или подхода программирования может привести к роковым последствиям при попытке исправить, изменить или добавить функциональность. Объектно-ориентированное программирование известно практически каждому программисту. Согласно этому подходу, программа – это совокупность объектов, содержащих набор базовых характеристик своих классов и взаимодействующих между собой. Вместе с этим Подход предлагает четыре базовые концепции: инкапсуляцию, наследование, полиморфизм и абстракцию. Это, безусловно,
отличные принципы с тысячами возможных реализаций
Компонентно-ориентированное программирование (КОП) рассматривает программу как набор инкапсулированных компонентов,которые взаимодействуют с другими компонентами через контейнер. Каждый компонент является отдельной подпрограммой, котораяописывает только одну функциональность и предоставляет интерфейс доступа к себе. Контейнеры компонентов реализуютвзаимодействие компонентов и их функциональность. При этом компонентно-ориентированное программирование практическиисключает использование наследования и вносит новые концепции: интроспективность (способность само описания),
модульность, персистентность (способность сохранять и восстанавливать свое определенное состояние) и способность к многократномуиспользование одного и того же компонента .
При разработке крупных программных продуктов со сложной архитектурой у объектно-ориентированного программированияпоявляется ряд проблем. Компонентно-ориентированное программирование позволяет исправить эти недостатки ипривносит большую функциональность.
Взаимозависимость объектов и неувязка хрупкого базового класса. Так как КОП оперирует только независимыми между
собой компонентами и контейнерами, содержащими их экземпляры, отпадает необходимость в использованииподражание .
Недостаточный контроль информации. Опасность утечек памяти. Компоненты являются частью своихконтейнеров, поэтому при деструкции контейнера высвобождается память всех его компонентов .В зависимости от языка программирования и платформы. Согласно идеологии КОП, каждый компонент – это отдельная независимаяфункциональность, а значит, ее запросто можно выделить в отдельный модуль программы, который будет иметь определенный интерфейс.
доступа, но может быть скомпилирован на любом языке и платформе .Трудность организации архитектуры. Вся структура упрощается в набор контейнеров, к которым можно легко
подключать необходимые компоненты из доступного списка, создавая необходимую функциональность .Сложность контроля жизненного цикла объекта. Каждый компонент обладает способностью сохранять и восстанавливатьсобственное состояние и выгружать его .
В соответствии с компонентно-ориентированным программированием программа измельчена на большую совокупность модулей,что позволяет быстро и легко исправлять, видоизменять или дополнять функциональность .Итак, компонентно-ориентированное программирование исправляет большинство недостатков предшественника и привносит
много преимуществ, таких как легкая структурированность, исправление и дополняемость, что особенно важно в разработке
масштабных программных продуктов.
Отдельный компонент программного обеспечения — это пакет программного обеспечения , веб-служба , веб-ресурс или модуль , который инкапсулирует набор связанных функций или данных.
Компоненты взаимодействуют друг с другом через интерфейсы . Каждый компонент предоставляет интерфейс (называемый предоставленным интерфейсом ), через который его могут использовать другие компоненты. Когда компонент использует интерфейс другого компонента, этот интерфейс называется используемым интерфейсом.
На иллюстрациях UML в этой статье предоставленные интерфейсы представлены символами леденцов, а используемые интерфейсы представлены символами открытых сокетов.
Простой пример нескольких программных компонентов, изображенный в гипотетической системе бронирования отпусков, представленной в UML 2.0.
Компоненты должны быть взаимозаменяемыми , то есть компонент должен быть заменен другим, имеющим те же интерфейсы, без нарушения остальной части системы.
Компоненты должны быть многоразовыми .
Компонентное тестирование юзабилити следует рассматривать, когда компоненты программного обеспечения напрямую взаимодействуют с пользователями.
Компоненты должны быть:
Идея о том, что программное обеспечение должно быть компонентным, то есть создаваться из готовых компонентов , впервые стала заметной в выступлении Дугласа Макилроя на конференции НАТО по разработке программного обеспечения в Гармише , Германия , в 1968 году под названием « Компоненты массового производства программного обеспечения» . Целью конференции было противодействовать так называемому программному кризису . Последующее включение Макилроем каналов и фильтров в операционную систему Unix стало первой реализацией инфраструктуры для этой идеи.
Брэд Кокс из Stepstone во многом определил современную концепцию программного компонента Он назвал их программными ИС и намеревался создать инфраструктуру и рынок для этих компонентов, изобретя язык программирования Objective-C . (Он резюмирует эту точку зрения в своей книге « Объектно-ориентированное программирование – эволюционный подход», 1986 г.)
Компоненты программного обеспечения используются в двух разных контекстах и двух видах: i) использование компонентов как частей для создания одного исполняемого файла или ii) каждый исполняемый файл рассматривается как компонент в распределенной среде, где компоненты взаимодействуют друг с другом через Интернет или интранет. протоколы связи для IPC (межпроцессные коммуникации). Вышеупомянутое принадлежит к первому виду, а нижнее — к более позднему.
В начале 1990-х годов IBM пошла по этому пути, разработав свою системную объектную модель (SOM). В ответ Microsoft проложила путь к фактическому развертыванию компонентного программного обеспечения с помощью связывания и внедрения объектов (OLE) и объектной модели компонентов (COM). По состоянию на 2010 год существует множество успешных моделей программных компонентов.
Компьютер, на котором работает несколько программных компонентов, часто называют сервером приложений . Такое сочетание серверов приложений и программных компонентов обычно называют распределенными вычислениями . Об этом говорит сайт https://intellect.icu . Типичное реальное применение этого — например, в финансовых приложениях или бизнес-программах.
Модель компонента — это спецификация свойств компонента.
Примерами компонентных моделей являются: модель Enterprise JavaBeans (EJB), модель компонентных объектов (COM), модель .NET , модель компонентов X-MAN, и модель компонентов общей архитектуры брокера объектных запросов (CORBA).
System.ComponentModel
имен в Microsoft .NETСистема сущностных компонентов ( ECS ) — это архитектурный шаблон программного обеспечения , который чаще всего используется при разработке видеоигр для представления объектов игрового мира. ECS включает в себя объекты , состоящие из компонентов данных, и системы , которые работают с компонентами объектов.
ECS следует принципу композиции, а не наследования , что означает, что каждая сущность определяется не иерархией типов, а связанными с ней компонентами. Системы действуют глобально по всем объектам, имеющим необходимые компоненты.
Однако из-за двусмысленности английского языка общепринятая интерпретация названия заключается в том, что ECS — это система, состоящая из объектов и компонентов. Например, в выступлении на GDC 2013 года Скотт Билас сравнивает объектную систему C++ и свою новую систему пользовательских компонентов. Это согласуется с традиционным использованием системного термина в общей системной инженерии с использованием объектной системы Common Lisp и системы типов в качестве примеров.
ECS сочетает в себе ортогональные, устоявшиеся идеи общей информатики и теории языков программирования . Например, компоненты можно рассматривать как идиому примеси в различных языках программирования. Компоненты представляют собой особый случай в рамках общего подхода делегирования (объектно-ориентированного программирования) и метаобъектного протокола . То есть любая полная компонентная объектная система может быть выражена с помощью шаблонов и модели эмпатии в рамках видения объектно-ориентированного программирования Орландского договора .
Сущность : Сущность представляет собой объект общего назначения. Например, в контексте игрового движка каждый грубый игровой объект представлен как сущность. Обычно он состоит только из уникального идентификатора. Реализации обычно используют для этого простое целое число.
Компонент : компонент помечает объект как обладающий определенным аспектом и содержит данные, необходимые для моделирования этого аспекта. Например, каждый игровой объект, который может получить урон, может иметь компонент «Здоровье», связанный с его сущностью. Реализации обычно используют структуры , классы или ассоциативные массивы .
Система : Система — это процесс, который воздействует на все объекты с помощью желаемых компонентов. Например, физическая система может запрашивать объекты, имеющие компоненты массы, скорости и положения, и перебирать результаты, выполняя физические вычисления для наборов компонентов для каждого объекта.
Поведение объекта может быть изменено во время выполнения системами, которые добавляют, удаляют или изменяют компоненты. Это устраняет проблемы неоднозначности глубоких и широких иерархий наследования, часто встречающихся в методах объектно-ориентированного программирования , которые трудно понять, поддерживать и расширять. Общие подходы ECS хорошо совместимы с методами проектирования, ориентированными на данные , и часто сочетаются с ними . Данные для всех экземпляров компонента обычно хранятся вместе в физической памяти, что обеспечивает эффективный доступ к памяти для систем, которые работают с множеством объектов.
Простой макет системы Entity Component.
пример простой реализации Entity-Component-System (ECS) на JacvaScript:
// Классы компонентов class PositionComponent { constructor(x, y) { this.x = x; this.y = y; } } class RenderComponent { render() { console.log("Rendering entity..."); } } // Класс Сущности class Entity { constructor(id) { this.id = id; this.components = {}; } addComponent(component) { this.components[component.constructor.name] = component; } removeComponent(componentName) { delete this.components[componentName]; } } // Класс Системы class RenderingSystem { renderEntity(entity) { if (entity.components['RenderComponent']) { const renderComponent = entity.components['RenderComponent']; renderComponent.render(); } } } // Пример использования const entity = new Entity(1); entity.addComponent(new PositionComponent(10, 20)); entity.addComponent(new RenderComponent()); const system = new RenderingSystem(); system.renderEntity(entity);
Этот пример демонстрирует основные концепции ECS:
В данном примере система RenderingSystem проверяет, есть ли у сущности компонент отрисовки (RenderComponent), и если да, то выполняет его метод render().
В Unity инспектор (Inspector) - это интерфейсное окно, которое позволяет вам просматривать и редактировать свойства и компоненты объектов в вашей сцене или проекте. Он является важной частью редактора Unity и предоставляет удобный способ настройки объектов и компонентов без необходимости изменения кода.
С точки зрения компонентно-ориентированного программирования (Component-Oriented Programming) и Entity Component System (ECS) в Unity, инспектор играет роль визуализации и редактирования компонентов, которые составляют сущности в вашей игре.
В ECS парадигме в Unity:
Инспектор в Unity позволяет вам просматривать и изменять компоненты, присоединенные к сущностям, что позволяет вам динамически настраивать поведение и параметры ваших объектов в редакторе Unity без изменения кода. Это удобно при создании и редактировании игровых объектов и может существенно ускорить процесс разработки.
В 1998 году Thief: The Dark Project впервые представил ECS. Позже этот движок использовался в его продолжении, а также в System Shock 2 .
В 2007 году команда, работавшая над Operation Flashpoint: Dragon Rising, экспериментировала с проектами ECS, в том числе вдохновленными Bilas/ Dungeon Siege , а Адам Мартин позже написал подробный отчет о дизайне ECS, включая определения базовой терминологии и концепций. ] В частности, работа Мартина популяризировала идеи систем как первоклассных элементов, сущностей как идентификаторов, компонентов как необработанных данных и кода, хранящегося в системах, а не в компонентах или сущностях.
В 2015 году Apple Inc. представила GameplayKit — инфраструктуру API для разработки игр для iOS , macOS и tvOS , включающую реализацию ECS.
В августе 2018 года Сандер Мертенс создал популярную платформу ECS flecs .
В октябре 2018 года компания Unity выпустила демо-версию мегаполиса, в которой использовался технологический стек, построенный на ECS. В нем было 100 000 аудиоисточников — по одному на каждую машину, неоновую вывеску и т. д. — создавая большой и сложный звуковой ландшафт.
Структура данных разных ECS может различаться, а также определение компонентов, то, как они связаны с сущностями и как системы получают доступ к компонентам сущностей.
Популярная серия блогов Адама Мартина определяет то, что он считает архитектурой Entity Component System:
Сущность состоит только из идентификатора для доступа к компонентам. Обычной практикой является использование уникального идентификатора для каждого объекта. Это не является обязательным требованием, но имеет ряд преимуществ:
Некоторых из этих преимуществ можно также достичь с помощью интеллектуальных указателей .
Внутри компонентов нет игрового кода (поведения). Компоненты не обязательно должны быть физически расположены вместе с объектом, но их должно быть легко найти и получить к ним доступ с помощью объекта.
«Каждая система работает непрерывно (как если бы каждая система имела свой собственный частный поток) и выполняет глобальные действия над каждой сущностью, которая имеет компонент или компоненты, соответствующие запросу этой системы».
В макете Unity есть таблицы, каждая из которых содержит столбцы компонентов. В этой системе тип объекта основан на компонентах, которые он содержит. Для каждого типа сущности существует таблица (называемая архетипом ), содержащая столбцы компонентов, соответствующих компонентам, используемым в сущности. Чтобы получить доступ к определенной сущности, необходимо найти правильный архетип (таблицу) и индекс в каждом столбце, чтобы получить каждый соответствующий компонент для этой сущности.
Apparatus — это сторонняя реализация ECS для Unreal Engine , которая привнесла некоторые дополнительные функции в общую парадигму ECS. Одной из таких функций является поддержка иерархии типов компонентов. Каждый компонент может иметь базовый тип компонента (или базовый класс), как в ООП . Затем система может выполнить запрос к базовому классу и получить соответствие всех его потомков в результирующем выборе сущностей. Это может быть очень полезно для реализации некоторой общей логики в наборе различных компонентов и добавляет дополнительное измерение в парадигму.
Flecs — это быстрая и легкая реализация ECS для C и C++, которая позволяет создавать игры и симуляции с миллионами объектов.
Обычный способ передачи данных между системами — хранить данные в компонентах, а затем обеспечивать последовательный доступ каждой системы к компоненту. Например, положение объекта может регулярно обновляться. Эта позиция затем используется другими системами. Если разных нечастых событий много, в одном или нескольких компонентах понадобится много флагов. В этом случае системам придется отслеживать эти флаги на каждой итерации, что может оказаться неэффективным. Решением может быть использование шаблона наблюдателя . Все системы, зависящие от события, подписываются на него. Таким образом, действие события будет выполнено только один раз, когда оно произойдет, и никакой опрос не требуется.
В архитектуре ECS нет проблем с проблемами зависимостей, обычно встречающимися в объектно-ориентированном программировании , поскольку компоненты представляют собой простые сегменты данных и не имеют зависимостей. Каждая система обычно запрашивает набор компонентов, которые должен иметь объект, чтобы система могла с ним работать. Например, система рендеринга может зарегистрировать модель, преобразование и рисуемые компоненты. При запуске система будет выполнять свою логику на любом объекте, имеющем все эти компоненты. Другие сущности просто пропускаются, и нет необходимости в сложных деревьях зависимостей. Однако это может быть местом, где скрываются ошибки, поскольку распространение значений из одной системы в другую через компоненты может оказаться затруднительным для отладки. ECS может использоваться там, где необходимо привязать несвязанные данные к заданному сроку службы.
Архитектура ECS использует композицию, а не деревья наследования. Сущность обычно состоит из идентификатора и списка прикрепленных к нему компонентов. Любой игровой объект можно создать, добавив к сущности правильные компоненты. Это позволяет разработчику легко добавлять функции одного объекта к другому без каких-либо проблем с зависимостями. Например, к сущности игрока может быть добавлен компонент пули , и тогда он будет соответствовать требованиям, которым должна управлять некоторая система BulletHandler , что может привести к тому, что игрок нанесет ущерб вещам, наткнувшись на них.
Преимущества использования ECS для хранения состояния игры были провозглашены многими разработчиками игр, такими как Адам Мартин. Хорошим примером являются сообщения в блоге Ричарда Лорда, в которых он обсуждает преимущества и то, почему системы хранения игровых данных, разработанные ECS, так полезны. [10]
Хотя архитектура ECS в основном используется при разработке видеоигр, она может быть полезна и в других областях.
Исследование, описанное в статье про компонентно-ориентированное программирование, подчеркивает ее значимость в современном мире. Надеюсь, что теперь ты понял что такое компонентно-ориентированное программирование, система компонентов сущности, ecs и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Разработка программного обеспечения и информационных систем
Комментарии
Оставить комментарий
Разработка программного обеспечения и информационных систем
Термины: Разработка программного обеспечения и информационных систем