Во-первых. Слово.
Нет такого слова “макрос”. Есть слово “макро”, которое является калькой с английского слова “macro”. Англиское слово “macros” – это множественное число от “macro”, а по законам русского языка слово “макро” не имеет множественного числа, вернее оно такое же (как “пальто” и “метро”). Более правильно употреблять слово “макрокоманда”.
Хотя можно смириться с этой данностью, ведь в русском уже много таких примеров прижилось, что наше единственное число происходит от множественного английского числа, а потом наш русский ещё и дополнительно отдельно ему собственное множественное добавляет:
Rail – Rails – Рельс – Рельсы
Во-вторых. История.
Под “макросами” обычно понимаются макро из пакета MS Office. Однако это не совсем верно. Когда-то в прошлом веке это действительно были макрокоманды, однако со временем они трансформировались в подпрограммки VBA (Visual Basic for Applications) с горячими клавишами. И последние к макрокомандам уже не относятся: вывеска осталась, но работает всё совсем иначе.
Настоящие макрокоманды – это гораздо более старинный способ сокращения рутинной работы, когда вы нажимаете одну горячую клавишу, которая вызывает последовательное нажатие других горячих клавиш. Условный пример: на горячую клавишу Ctrl+W вешается последовательность ( Ctrl+Вправо, Ctrl+Shift+Влево, Del ), которая вызывает удаление текущего слова в текстовом редакторе.
Именно такие макрокоманды сейчас есть во многих навороченных текстовых редакторах.
В-третьих. Программирование.
В программировании тоже есть понятие о макрокомандах. Это особая форма организации программного кода. Так сложилось, что все современные языки программирования не поддерживают концепцию макрокоманд. Отчасти потому, что имеют более высокоуровневые парадигмы (подпрограммы, методы, функции), а отчасти и потому, что такой код может быть сочтён “небезопасным”.
В-основном, макрокоманды существуют в ассемблерных языках, также как и операторы безусловного перехода (стиль GOTO).
Принцип следующий: вы определяете последовательность команд и присваиваете ей имя, и когда имя встречается данное имя в тексте программы на ассемблере, то сначала “в уме” имя заменяется на последовательность команд, и лишь потом компилируется машинный код.
Файл “на руках”:
macro swap_ab = ( dx = ax; ax = bx; bx = dx; );
ax = 1; bx = 2; swap_ab;
ax = 3; bx = 4; swap_ab;
Файл “в уме”:
ax = 1; bx = 2; dx = ax; ax = bx; bx = dx;
ax = 3; bx = 4; dx = ax; ax = bx; bx = dx;
Просто с первым файлом удобнее работать программисту.
Однако, макро не имеет никакого отношения к процедурному программированию, которое идеологически идёт из реальных конструкций ассемблера JUMP/GOTO.
Макро – это только замена текста со всеми вытекающими последствиями.
В-четвёртых. ABAP.
В языке ABAP макросы абсолютно реальны, и работают по вышеописанной схеме.
Иногда их использовать действительно удобно , хотя на практике есть определённые сложности (например: отладка или журнал использования). И эти сложности происходят из-за разрыва между файлом “на руках” и “файлом в уме”, а не из-а того что “макросы плохие”.
Занятный пример:
define show_alv.
data gt_ztmp_&1 like ztmp_&1 occurs 0 with header line.
select * from ztmp_&1 into table gt_ztmp_&1 where bukrs = p_bukrs.call method cl_salv_table=>factory
importing r_salv_table = gr_table
changing t_table = gt_ztmp_&1[].gr_table->display( ).
end-of-definition.
Для данного макро работоспособным является вызов в стиле:
show_alv mytable.
И неработоспособным будет вызов:
show_alv ‘mytable’.
А вот это уже совсем странный компот:
data: mytable(30) type C.
mytable = ‘myanothertable’.
show_alv mytable.
Глупость ситуации в том, что в этих строках слово mytable при вызове макроса не имеет никакого отношения к переменной mytable. Никакого!
В-пятых. Жизнь.
Моё мнение и рекомендации следующие:
- Используйте макро только тогда, когда использование процедурного подхода или ООП получается гораздо более громоздким и менее прозрачным
- Не используйте макро вместо подпрограмм или методов
- Используйте в теле макро только небольшие куски текста (1-10 строк)
- Код макро должен быть абсолютно прозрачным и надёжным
- Используйте макро только при большом постоянном использовании
А напоследок я скажу.
TRMAC