Поддержка AOP в Delphi

ОБНОВЛЕНИЕ: РЕШЕНИЕ

exports.notificationMake =
functions.database.ref('/dhabba_orders/{user_uid}').onWrite((change, context) => {
    let userId = context.params.user_uid;
    let orderStatus = context.params.order_status;

    Promise.all([userId, orderStatus]).then(others => {
        console.log(userId);  
        console.log(orderStatus);
        const payload = {
        notification: {
            title: `Order Accepted!`
        }
    };
    admin.messaging().sendToDevice(userId, payload);
    return 0;
    }).catch(error => {
        console.log(error);
    });
    return 0;

});

12
задан Johan - reinstate Monica 10 July 2013 в 17:37
поделиться

2 ответа

ClassHelpers в более поздних версиях Delphi позволяют некоторый очень ограниченный уровень поведения типа AOP. Можно использовать ClassHelpers для введения поведения в другие классы, не убывая от них. Это позволяет переопределять существующие методы и затем дополнительно называть тот существующий метод.

Ограничение - Вы, должен объявить ClassHelper для определенного класса и этого потомки. Дополнительно класс может только иметь один ClassHelper.

Они подобны Дополнительным методам в C#.

4
ответ дан 2 December 2019 в 18:22
поделиться

AOP зависит от двух вещей:

  • Способность вводить дополнительный код в существующую единицу кода
  • Механизм для определения условий, в которых код следует вводить.

Это обычно называется переплетением кода. Это специализация в рамках более широкого исследования трансформации программ.

У JIT-скомпилированных языков больше возможностей для реализации переплетения кода, чем у статически скомпилированных программ, потому что больше информации сохраняется в байт-коде / IL. Они также поддерживают отражение, которое дает возможность манипулировать кодом во время выполнения.

Delphi.NET и Prism имеют такой же доступ к этим возможностям, что и любой другой язык .NET.

Мне известно о двух фреймворках АОП для Delphi Win32. Первый - это MeAOP , о котором уже упоминалось. Второй - Infra . Оба проекта используют аналогичный подход к АОП. Они используют комбинацию RTTI и умных манипуляций с указателями для перехвата вызовов методов, чтобы вы могли запускать дополнительный код до или после вызова метода. Вы определяете сквозную функцию как подкласс класса АОП фреймворка. Вы регистрируете методы, которые хотите перехватить, передавая имя метода в качестве строкового аргумента в структуру AOP.

Обе структуры все еще активно развиваются и на самом деле больше по охвату, чем просто АОП.К сожалению, документация несколько скудна (и в случае Infra в основном на португальском)

В другом проекте еще в 2004 году была предпринята попытка использования АОП через переплетение исходного кода, но с некоторым успехом. По сути, они создали средство преобразования аспектов поверх универсального инструмента преобразования программ, называемого DMS, и использовали его для вставки кода в исходные файлы delphi перед компиляцией. На их аспектно-ориентированный язык в первую очередь повлиял AspectJ.

http://www.gray-area.org/Research/GenAWeave/ содержит ссылки на исходный документ и презентацию, а также некоторые видеоролики о процессе преобразования.

Также можно использовать инструментарий кода времени выполнения, чтобы выполнить это. Это метод, используемый некоторыми профилировщиками для вставки счетчиков и трассировок стека в работающий код без изменения исходного кода. Аналогичный метод можно использовать для внедрения перекрестных проблем в статически скомпилированный исполняемый файл. Хорошим примером этого является проект PinTool .

12
ответ дан 2 December 2019 в 18:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: