How-to: Метапрограммирование
Часто возникает потребность в написании "похожего" кода для определенных случаев. Для этой цели существует инструкция META
, которая позволяет создавать некий шаблон кода, называемый метакодом. В нем можно использовать параметры, которые затем будут заменяться на определенные значения при использовании этого метакода. Такой подход называется метапрограммирование.
Рассмотрим задачу создания простого справочника, как описано в статье How-to: CRUD.
CLASS Book 'Книга';
name 'Наименование' = DATA ISTRING[30] (Book) IN id;
FORM book 'Книга' // форма для отображения "карточки" книги
OBJECTS b = Book PANEL
PROPERTIES(b) name
EDIT Book OBJECT b
;
FORM books 'Книги'
OBJECTS b = Book
PROPERTIES(b) READONLY name
PROPERTIES(b) NEWSESSION NEW, EDIT, DELETE
LIST Book OBJECT b
;
NAVIGATOR {
NEW books;
}
На основе этого программного кода можно создать следующий метакод:
META defineObject(class, id, shortId, caption, multiCaption)
CLASS class caption;
TABLE id(class);
name 'Наименование' = DATA ISTRING[100] (class);
FORM id caption
OBJECTS shortId = class PANEL
PROPERTIES(shortId) name
EDIT class OBJECT shortId
;
FORM id##s multiCaption
OBJECTS shortId = class
PROPERTIES(shortId) READONLY name
PROPERTIES(shortId) NEWSESSION NEW, EDIT, DELETE
LIST class OBJECT shortId
;
NAVIGATOR {
NEW id##s;
}
END
META defineObject(id, shortId, caption, multiCaption)
@defineObject(###id, id, shortId, caption, multiCaption);
END
Важно отметить, что один метакод может внутри вызывать другой.
Использование метакода осуществляется следующим образом:
@defineObject(book, b, 'Книга', 'Книги');
@defineObject(magazine, m, 'Журнал', 'Журналы');