В вычислительной технике субъектно -ориентированное программирование — это объектно-ориентированная парадигма программного обеспечения , в которой состояние (поля) и поведение (методы) объектов не рассматриваются как присущие самим объектам, а предоставляются различными субъективными восприятиями («субъектами») объектов. Термин и концепции были впервые опубликованы в сентябре 1993 года в докладе на конференции [1], который позже был признан одним из трех наиболее влиятельных докладов, представленных на конференции между 1986 и 1996 годами. [2] Как показано в этой статье, проводится аналогия с контрастом между философскими взглядами Платона и Канта в отношении характеристик «реальных» объектов, но примененных к программным. Например, хотя мы все можем воспринимать дерево как имеющее измеримую высоту, вес, массу листьев и т. д., с точки зрения птицы дерево может также иметь меры относительной ценности для пищевых целей или гнездования, или с точки зрения налогового оценщика оно может иметь определенную налогооблагаемую стоимость в данном году. Ни дополнительная информация о состоянии птицы, ни налогового оценщика не должна рассматриваться как внутренняя по отношению к дереву, но добавляется восприятием птицы и налогового оценщика, и из анализа Канта то же самое может быть верно даже для характеристик, которые мы считаем внутренними.
Субъектно-ориентированное программирование выступает за организацию классов, описывающих объекты , в «субъекты», которые могут быть составлены для формирования более крупных субъектов. В точках доступа к полям или методам могут быть составлены вклады нескольких субъектов. Эти точки были охарактеризованы как точки соединения [3] субъектов. Например, если дерево срублено, задействованным методам может потребоваться объединить поведение субъектов птицы и налогового инспектора с поведением самого дерева. Поэтому это фундаментально взгляд на композиционную природу разработки программного обеспечения, в отличие от алгоритмической (процедурной) или скрывающей представление (объектной) природы.
Введение аспектно-ориентированного программирования в 1997 году [4] подняло вопросы о его связи с субъектно-ориентированным программированием и о разнице между субъектами и аспектами. Эти вопросы оставались без ответа в течение некоторого времени, но были рассмотрены в патенте на аспектно-ориентированное программирование, поданном в 1999 году [5] , в котором два момента выступают как характерные отличия от более раннего искусства:
В субъектно-ориентированном представлении cross-cut может быть размещен отдельно от аспекта (субъекта), и поведение не навязывается аспектом, а регулируется правилами композиции. Ретроспективный взгляд [6] также позволяет отличить аспектно-ориентированное программирование по его введению и использованию концепции pointcut, похожего на запрос, для внешнего навязывания точек соединения, используемых аспектами общими способами.
В представлении субъектно-ориентированного программирования точки соединения были намеренно ограничены доступом к полю и вызовом метода на том основании, что это были точки, в которых хорошо спроектированные фреймворки были разработаны для допуска функционального расширения. Использование внешних навязанных точек среза является важной лингвистической возможностью, но остается одной из самых спорных особенностей аспектно-ориентированного программирования. [7]
К началу тысячелетия стало ясно, что ряд исследовательских групп занимались различными технологиями, которые использовали композицию или присоединение отдельно упакованных состояний и функций для формирования объектов. [8] Чтобы выделить общую область интересов из аспектно-ориентированного программирования с его конкретными патентными определениями и подчеркнуть, что композиционная технология имеет дело не только с фазой кодирования разработки программного обеспечения, эти технологии были объединены под термином « Аспектно-ориентированная разработка программного обеспечения» [9] , а также была начата организация и серия международных конференций по этой теме. Подобно аспектно-ориентированному программированию, предметно-ориентированное программирование, композиционные фильтры, функционально-ориентированное программирование и адаптивные методы считаются подходами к аспектно-ориентированной разработке программного обеспечения.
Первоначальная формулировка предметно-ориентированного программирования намеренно представляла его как технологию упаковки – позволяющую расширить пространство функций и типов данных в любом измерении. Первые реализации были для C++, [10] и Smalltalk. [11] Эти реализации использовали концепции программных меток и правил композиции для описания объединения субъектов.
Чтобы решить проблему, что для анализа и составления программного обеспечения должна быть предоставлена лучшая основа не только с точки зрения его упаковки, но и с точки зрения различных проблем, которые решают эти пакеты, была разработана явная организация материала в терминах многомерной «матрицы», в которой проблемы связаны с программными единицами, которые их реализуют. Такая организация называется многомерным разделением проблем , и описывающая ее статья [12] была признана самой влиятельной статьей конференции ICSE 1999 года. [13]
Эта новая концепция была реализована для создания программного обеспечения Java , при этом для инструмента использовалось название Hyper/J . [14]
Композиция и концепция субъекта могут применяться к программным артефактам, которые не имеют исполняемой семантики, таким как спецификации требований или документация. Было описано исследовательское средство для Eclipse , называемое Concern Manipulation Environment (CME), [15] , в котором инструменты для запроса, анализа, моделирования [16] и композиции применяются к артефактам на любом языке или представлении с помощью соответствующих подключаемых адаптеров для управления представлением.
Преемник композиционного движка Hyper/J [17] был разработан как часть CME, который использует общий подход для нескольких элементов композиционного движка:
Оба варианта, Hyper/J и CME, доступны на alphaWorks [18] или sourceforge [19] соответственно, но ни один из них активно не поддерживается.
Метод диспетчеризации в объектно-ориентированном программировании можно рассматривать как «двумерный» в том смысле, что выполняемый код зависит как от имени метода, так и от рассматриваемого объекта. Это можно сравнить [20] с процедурным программированием, где имя процедуры разрешается напрямую или одномерно в подпрограмму, а также с субъектно-ориентированным программированием, где отправитель или субъект также имеют отношение к диспетчеризации, составляя третье измерение.