Макрокоманди або макро - Іван Болховітінов

По-перше. Слово.

Немає такого слова "макрос". Є слово "макро", що є калькою з англійського слова "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 рядків)
  • Код макро повинен бути абсолютно прозорим та надійним
  • Використовуйте макро тільки при великому постійному використанні