我主要是一個Java開發人員。我遇到了不少喜愛AOP的Java開發人員。我也看到越來越多的最近出現的AOP「設計模式」似乎被廣泛採用。即便如此,我仍然不相信OO代碼中的AOP通常是一個好主意,原因有兩個。OOP不能做什麼?
它增加了「神奇」在 形式的不透明的複雜性,可以 是非常難以調試的代碼,並且可以 使它非常難於調試 面向對象的代碼,它 影響。
在我看來,是大多 不必要的,(壞)經常被用來 以避免設計好,還是 以彌補以前差 設計。
這是一個例子,我在過去幾年中已經看到了很多,作爲我的問題的背景。
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低很多。這個問題可以通過更合適的抽象層次和更好的(OO)設計來解決。
的OO解
public void saveMyEntityToTheDatabase(MyEntity entity) {
database.performInTransaction(new Save(entity));
}
這種解決方案假定database
對象包含相同類型負責任的縱橫管理@Transactional
方法事務邏輯。這解決了我上面的擔憂,更明顯的是管理與EntityManager
的交互,而不是引入另一種編程範例。
最後,我的問題是:OOP不能做什麼?我略微確信它在跟蹤記錄中的實用性,並且可能是默認toString()
實現或類似的,但我想知道是否有人發現它對於特定類型的問題比OO好得多。
帶有字節碼修改的AoP可以例如透明地將代碼添加到(例如)第三方庫而不需要修改源碼。 – 2011-05-11 11:11:07
@Johan,......這使得AOP編譯器成爲一個出色的黑客工具。 – weekens 2011-05-11 11:18:14
@weekens,正是 - 使其不是OOP的替代品,而是一種方便的方法來應用OOP,有時候是通過黑客。 – 2011-05-11 11:20:24