AOP … я должен забыть ООП?

  • Говорят с другими программистами в любой момент. Чем больше глаз там находится на дизайне, тем более вероятно сверхсложный аспект показан рано, прежде чем это станет слишком косным в кодовой базе.
  • Постоянно спрашивают себя, как Вы будете использовать то, что Вы в настоящее время продолжаете работать. Если ответ - то, что Вы не уверены, остановитесь для пересмотра прежнего мнения то, что Вы делаете.
  • я нашел полезным кратко записать мысли о том, как потенциально упростить что-то, что я в настоящее время продолжаю работать. Тот путь, после того как у меня на самом деле есть он работа, легче возвратиться и осуществить рефакторинг или восстановить по мере необходимости вместо того, чтобы смешать с чем-то, что это еще даже не функционально.
14
задан Philippe Carriere 24 August 2009 в 23:58
поделиться

5 ответов

В двух словах, что такое аспектно-ориентированное программирование?

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

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

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

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

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

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

log.write("hello");

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

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

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

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

18
ответ дан 1 December 2019 в 10:03
поделиться

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

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

5
ответ дан 1 December 2019 в 10:03
поделиться

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

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

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

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

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

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

2
ответ дан 1 December 2019 в 10:03
поделиться

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

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

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

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

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

2
ответ дан 1 December 2019 в 10:03
поделиться