Які існують альтернативи для наскрізних проблем, крім програмно орієнтованого? [зачинено]


19

Програмування, орієнтоване на аспекти, обіцяє вирішити проблеми з наскрізними проблемами, але я все ще не повністю проданий. Чи були якісь інші спроби вирішити цю проблему?


Візерунок відвідувачів може вирішити безліч ситуацій, які зараз вирішуються через AOP.
Стівен Еверс

@SnOrfus: Також дивіться мою відповідь нижче, де я розповідаю про DJ-бібліотеку для Java: динамічний спосіб використання шаблону відвідувачів! Варто перевірити. (Це також загальна техніка, яку ви можете використовувати самостійно за допомогою Reflection.)
Macneil

Відповіді:


7

Коли це можливо, ви можете інкапсулювати наскрізні проблеми в окремі модулі, які потім використовуються у всьому додатку за допомогою введення залежності. Це дозволяє дещо відокремити реалізацію наскрізної проблеми від її використання протягом усього коду.

Однак це не завжди працює елегантно. Саме тому люди намагаються вирішити цю проблему з такими речами, як АОП.


6

Ще два варіанти, яких я ще не бачив:

Функціональне програмування з монадами та стрілками

У FP ви представляєте наскрізну проблему, як і все інше: як щось, що передаєте під час виклику функції. Оскільки це явно стає втомливим, ви можете використовувати Monads (або, можливо, стрілки), щоб сховати зайву інформацію, яка передається разом.

Найпоширеніший приклад AOP - ведення журналів. За допомогою Monads ви створили б монаду "Logger", яка зберігає список повідомлень. Будь-які функції, що виконуються через LoggerMonad, мають можливість розміщувати повідомлення в журналі. За допомогою стрілок ви б змоделювали весь потік даних програми та працювали в режимі ведення журналу в моделі, де це доречно. Я думаю. Стрілки досить складні.

Програмування на основі об'єктів / компонентів

Щось я досліджував і експериментував для ігрового двигуна. Замість "об'єктів", як в OOP, ви розкладаєте все на пакети даних (компонентів) і сервісів, які працюють над типом компонента. Компоненти групуються за спільними ідентифікаторами, як у реляційній базі даних, а групи пов'язаних компонентів - це Суб'єкти. Щоб додати журнал у такій системі, ви додали б нову службу реєстрації тригерів, на основі яких компонентів проходять через неї.

Обидва способи дозволяють дуже легко працювати наскрізною зміною, але обидва є архітектурними моделями високого рівня. Тож вам, мабуть, потрібно буде використовувати їх з самого початку. Теоретично модель Компонента може бути оброблена в існуючій системі ООП. Я думаю, монади можуть бути занадто, якщо ваша мова досить потужна.


Коли ви говорите про Монади та Стрілки, ви також повинні згадати додатків-функціонерів.
Waquo

3

Існує кілька способів вирішити проблеми, пов'язані з перехресним вирізанням:

  • Використовуйте кращі шаблони дизайну, ідіоми чи механізми абстрагування : Код може бути перекрестним, навіть якщо його можна модулювати. Щоб зберегти код, вам потрібно буде рефактор використовувати техніку проектування, яка може його модулювати. Таке рефакторинг може запровадити перерізання різного виду, але, сподіваємось, те, що поперечні розрізи є стабільними, і, ймовірно, не зміниться.

  • Розвивати багатші мовні особливості : Багато проявів крос-стержування можна вирішити за допомогою кращих механізмів абстрагування, а іноді необхідні нові мовні особливості. Наприклад, більш розвинені мови, які включають функціональні та об'єктно-орієнтовані функції, часто не використовують стільки моделей дизайну, оскільки вони не потрібні. Зауважте, що самі дизайнерські шаблони можуть мати перекрестний характер , оскільки вони описують ролі декількох різних об'єктів та класів. На Java рефлексію часто можна використовувати замість аспекту, хоча і за більш високу вартість виконання. Наприклад, використовуючи рефлексію, ви можете підтримати шаблон відвідувачів протягом сотень класів за допомогою лише декількох рядків коду. DJ-бібліотеказ Північного Сходу - це одне рефлексивне рішення, яке робить саме це. Міксини є потужною технікою, доступною в C ++ (але не на Java) і може надати вам кілька таких же випадків використання як аспект.

  • Забезпечити кращу підтримку інструментів : Такі методи, як використання grepта виконання операцій рефакторингу, можуть вирішувати проблеми, пов’язані з кодом перехресного перерізу. Наприклад, ім'я методу, оголошеного в інтерфейсі, може вирізати всю програму. (Зверніть увагу на технічну різницю тут: перехрестя саме ім'я методу, а не реалізація методу.) Зазвичай це не проблема в IDE, як Eclipse, де ви можете використовувати "перейменувати рефакторинг", щоб змінити всі місця у вашому коді, які використовують ім’я. Таким чином, можливо, не потрібно мовних функцій, коли середовище програмування для вас достатньо виразне.

  • Використання мов, орієнтованих на домен: Ранні мови аспектів, які виходили перед AspectJ, були доменними і застосовувались лише до певних проблем, таких як синхронізація потоків або аналіз потоку даних для ефективного поєднання функціональних композицій. Ці мови були експериментальними, але здавались надзвичайно успішними в модуляризації проблем, які в іншому випадку були перехресними.

  • Використовуйте методи генеративного програмування : Підняття мета-рівня може вважатися технікою впровадження програмно-орієнтованого програмування, але це досить велика область, що вона виходить за рамки простих аспектів. Генеративні прийоми (де програма генерує вихідний код для іншої програми) також пов'язані з доменними мовами.

Зважаючи на все це, я вважаю, що вивчення АОП є доцільним. AOP може допомогти вам розширити свої уявлення про код, навіть якщо ви не використовуєте мову AOP.


2

Взагалі елементи тегування коду з декларативною особливістю, але конкретно системою атрибутів у світі C # /. NET / Mono.


Чи можете ви бути більш конкретними? Ви описуєте, як працюють деякі системи АОП.
Стівен Еверс

2
Це майже AOP.
Метт H

AOP у своєму типовому / класичному розумінні потребує допоміжного інструменту (аспект, який плете IDE), щоб зробити це у великих масштабах. AOP ускладнює міркування про код лише з первинного вихідного коду. Складніше передбачити поведінку ваших компонентів, коли ваша програма пронизана зомбі. Атрибути або теги забезпечують аналогічну функціональність, але з чітким поданням у вихідному коді.

Зауважте, що моє питання пов'язане не з проблемами, які вирішує спосіб AOP. Мене хвилює лише те, що для AOP мій вихідний код не є достатнім джерелом для прогнозування поведінки моєї програми.

@mumtaz: Я бачу, як це було б у випадку застосування аспектів до цілого простору імен. Інший метод AOP: присвоєння методів / властивостей / тощо. застосувати до нього аспект (и), ідентично тому, що ви описуєте.
Стівен Еверс

2

Я не фахівець з АОП, але, читаючи про нього протягом багатьох років, це завжди здавалося слабшою формою метапрограмування, запропонованого Ліспом , особливо частинами, такими як його протокол метаоб'єктів.

Це, мабуть, не дивно: Грегор Кіцалес був одним з авторів AMOP, а згодом написав AspectJ для Java!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.