Вопрос

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

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

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

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

Это было полезно?

Решение

Что такое аспектно-ориентированное программирование вкратце?

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

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

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

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

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

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

log.write("hello");

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top