АОП ... Должен ли я отучиться от ООП? - PullRequest
14 голосов
/ 25 августа 2009

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

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

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

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

Ответы [ 5 ]

18 голосов
/ 25 августа 2009

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

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

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

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

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

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

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

log.write("hello");

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

Могу ли я перевести один в другой?

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

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

5 голосов
/ 25 августа 2009

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

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

2 голосов
/ 25 августа 2009

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

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

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

2 голосов
/ 25 августа 2009

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

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

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

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

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

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

0 голосов
/ 25 августа 2009
...