АОП Следует ли мне отучиться от ООП?

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

  • Вкратце, что такое аспектно-ориентированное программирование?
  • Это просто лучше, чем объектно-ориентированное программирование? Следует ли мне отучиться от ООП?
  • Если нет, как мне узнать, когда использовать тот или иной? Каковы основные различия между ними?
  • Могу ли я преобразовать одно в другое?

Я всегда был ОО и хочу знать, нужно ли мне совершить измену.

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


person Philippe Carriere    schedule 24.08.2009    source источник
comment
Молоток лучше отвертки? Зависит от того, что вы пытаетесь построить.   -  person Ed S.    schedule 25.08.2009
comment
Я буду строить что-то большое, из множества деталей. Я не (и не могу) вдаваться в подробности. Но мне очень хочется узнать больше об АОП в целом.   -  person Philippe Carriere    schedule 25.08.2009
comment
Вы тоже просматривали гугл? lmgtfy.com/?q=AOP+vs+OOP   -  person ChssPly76    schedule 25.08.2009
comment
Также см. Этот вопрос: stackoverflow .com / questions / 232884 /.   -  person ChssPly76    schedule 25.08.2009
comment
АОП особенно хорошо подходит для крупных проектов с большим количеством компонентов. Это также полезно (по несколько другим причинам) в небольших проектах. Мы активно используем ООП и АОП для крупной платформы финансовых услуг и обнаруживаем, что если вы хорошо понимаете, когда использовать АОП (а когда нет), это значительно упрощает создание и управление большими системами.   -  person Eric J.    schedule 25.08.2009
comment
@Eric J. Пожалуйста, опубликуйте свой ответ как ответ, а не как комментарий.   -  person S.Lott    schedule 25.08.2009
comment
Это просто лучше, чем объектно-ориентированное программирование? Откуда у вас эта идея? Не могли бы вы обновить свой вопрос ссылкой или ссылкой на место, где это подразумевалось (или указывалось). Это странное понятие, и я хотел бы знать, откуда оно взялось.   -  person S.Lott    schedule 25.08.2009
comment
Ну, когда я изучал объектно-ориентированное программирование, дверь открыли процедурному программированию. Нам сказали, что объектно-ориентированный подход лучше процедурного (возможно, с немного радикальной точки зрения). Несколько лет спустя был анонсирован АОП. Еще несколько лет, и об этом заговорили. А теперь я хочу знать, где стоять.   -  person Philippe Carriere    schedule 25.08.2009


Ответы (5)


Что в двух словах представляет собой аспектно-ориентированное программирование?

Короче говоря, АОП - это способность незаметно внедрять действия в типичный поток другой программы. Он позволяет фиксировать экземпляры классов, вызовы методов, назначения и т. Д.

Это лучше, чем объектно-ориентированное программирование? Следует ли мне отучиться от ООП?

Нет и нет. Он работает вместе с любой поддерживающей его средой программирования. (См. Выше).

Если нет, как мне узнать, когда использовать тот или иной? Каковы основные различия между ними?

Вы используете АОП, как правило, когда хотите реализовать какие-то действия над сотнями классов, не манипулируя самими классами. Типичными примерами являются безопасность (авторизация права на вызов данного метода / класса) или ведение журнала. Однако, по моему опыту, я не использую его для этого. (Честно говоря, вообще не использую).

Как указано выше, на самом деле основной разницы не существует, поскольку они несопоставимы. Но, скажем, вы хотите реализовать ведение журнала "в обычном режиме", вы просто вызываете регистратор в соответствующих точках:

log.write("hello");

Но с помощью АОП вы можете создать «аспект», который присоединяется к каждому вызову метода, и регистрировать «вызванный метод b». Дело в том, что в АОП вы подходите скорее как «дробовик»: вы присоединяетесь ко всему или только к небольшому подмножеству. Как правило, лучше добавлять ведение журнала вручную.

Могу ли я преобразовать одно в другое?

Не совсем актуально, см. Другие ответы. Опять же, что касается безопасности, вы можете переключиться на модель АОП с типичной модели ООП this.IsAllowed () на что-то вроде if (callMethod.HasAttribute (foo)) {allowed = true; }

Надеюсь, эти ответы будут полезны. Дайте мне знать, если вы хотите, чтобы я расширился дальше.

person Noon Silk    schedule 25.08.2009
comment
Почему бы не выполнить рефакторинг до AOP? Мне действительно нравится ваш ответ, я думаю, что ваш ответ является исключительным, поскольку он довольно краток, учитывая четыре вопроса, и очень ясен. - person James Black; 25.08.2009
comment
Если у вас уже есть хорошая модель ООП для реализации чего-либо, вам обычно не нужно менять ее на АОП, потому что она уже будет реализована! :) Конечно, вы можете поменять свой существующий механизм безопасности на AOP, я полагаю (как я пытался обрисовать). - person Noon Silk; 25.08.2009
comment
Я еще не полностью выпил AOP Kool-Aid, но вы не можете делать такие утверждения, как ручное добавление журналов, как правило, лучше без каких-либо резервных копий :) Я обнаружил, что журналы AOP намного чище, но я м не работает над огромным материалом корпоративного уровня. - person cflewis; 25.08.2009
comment
Льюишам: Я попытался объяснить, почему. Причина в том, что с AOP-журналированием вы получите инструкции об «общих» вещах, таких как вызовы методов, приращения и т. Д. Если вы добавляете ведение журнала вручную, вы можете записывать релевантную информацию, отображать только интересующие переменные и так далее. Ведение журнала AOP может быть полезным и иметь применение, но выполнение его вручную всегда поможет вам предоставить те мелкие детали, которые имеют решающее значение для отладки :) - person Noon Silk; 25.08.2009
comment
Ах, я понимаю, что вы имеете в виду. Я использую ручное ведение журнала АОП, как вы это называете, но я делаю это для того, чтобы вычистить журнал из основной логики. Количество усилий аналогично. - person cflewis; 25.08.2009

Нет, АОП дополняет ООП, а не заменяет его. АОП и ООП предоставляют различные виды «клея», помогающие комбинировать поведения. ООП, конечно, позволяет комбинировать поведение посредством наследования и композиции и т. Д. АОП, с другой стороны, позволяет добавлять поведение по адресу общие проблемы, перехватывая точечные разрезы, где ваш новый код выполняется до или после выбранных методов выбранных классов.

Вот некоторые общие примеры сквозных проблем: безопасность, ведение журнала и управление транзакциями. Основным принципом хорошего дизайна является согласованность: в идеале фрагмент кода должен делать только одно. Так что, например, добавление кода безопасности в классы доступа к данным сбивает с толку. АОП решает эту конкретную проблему, позволяя вам добавить поведение в «Аспект» и затем применить этот аспект ко всем классам, которые должны иметь элементы управления безопасностью.

person nont    schedule 25.08.2009
comment
+1 за указание на то, что ООП и АОП прекрасно работают вместе - person LRE; 25.08.2009

АОП отличается от ООП, совершенно другие подходы к разработке.

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

Что касается того, когда использовать АОП или ООП, я бы посоветовал вам написать программу, заставить ее работать, а затем, когда она у вас будет работать, посмотрите на удаление кода, который на самом деле не имеет отношения к функции, но служит другой цели. Например, если вам нужно проверить правильность входных параметров перед их использованием, используйте для этого аспект. Если у вас есть аналогичная обработка событий, например, все исключения, созданные на уровне доступа к данным, записываются в файл журнала, тогда создайте аспект для этого.

По мере того, как вы устраняете эти перекрестные проблемы, ваш код становится меньше.

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

Используйте Eclipse, если используете Java, для АОП, так как плагин AJDT будет очень полезен, чтобы увидеть, куда вы добавляете аспекты.

person James Black    schedule 25.08.2009

Аспектно-ориентированное программирование - это броское модное слово для вставки действий (называемых «советами») в методы или функции в ключевых точках, таких как вызовы и возвраты, среди прочего. У меня большая проблема с АОП, потому что он нарушает все барьеры абстракции, встроенные в язык. У модуля нет способа сказать: «Это то, с чем может связываться аспект, и это то, с чем аспект не может связываться». В результате вы рискуете нарушить внутренние инварианты и разрушить принцип модульного мышления (вы можете понять модуль, не понимая ничего, кроме интерфейсов других модулей, которые он импортирует).

Несколько лет назад Рэйми Стата написала блестящую докторскую диссертацию о том, как объектно-ориентированные языки могут управлять подклассами и предотвращать нарушение ключевых инвариантов. Соответствующая работа для АОП еще не написана.

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

person Norman Ramsey    schedule 25.08.2009
comment
Мне нравится твой образ мышления. Кто-нибудь может это прокомментировать? Я заинтригован. - person Philippe Carriere; 25.08.2009
comment
Я согласен с тобой. Использование АОП должно быть спроектировано заранее и ограничено только избранными случаями, а не общим принципом программирования, чтобы избежать присущей ему GOTOness. - person JuanZe; 17.09.2009
comment
Я предполагаю, что под барьерами абстракции вы подразумеваете инкапсуляцию. Грэди Буч определяет инкапсуляцию как процесс разделения элементов абстракции, составляющих ее структуру и поведение; инкапсуляция служит для разделения договорного интерфейса абстракции и ее реализации. АОП не мешает разобраться между интерфейсом и реализацией, поэтому, согласно Грэди Бучу, он не нарушает инкапсуляцию. - person nont; 24.12.2009