Справка и информация об аспектно-ориентированном программировании

Я полагаю, это может сработать.

library ("Rcpp")

cumsum.bounded <- cppFunction(
    'NumericVector cumsum_bounded (NumericVector x, const double lower, const double upper) {

        double acc = 0;
        NumericVector result(x.size());

        for(int i = 0; i < x.size(); i++) {
            acc += x[i];

            if (acc < lower) acc = lower;
            if (acc > upper) acc = upper;

            result[i] = acc;
        }

        return result;
    }')
17
задан this. __curious_geek 4 November 2009 в 07:11
поделиться

5 ответов

Аспектно-ориентированное программирование настолько больше, чем просто регистрируется, сообщая и так далее, как Вы будете видеть, взглянули ли Вы на веб-сайт PostSharp. Лично я не сделал такого статического переплетения IL, главным образом динамическое поколение IL для создания перехватчиков AOP и при выполнении, таким образом, я главным образом использовал его, чтобы перенести и прервать твердость от инверсии контейнеров управления.

AOP может улучшить обработку исключений, улучшить трассировку, улучшить перехват транзакции.

NHibernate, например, имеет своего рода AOP, даже при том, что это статично во время компиляции с точки зрения простых обработчиков событий; но для определенных событий в механизме можно присоединить перехватчики (иначе аспекты, при этом события являются сокращениями точки и т.д.) - я использую это для введения, с помощью предприятий МОК в мои объекты области.

Мощные платформы AOP позволяют, Вы для обобщения и еще более мощный позволяете Вам обобщать w/o наверху во времени выполнения; в принципе Вы имеете несколько различных способов сделать его :

(0). (не действительно), "препроцессор" AOP иначе обрабатывает по шаблону в C++, ifdefs и т.д.

  1. Отражение "AOP"
  2. IL-поколение во времени выполнения посредством Отражения. Испустите, требует высокого доверия. Это - путь, который взял DynamicProxy2 в проекте Замка. DynamicProxy2 довольно хорош, и большая работа вошла в него! Кроме того, платформа afaik PatternsAndPractices политики использует этот подход также, с большим количеством XML, хотя с их собственным генератором. NHibernate имеет зависимость от DynProx2.
  3. К IL-компиляции + блок. Загрузка (...) во времени выполнения посредством использования Системы. CodeDom. Компилятор, затем загружая Ваш созданный assmblies, требует высокого доверия. Компиляция с любым другим компилятором как Шиканье. Компилятор также возможен, поскольку он создает "глобальные функциональные блоки", которые можно назвать способом 'в виде сценария', но теперь мы перемещаемся из AOP немного.
  4. API Профилировщика (не спрашивают меня о них)
  5. Доверие платформе во время выполнения: расширение MarshalByRef/ContextBoundObject видит ссылку и использование инфраструктуры дистанционной работы в .NET, чтобы сделать AOP, который довольно сложен, и представьте зависимости, которые Вы не могли бы хотеть.
  6. Посткомпиляция статическое IL-переплетение, PostSharp и Моно. У Cecil есть эквивалент Отражения. Испустите, но у этого нет ошибок для виртуальных вызовов методов в конкретных подклассах (если я помню правильно) как Отражение. Испустите и с удовольствием осмотрит Ваш код, подобный блоку. ReflectionOnlyLoad и также позволит Вам производить IL-операции в тот код. Это - хороший кандидат при поиске подхода довольно низкого уровня; не требует как высокое доверие.
  7. Добавляющие точки расширения в Вашем управляемом коде для неуправляемых обратных вызовов к C/C++ через p/invoke, но это требует некоторой мысли, поскольку исключения не пересекают m/um границы памяти счастливо (скорее это испортит Ваше приложение), и если Вы не будете использовать VC ++/C# в Windows с управляемой платформой исключения, это могло seg-дать-сбой вполне плохо. Можно передать обратный вызов C и p/invoke в C от C# и вероятно передать обратные вызовы от C до C#, а также долго поскольку Вы определяете делегата в C#. Точки расширения должны были бы, вероятно, быть сделаны через статического или динамического IL-ткача + сокращения точки.

Использования в транзакциях Взглянули на Замок. Средства. AutomaticTransactionManagement. TransactionFacility для хорошего способа обработать транзакции с помощью AOP и способностей к прерыванию DynamicProxy2. Средство транзакции интегрируется с Системой. Транскатионы и Система. EnterpriseServices - Вы, используют координатора распределенных транзакций (COM-компонент) для руководящих транзакций. Кроме того, существует несколько примеров p/invoke в ядро для заботы о TxF и компоненты TxR ядра Vista (иначе Сервер 2008) , которые позволяют Вам использовать транзакции на NTFS и на реестре, таким образом, проверка, CRUD, который Вы делаете, является ACID, который также приятно интегрируется с Системой. Транзакции для создания вложенных транзакций.

Использования в инвариантной проверке можно также использовать их для дизайна контракта путем добавления некоторых атрибутов к параметрам.

public void PerformOperation([NotNull, NotEmpty] string value) {
// use string
[NotNull] return new string(' ', 5); // can return with attributes as well
}

проблемой с этим в данный момент являются издержки присоединения этих метаданных и проверки его во времени выполнения. Однако Вы могли указать проверяющий ограничение аспект только, чтобы быть примененными, когда Вы компилируете с ОТЛАДКОЙ, и затем эти метаданные - не привели бы к большому ухудшению в производительности.

, Если Вы надеетесь входить в аксиоматические доказательства, взгляните на Sing#/Spec# вместо этого, так как это более формально, и работа сделана компилятором.

Вещи знать наиболее важный момент для знания - то, что, если беспокойство, т.е. некоторая часть кода, который работает прежде или за методом, изменяет поток управления, возможно возвращая неожиданный тип, возвращаясь слишком рано или в целом не ведет себя вдоль намерений метода, Вы звонили, можно получить ошибки, которые трудно отладить.

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

Также остерегаются того, что Вы открываете возможный вектор атаки в добавлении глобальных "сокращений точки", которые, если кто-то получает доступ к, могут использоваться для перенаправления значительных частей системы.

Другие платформы , Если Вы интересуетесь получением дополнительной информации о AOP в целом, я предлагаю, чтобы Вы проверили презентации Г-айсберга Rickard Qi4J, это - очень хорошая платформа в Java для AOP (Java имеет немного отличающуюся наследованную от объекта семантику хотя, который делает крошечный бит tricker для использования в C#/F#/Nermle/Boo вообще.

AOP + AddIns, который создает Другая интересная возможность в использовании аспектно-ориентированного программирования со сгенерированными временем выполнения блоками, такими как те dynamicproxy2, то, что можно также использовать их для объектов обтекания, которые пересекают границы приложения, таким образом, упрощая создание добавления в конвейере. Я тайно надеялся, что Microsoft будет использовать это, когда они создали свою Дополнительную платформу для 3,5, но они приняли решение пойти статическим генералом кода путь, к сожалению, ведя довольно большие издержки в создании дополнений, для разработчика. Проблема состоит в том, что тип, загруженный для "больше, чем отражение" в AppDomain, не может быть разгружен снова, если полный AppDomain не разгружен, таким образом, необходимо 1) размышлять над плагином, не загружая его для наблюдения то, что это способно к тому, если Вы не позволяете, чтобы много ручных метаданных было записано или сгенерировано (и полагайте во что), и 2) некоторый объект содержать дескриптор к Вашему объекту так, чтобы это не был GCed и Вы не знаете тип (следовательно блок IContract и AddInHandle-класс) - это могло, вероятно, быть сделано хорошим способом с динамическим прокси/AOP.

Используя AOP для глобальной сборки "мусора" ... в распределенной системе, работающей на Linux/окнах на общеязыковой инфраструктуре. Статью было немного трудно скачать так , я загрузил ее на свой сервер , таким образом, я знаю, где это.

Scriptum Сообщения (Если Вы используете нестандартный язык на CLR а не IL-переплетении ДОЛЛАРА, мог бы создать нестандарты совместимый код. Особенно интересный для F#, я думаю, потому что использование много из нестандартного кода к большому преимуществу языка (кортежи говорят) - Вы могли отметить свой блок с [блок: CLSCompliant], если Вы хотите получить предупреждения времени компиляции этого.)

23
ответ дан 30 November 2019 в 12:58
поделиться

Я не могу говорить за специфические особенности.NET, но AOP и более общее представление о способности присоединить рычаги к произвольным методам, удобная техника, которая может решить некоторые в других отношениях волосатые проблемы.

Один пример дизайн контракта . Скажем, у Вас есть набор методов, на которые Вы хотите применить некоторые общие контракты. Можно добавить некоторый "совет" (термин AOP) прежде и после того, как каждый метод назовут, не имея необходимость сокращать & вставьте его в каждый метод.

При тестировании, часто полезно знать то, что продолжается в некотором внутреннем методе. Сколько раз это назвали и возможно что это возвратило. Можно добавить аспект, чтобы сделать тот контроль, не имея необходимость добавлять недовольный код тестирования к самому методу. Редактирование кода для того метода даже не могло бы быть возможным.

Просто не упускают, как реализованы аспекты. Некоторые реализации являются тщательно продуманными препроцессорами, которые могут сделать отладку Вашего кода более сложной. Другие сцепляются гладко на язык. Динамические языки обрабатывают AOP очень хорошо. Perl имеет Aspect.pm для AOP и более общего Hook:: LexWrap для выполнения рычагов метода.

2
ответ дан 30 November 2019 в 12:58
поделиться

AOP интересен мне также. Мне кажется, что вход и контроль производительности, создание отчетов очень, что AOP разработан для обработки. Для.NET Sharp Сообщения является очень хорошей платформой для AOP.

я только экспериментировал с ним немного, но это, кажется очень хорошо реализованным.

1
ответ дан 30 November 2019 в 12:58
поделиться

Если Вы собираетесь посмотреть на Сообщение Sharp, Вы могли бы загрузить Google Book Downloader from CodePlex. Я думаю, что этот проект использует его.

1
ответ дан 30 November 2019 в 12:58
поделиться

Не думайте что-то полностью различное. AOP улучшает (IMO) Ваш дизайн путем сокращения связи, увеличивая сцепление, отдельные проблемы путем предоставления объекта определенного типа 1 единственная ответственность. Если Ваш от мира .NET, PostSharp использует пользовательские атрибуты для переплетения советов. Если Вы от мира Java, можно использовать расширение Java, названное AspectJ. AOP имеет больше приложений, чем, что Вы обычно видите.

0
ответ дан 30 November 2019 в 12:58
поделиться
Другие вопросы по тегам:

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