Зачем использовать пост компилятор? - PullRequest
8 голосов
/ 01 октября 2009

Я пытаюсь понять, почему пост-компилятор, такой как PostSharp , вообще нужен?

Насколько я понимаю, он просто вставляет код в том месте, где он указан в исходном коде, так почему же разработчик не может сам писать этот код?

Я ожидаю, что кто-то скажет, что писать легче, поскольку вы можете использовать атрибуты в методах, а затем не загромождать их шаблонным кодом, но это можно сделать с помощью DI или рефлексии и легкого подхода без посткомпилятора. Я знаю, что после того, как я сказал рефлексию, слон производительности теперь войдет - но мне нет дела до относительной производительности здесь, когда абсолютная производительность для большинства сценариев тривиальна (от миллисекунды до миллисекунды).

Ответы [ 4 ]

22 голосов
/ 02 октября 2009

Давайте попробуем принять архитектурное решение по этому вопросу. Скажи, что ты архитектор (каждый хочет быть архитектором;) Вы должны предоставить архитектуру своей команде: выбранный набор библиотек, архитектурных шаблонов и шаблонов проектирования. В рамках вашего проекта вы говорите: «Мы реализуем кэширование, используя следующий шаблон проектирования:»

string key = string.Format("[{0}].MyMethod({1},{2})", this, param1, param2 );
T value;
if ( !cache.TryGetValue( key, out value ) )
{
   using ( cache.Lock(key) )
   {
      if (!cache.TryGetValue( key, out value ) )
      {
         // Do the real job here and store the value into variable 'value'.
         cache.Add( key, value );
      }
   }
}

Это правильный способ трассировки. Разработчики собираются внедрять этот шаблон тысячи раз, поэтому вы пишете хороший документ Word, рассказывающий, как вы хотите, чтобы этот шаблон был реализован. Да, документ Word. У вас есть лучшее решение? Боюсь, что нет. Классические генераторы кода не помогут. Функциональное программирование (делегаты) Это работает довольно хорошо для некоторых аспектов, но не здесь: вам нужно передать параметры метода в шаблон. Так что осталось? Опишите шаблон на естественном языке, и разработчики могут его реализовать.

Что будет?

Во-первых, какой-нибудь младший разработчик посмотрит код и скажет: «Хм. Два поиска в кэше. Какая-то бесполезная. Одного достаточно». (это не шутка - спросите команду DNN об этой проблеме). И ваши шаблоны перестают быть потокобезопасными.

Как архитектор, как вы обеспечиваете правильное применение шаблона? Модульное тестирование? Справедливо, но вы вряд ли обнаружите проблемы с многопоточностью. Обзор кода? Возможно, это решение.

Теперь, что вы решили изменить шаблон? Например, вы обнаружили ошибку в компоненте кэша и решили использовать свою собственную? Собираетесь ли вы редактировать тысячи методов? Это не просто рефакторинг: что если новый компонент имеет другую семантику?

Что если вы решите, что метод больше не будет кэшироваться? Насколько сложно будет удалить кеширующий код?

Решение AOP (независимо от структуры) имеет следующие преимущества по сравнению с простым кодом:

  1. Это уменьшает количество строк кода .
  2. Это уменьшает связь между компонентами , поэтому вам не нужно много менять, когда вы решите изменить компонент протоколирования (просто обновите аспект), поэтому улучшает емкость Ваш исходный код, чтобы справиться с новыми требованиями с течением времени .
  3. Поскольку кода меньше, вероятность ошибок для данного набора функций ниже, поэтому AOP улучшает качество вашего кода .

Итак, если вы сложите все вместе:

Аспекты снижают как затраты на разработку, так и на обслуживание программного обеспечения.

У меня 90 минут разговора на эту тему, и вы можете посмотреть его на http://vimeo.com/2116491.

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

11 голосов
/ 01 октября 2009

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

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

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

Я знаю, что кажется мне более элегантным - и более очевидным при чтении кода. Он может применяться даже в ситуациях, когда DI не не подходит (и он действительно не подходит для каждого отдельного класса в системе) и без других изменений в другом месте.

4 голосов
/ 01 октября 2009

AOP (PostSharp) предназначен для присоединения кода ко всем видам точек в вашем приложении из одного места, поэтому вам не нужно размещать его там.

Вы не можете добиться того, что PostSharp может сделать с Reflection.

Лично я не вижу в ней большой пользы в производственной системе, поскольку большинство вещей можно сделать другими, лучшими способами (ведение журнала и т. Д.).

Вы можете просмотреть другие темы по этому вопросу:

3 голосов
/ 02 июня 2010

Аспекты убирают весь код копирования и вставки и ускоряют добавление новых функций.

Я ненавижу только то, что мне приходится писать один и тот же кусок кода снова и снова. У Гаэля есть очень хороший пример относительно INotifyPropertyChanged на его веб-сайте (www.postsharp.net).

Это именно то, для чего АОП. Забудьте о технических деталях, просто реализуйте то, о чем вас просят.

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

Будущее принадлежит декларативному, функциональному стилю, объединяемому объектно-ориентированной структурой, а сквозным аспектам - аспекты.

Я думаю, единственные люди, которые не получат его в ближайшее время, - это парни, которым все еще платят за строки кода.

...