Что может АОП, чего не может ООП?

Я в первую очередь разработчик Java. Я встречал немало Java-разработчиков, которые любят АОП. Я также замечаю, что в последнее время появляется все больше и больше «шаблонов проектирования» АОП, которые, кажется, получили достаточно широкое распространение. Тем не менее, я все еще не уверен, что АОП в объектно-ориентированном коде в целом является хорошей идеей по нескольким причинам.

  1. Он добавляет «волшебство» в код в Я также замечаю, что в последнее время появляется все больше и больше «шаблонов проектирования» АОП, которые, кажется, получили достаточно широкое распространение. Даже в этом случае ...

    Я в первую очередь разработчик Java. Я встречал немало Java-разработчиков, которые любят АОП. Я также замечаю, что в последнее время появляется все больше и больше «шаблонов проектирования» АОП, которые, кажется, получили достаточно широкое распространение. Тем не менее, я все еще не уверен, что АОП в объектно-ориентированном коде в целом является хорошей идеей по нескольким причинам.

    1. Он добавляет «волшебство» в код в Я также замечаю, что в последнее время появляется все больше и больше «шаблонов проектирования» АОП, которые, кажется, получили достаточно широкое распространение. Даже в этом случае ...

      Я в первую очередь разработчик Java. Я встречал немало Java-разработчиков, которые любят АОП. Я также замечаю, что в последнее время появляется все больше и больше «шаблонов проектирования» АОП, которые, кажется, получили достаточно широкое распространение. Тем не менее, я все еще не уверен, что АОП в объектно-ориентированном коде в целом является хорошей идеей по нескольким причинам.

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

        1. Он добавляет «волшебство» в код в появившиеся недавно, которые, по-видимому, получили достаточно широкое распространение. Тем не менее, я все еще не уверен, что АОП в объектно-ориентированном коде в целом является хорошей идеей по нескольким причинам.

          1. Он добавляет «волшебство» в код в форма непрозрачной сложности, которая может быть чрезвычайно трудным для отладки и может сделать очень сложным отладку объектно-ориентированный код, который влияет.

          2. Мне кажется, что в основном ненужный и (что еще хуже) часто используемый чтобы избежать необходимости хорошо проектировать, или чтобы компенсировать предыдущую бедность дизайн.

          Вот пример, который я часто видел за последние пару лет, в качестве фона для моего вопроса.

          До AOP (из документации Hibernate)

          public void saveMyEntityToTheDatabase(MyEntity entity) {
              EntityTransaction tx = null;
              try {
                  tx = entityManager.getTransaction();
                  tx.begin();
                  entityManager.persist(entity);
                  tx.commit();
              } catch (RuntimeException e) {
                  if(tx != null && tx.isActive()) {
                      tx.rollback();
                  }
                  throw e;
              }
          }
          

          После AOP

          @Transactional
          public void saveMyEntityToTheDatabase(MyEntity entity) {
              entityManager.persist(entity);
          }
          

          Многим людям кажется очевидной победой AOP. Для меня исходная проблема является симптомом несовместимых уровней абстракции API. То есть EntityManager является намного более низким уровнем, чем API бизнес-уровня сообщения, использующего его. Эту проблему можно решить с помощью более подходящего уровня абстракции и лучшего (ОО) дизайна.

          Объектно-ориентированное решение

          public void saveMyEntityToTheDatabase(MyEntity entity) {
              database.performInTransaction(new Save(entity));
          }
          

          Это решение предполагает, что объект базы данных содержит ту же транзакционную логику, что и ответственный аспект, который управляет методами @Transactional . Это решает мои проблемы выше, делая более очевидным, что есть что-то, управляющее взаимодействием с EntityManager , а не введение другой парадигмы программирования.

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

31
задан Daniel 11 May 2011 в 11:02
поделиться