РАЗРАБОТКА ABAPP1L2

ABAP Objects: классы, интерфейсы и границы ответственности

Как в ABAP Objects разделять состояние и поведение, задавать публичный контракт интерфейсом и применять наследование без глубокой иерархии.

Ревизия 1 Общие понятия Частичное покрытие Контекст: CTX-GENERAL документальная опора: недостаточно данных
Справочный материал. Контракты данных, архитектурные решения и ограничения применения. Источники приведены в материалах, где используются внешние основания.

ABAP Objects объединяет данные и операции над ними в классах. Выбор класса сам по себе не делает модель понятной: важнее решить, кому принадлежит состояние, какие операции доступны снаружи и каким способом вызывающий код зависит от реализации.

Класс задаёт состояние и операции#

Объект - экземпляр класса со своим состоянием. Методы задают операции над этим состоянием. Разделы PUBLIC, PROTECTED и PRIVATE ограничивают видимость компонентов. Для устойчивого контракта публичные данные не должны позволять вызывающему коду обходить проверки, которые обеспечивают согласованность объекта.

В финансовом сценарии объект расчёта может принимать уже проверенные параметры и возвращать результат с описанными точностью и валютой. Он не должен скрыто загружать произвольные строки, менять продуктивные проводки или подменять правила конфигурации SAP. Источник данных, расчёт и запись результата имеют разные побочные эффекты и должны оставаться видимыми в проектировании.

Интерфейс отделяет контракт от реализации#

Интерфейс задаёт общий набор операций. Класс реализует этот набор, а вызывающая сторона может работать через ссылку на интерфейс. Разные классы способны реализовать один контракт по-разному; это основа полиморфного вызова. Интерфейсы описывают ожидаемое поведение, но сами не задают внутреннюю реализацию.

Применяйте интерфейс, когда потребителю важна способность выполнить операцию, а не конкретный класс. Например, компонент сверки может зависеть от контракта чтения строк, не зная, пришли они из локальной фикстуры или из адаптера. Пример объясняет границу зависимости и не утверждает, что здесь реализован SAP-коннектор.

Наследование моделирует специализацию#

ABAP Objects поддерживает простое наследование: у класса один непосредственный суперкласс, а у интерфейса нет реализации методов. Наследование подходит, когда подкласс действительно является более специализированной разновидностью базового типа и сохраняет его контракт.

Официальная рекомендация SAP предостерегает от глубоких иерархий: поведение нижнего класса становится сложнее предсказать, а изменение базового класса затрагивает больше потребителей. Если нужна общая точка вызова нескольких реализаций, сначала проверьте, достаточно ли интерфейса. Ограничивайте наследование явно, когда дополнительные подклассы не входят в замысел типа.

Проверяйте контракт на уровне вызова#

До написания классов сформулируйте:

  1. Какие входы уже валидированы и кто это гарантирует?
  2. Какие операции изменяют состояние или обращаются к внешней системе?
  3. Что вызывающий код может ожидать при ошибке и какие исключения распространяются дальше?
  4. Как тест заменит внешнюю зависимость и проверит результат?

В SAP-системе синтаксис, доступные API, ограничения ABAP Cloud и правила расширения зависят от версии и модели разработки. Проверяйте целевую среду отдельно. Эта статья основана на документации; классы не компилировались и не запускались в SAP runtime.

Связанные материалы#

Источники и документация

  1. SAP ABAP Objects: Object Orientation ↗
  2. SAP ABAP Keyword Documentation: Inheritance ↗
  3. SAP Application Development on AS ABAP: ABAP Objects ↗

Источники нужны для самостоятельной проверки. Примеры и интерпретации на сайте могут быть учебными упрощениями.