Редактировать:
Чтобы избежать дальнейшей путаницы: я не говорю о веб-сервисах и тому подобном. Я говорю о внутреннем структурировании приложений, а не о том, как компьютеры общаются. Речь идет о языках программирования, компиляторах и о том, как расширена парадигма императивного программирования.
Оригинал:
В области императивного программирования за последние 20 лет (или более) мы увидели две парадигмы: объектно-ориентированную (ОО) и сервисно-ориентированную (SO), то есть. на основе компонентов (CB).
Обе парадигмы расширяют парадигму императивного программирования, вводя свое собственное понятие модулей. ОО называет их объектами (и классами) и позволяет им инкапсулировать как данные (поля), так и процедуры (методы) вместе. SO, напротив, отделяет данные (записи, компоненты, ...) от кода (компоненты, сервисы).
Однако только OO имеет языки программирования, которые изначально поддерживают его парадигму: Smalltalk, C ++, Java и все другие JVM-совместимые, C # и все другие .NET-совместимые, Python и т. Д.
У ТАК нет такого родного языка. Он существует только поверх процедурных языков или ОО-языков: COM / DCOM (двоичный, C, C ++), CORBA, EJB, Spring, Guice (все Java), ...
Эти платформы SO явно страдают от отсутствия поддержки их концепций на родном языке.
- Они начинают использовать ОО-классы для представления сервисов и записей. Это приводит к проектам, в которых существует четкое различие между классами, которые имеют только методы (службы), и классами, которые имеют только поля (записи). Наследование между службами или записями затем моделируется наследованием классов. Технически, это не так строго, но в целом программистам рекомендуется делать уроки, чтобы они играли только одну из двух ролей.
- Они используют дополнительные внешние языки для представления недостающих частей: IDL, конфигурации XML, аннотации в коде Java или даже встроенный DSL, как в Guice. Это особенно необходимо, но не ограничивается этим, поскольку состав служб не является частью самого кода службы. В ОО объекты создают другие объекты, поэтому в таких средствах нет необходимости, но для SO это связано с тем, что службы не создают и не настраивают другие службы.
- Они устанавливают эффект внутренней платформы поверх OO (ранний EJB, CORBA), где программист должен написать весь код, необходимый для «управления» SO. Классы представляют собой только часть характера службы, и нужно создать множество классов, чтобы сформировать службу вместе. Все, что нужно, так как нет никакого компилятора SO, который сделал бы это для программиста. Это так же, как некоторые люди делали это в C для OO, когда не было C ++. Вы просто передаете запись, которая содержит данные объекта, в качестве первого параметра в процедуру, которая является методом. В языке OO этот параметр неявный, и компилятор создает весь код, который нам нужен для виртуальных функций и т. Д. Для SO этого явно не хватает.
- Особенно новые фреймворки широко используют AOP или самоанализ для добавления недостающих частей к языку OO. Это не приносит необходимой языковой выразительности, но позволяет избежать кода платформы котла, описанного в предыдущем пункте.
- Некоторые фреймворки используют генерацию кода для создания кода котельной пластины. Конфигурационные файлы в XML или аннотации в OO-коде являются источником информации для этого.
Не все явления, которые я упомянул выше, могут быть приписаны SO, но я надеюсь, что это ясно показывает, что существует потребность в языке SO. Поскольку эта парадигма так популярна: почему ее нет? Или, может быть, есть некоторые академические, но, по крайней мере, отрасль не использует их.