Макрокоманди або макро - Іван Болховітінов
По-перше. Слово.
Немає такого слова "макрос". Є слово "макро", що є калькою з англійського слова "macro". Англійське слово "macros" - це множина від "macro", а за законами української мови слово "макро" не має множини, вірніше воно таке ж (як "пальто" і "метро"). Правильніше вживати слово “макрокоманда”. Хоча можна змиритися з цією даністю, адже в українській вже багато таких прикладів прижилося, що наше однина походить від множинного англійського числа, а потім наша українська ще й додатково окремо йому власну множину додає:
Rail – Rails – Рейки – Рейки
По-друге. Історія.
Під “макросами” зазвичай розуміються макро із пакета MS Office. Однак це не зовсім правильно. Колись у минулому столітті це справді були макрокоманди, проте згодом вони трансформувалися у підпрограми VBA (Visual Basic for Applications) із гарячими клавішами. І останні до макрокоманд вже не відносяться: вивіска залишилася, але працює все зовсім інакше.
По-третє. Програмування.
У програмуванні теж є поняття про макрокоманди. Це спеціальна форма організації програмного коду. Так склалося, що це сучасні мови програмування не підтримують концепцію макрокоманд. Почасти тому, що мають більш високорівневі парадигми (підпрограми, методи, функції), а частково і тому, що такий код може вважатися "небезпечним".
В основному, макрокоманди існують в асемблерних мовах, так само як і оператори безумовного переходу (стиль 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; як ztmp_&1; occurs 0 with header line. select * з ztmp_&1 до 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[].
Для даного макро працездатним є виклик у стилі:
І непрацездатним буде виклик:
А ось це вже зовсім дивний компот:
data: mytable(30) type C.
Дурниця ситуації в тому, що в цих рядках слово mytable при виклику макросу не має жодного відношення до змінної mytable.Ніякого!
По-п'яте. Життя.
Моя думка та рекомендації такі:
- Використовуйте макро тільки тоді, коли використання процедурногопідходу або ОВП виходить набагато громіздкішим і менш прозорим
- Не використовуйте макро замість підпрограм чи методів
- Використовуйте в тілі макро лише невеликі шматки тексту (1-10 рядків)
- Код макро повинен бути абсолютно прозорим та надійним
- Використовуйте макро тільки при великому постійному використанні