# Aspect-Oriented Programming (AOP) Как известно, писать на Java понятный и сопровождаемый код довольно сложно, но приходится. Всё-таки [самый популярный язык программирования](https://www.tiobe.com/tiobe-index/). Там и шаблоны проектирования, и куча интересных архитектурных решений. Одно из них - Аспектно-ориентированное программирование. Почитать можно в разных источниках: * [Википедия](https://ru.wikipedia.org/wiki/Аспектно-ориентированное_программирование) * [Викиучебник](https://ru.wikibooks.org/wiki/Аспектно-ориентированное_программирование) * [Хабрахабр](https://habrahabr.ru/post/254791/) Если говорить о подходе в общем, он позволяет довольно красиво, без лишней писанины (соответственно, с низкой вероятностью где-то что-то забыть указать в одном классе из ста) интегрировать определенные аспекты в определенные срезы. Например, подключить логирование ко всем сетевым запросам или [замокать](https://ru.wikipedia.org/wiki/Mock-объект) печать документов. Для Python также есть несколько неплохих реализаций подхода: * [metapython/aspect](https://bitbucket.org/jsbueno/metapython/src/a4a7e67b3b56decaabb324bc2d730ebee4b0bce4/aspect.py?at=default&fileviewer=file-view-default) -- отличная реализация AOP через метаклассы. * [aspectlib](http://python-aspectlib.readthedocs.io/en/latest/introduction.html) -- реализация через корутины и декораторы. * [b3j0f.aop](https://github.com/b3j0f/aop) -- гибкая и мощная реализация AOP. не столько черной магии, как в первой, но так даже лучше. К тому же, в её README есть ссылки на альтернативные реализации. Главное, используйте вот это вот всё осторожно и разумно: не все, кто будет читать Ваш код, знают про всю эту чёрную магию.