В дополнение к принятому ответу я хочу упомянуть еще один пример сквозной проблемы: удаленное взаимодействие. Скажем, я просто хочу вызвать другие компоненты в моей экосистеме локально, как если бы они были запущены в процессе. Может быть, в некоторых случаях они и есть. Но теперь я хочу запускать свои сервисы, распределенные в облаке или кластере. Почему мне как разработчику приложения нужно заботиться об этом аспекте? Аспект может позаботиться о том, чтобы узнать, кому и как звонить, сериализовать передаваемые данные, если необходимо, и сделать удаленный вызов. Если бы все выполнялось в процессе, аспект просто перенаправлял бы локальный вызов. На вызываемой стороне аспект десериализует данные, выполняет локальный вызов и возвращает результат.
Теперь позвольте мне рассказать вам небольшую историю о «тривиальных» вещах, таких как вывод журнала: всего несколько недель назад я реорганизовал сложную, но не слишком большую базу кода (около 250 000 строк кода) для клиента. В нескольких сотнях классов использовался один вид фреймворка, в других нескольких сотнях - другой. Потом было несколько тысяч строкSystem.out.println(*)
где действительно должен был быть вывод журнала. В итоге я исправил тысячи строк кода, разбросанных по всей кодовой базе. К счастью, я мог использовать некоторые хитрые приемы в IntelliJ IDEA (структурный поиск и замена), чтобы ускорить все действие, но, черт возьми, вам не кажется, что это было тривиально! Конечно, ведение журнала отладки, строго зависящее от контекста, всегда будет происходить в теле метода, но многие важные типы ведения журнала, такие как вызовы методов трассировки (даже иерархически с красиво оформленными выходными данными), регистрация как обработанных, так и необработанных исключений, аудит пользователей (ведение журнала вызовов к ограниченные методы, основанные на ролях пользователей) и т. д. могут быть легко реализованы в аспектах, не загрязняя исходный код. Обычному разработчику приложений не нужно думать об этом или даже видеть вызовы регистратора, разбросанные по базе кода.
Я могу дать аналогичные объяснения и по другим сквозным проблемам. Сохранение кода чистым и свободным от разброса и запутывания IMO - это вопрос профессионализма, а не что-то необязательное. И последнее, но не менее важное: он делает код читаемым, поддерживаемым и обновляемым. Аминь.