Кровавый АОП

Apr 23, 2017 19:42

Вместо эпиграфа:
#define TRUE (rand() > 0.1 ? TRUE : FALSE) // happy debugging losers


Последние пол-года по работе погружаюсь в тёмные недра кровавого энтерпрайза. Всё на Java, как и раньше, но если раньше мы собирали большую 100500-компонентную платформу собственными инструментами, заточенными под под real-time, то тут пришлось приобщиться ко всяческим модным в мире кровавого энтерпрайза фреймворкам, технологиям, методологиям, парадигмам и прочей НЁХ, с Ораклом и пифиями.

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

Есть ли жызнь в тырпырпрайзной платформе? Есть. Но странная.
Замнёнм для ясности, что особо продвинутые втыкают куски на JavaScript или Python, которые на ходу компилируются в байт-код и засовывается в ту же самую JVM, и на ClassLoader hell. Это мелочи, самое интересное происходит в другом месте:
Сначала Spring делает свои живительные инъекции, потом тех, кто выжил, добивает своими инъекциями guice, после чего это всё это скармливается EJB-контейнеру, но некоторым не хватает даже этих издевательств, и тогда они применяют Аспектно-Ориентированное Программирование. Штоб вы знали, каждый из этих инструментов в той или иной степени перехреначивает попавший в его руки код, так что реально выполняется не [только] то, что написано в сорцах, но [и] что-то ещё, в зависимости от каких-нибудь конфигов (которые, впрочем, обычно ещё можно локализовать), а ещё от кода других компонентов (каковой не всегда ещё обнаружишь), пожелавших понастраивать все эти фреймворки и контейнеры, и чёрт знает чего ещё, но АОП переплёвывает все предыдущие пункты легко и непринуждённо.

Как говорят физики, на каждое тело во Вселенной одновременно действуют все физические законы оной Вселенной, включая ещё не открытые. Шизотерики могут добавлять про мир как голограмму, и вот вы в Крыжополе плюнули на асфальт, а в Китае в результате съели собаку. Кровавый АОП делает примерно то же самое с исполняемым кодом: на программу, насильно представленную в виде многомерного пространства аспектов, внезапно начинает влиять ВСЁ. Все компоненты, которые описывают какой-нибудь аспект, все написанные для них (или не для них) аннотации, все запендюренные в платформу инъекции, все конфиг-файлы (в том числе занимающиеся подключением аспектов... или забывшие это сделать), размазанные тонким слоем по энтерпрайз-платформе, все настройки, похороненные в глубинах БД... В общем, всё! И чтобы понять, как что-то будет работать, надо на всякий случай заглянуть ВСЮДУ. А если что-то случилось, то для того, чтобы понять, почему оно повело себя именно так, надо опять же заглянуть ВСЮДУ.

Вобщем, создатели кровавого энтерпрайза вообще и АОП в частности шли долгим и мучительным путём, но в конце концов смогли добиться того, чтобы на Яве можно было создавать фреймворки для автоматизации многофакторного и многомерного отстрела собственных ног в стиле Си (смотри эпиграф), или C++ (где для этой цели служит гораздо более продвинутый механизм переопределения операторов, так что, увидев какой-нибудь "+" или "=", никогда нельзя было догадаться, что же за код исполнится в этом месте на самом деле, пока не перелопатишь тонны кода), или любого другого, славящегося особо большими расстояниями между местом, где что-то применяется, и местом, где можно посмотреть, что же это за хрень такая здесь будет работать на самом деле.

Оригинал поста: http://livelight.dreamwidth.org/455338.html.
Комментов там:

физматпрог

Previous post Next post
Up