Простая иллюстрация подхода при передаче параметра  в виде ссылки:

DATA lt_messages TYPE bapiret2_tab.

DATA(lo_messages) = NEW zcl_message_collection( ir_messages = REF #( lt_messages ) ).

if ...
  MESSAGE e011(zca_test) 
    INTO lo_messages->new_message
    WITH '#1V1'
         '#1V2'.
  lo_messages->add( ).
  RETURN.
endif.

if ...
  MESSAGE w012(zca_test) INTO lo_messages->new_message.
  lo_messages->add( ).
endif. 

if ...
  MESSAGE i013(zca_test) INTO lo_messages->new_message.
  lo_messages->add( ).
endif.

Чего можно таким добиться?

Например: это маленькое ухищрение позволяет однократно указывать обрабатываемую таблицу. Это делает код чуть менее многословным. Альтернатива:

APPEND lo_messages->convert_sy2bapi( ) INTO lt_messages.
...или...
lo_messages->add( CHANGING messages = lt_messages).

Насколько это красиво? Чисто и просто… Впрочем, есть тут некоторая неочевидность. Мы запускаем метод в классе без указния локальной переменной в качестве параметра, а эта локальная переменная меняется.

Если собирать ошибки внутри вспомогательного класса, а потом их получать вместе, то становится сложнее прекратить обработку немедленно. Выглядит как-то корявенько:

DATA(lo_messages) = NEW zcl_message_collection( ).

IF ...
  MESSAGE e011(zca_test) INTO lo_messages->new_message.
  lo_messages->add( ).
  lt_messages = lo_messages->get( ).
  RETURN.
ENDIF.

IF ...
  MESSAGE w012(zca_test) INTO lo_messages->new_message.
  lo_messages->add( ).
ENDIF.

"finally
lt_messages = lo_messages->get( ).

Пример реализации:

(more…)

Я слышал, что в интернетах есть места, где гендерный классификатор насчитывает несколько десятков записей. И вот наконец, в одной анкете я сам столкнулся с чем-то подобным.

В новой интерпретации это не справочник, а просто поле свободного ввода:

И пусть никто не уйдёт обиженный!