मैं मुख्य रूप से जावा डेवलपर हूं। मैंने कुछ जावा देवों से मुलाकात की है जो एओपी से प्यार करते हैं। मैं हाल ही में उभरते हुए अधिक से अधिक एओपी "डिजाइन पैटर्न" देख रहा हूं जो काफी व्यापक रूप से अपनाया जाता है। फिर भी, मुझे अभी भी विश्वास नहीं है कि कुछ कारणों से ओओ कोड में एओपी सामान्य रूप से एक अच्छा विचार है।एओपी क्या कर सकता है कि ओओपी नहीं कर सकता है?
यह अपारदर्शी जटिलता कि डिबग के लिए बेहद मुश्किल हो सकता है के रूप में कोड को "जादू" कहते हैं, और यह अत्यंत कठिन वस्तु उन्मुख कोड यह प्रभावित करता है डिबग करने के लिए कर सकते हैं।
यह ज्यादातर अनावश्यक है, और (खराब) अक्सर इस्तेमाल किया अच्छी तरह से डिजाइन करने के लिए, या पिछले गरीब डिजाइन के लिए क्षतिपूर्ति करने के लिए होने से बचाने के होने के लिए मुझे लगता है।
यहां एक उदाहरण है कि पिछले कुछ सालों में मैं अपने प्रश्न के लिए पृष्ठभूमि के रूप में बहुत कुछ देख रहा हूं।
AOP से पहले (हाइबरनेट डॉक्स से)
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 के लिए एक स्पष्ट जीत की तरह लगता है। मेरे लिए मूल समस्या एपीआई abstraction के असंगत स्तर का लक्षण है। यही है, EntityManager
इसका उपयोग कर संदेश के व्यापार-स्तर एपीआई से बहुत कम स्तर है। इस समस्या को अवशोषण के एक अधिक उचित स्तर, और एक बेहतर (ओओ) डिजाइन के साथ हल किया जा सकता है।
एक OO समाधान
public void saveMyEntityToTheDatabase(MyEntity entity) {
database.performInTransaction(new Save(entity));
}
यह समाधान मानता है कि database
वस्तु व्यवहार तर्क यह है कि पहलू जिम्मेदार कि @Transactional
तरीकों का प्रबंधन करता है उसी तरह का होता है। यह ऊपर की मेरी चिंताओं को संबोधित करता है और यह स्पष्ट करता है कि EntityManager
के साथ बातचीत का प्रबंधन करने वाला कोई और प्रोग्रामिंग प्रतिमान नहीं पेश करता है।
तो अंततः, मेरा प्रश्न: ओओपी क्या कर सकता है कि ओओपी नहीं कर सकता? मैं ट्रेस लॉगिंग में इसकी उपयोगिता से थोड़ा आश्वस्त हूं, और शायद डिफ़ॉल्ट toString()
कार्यान्वयन या कुछ समान है, लेकिन मुझे यह जानना अच्छा लगेगा कि किसी को विशेष प्रकार की समस्याओं के लिए ओओ से काफी बेहतर पाया गया है या नहीं।
AOP, बाईटकोड संशोधन के साथ, उदाहरण के लिए पारदर्शी रूप से (उदाहरण के लिए) 3 पार्टी पुस्तकालयों के लिए कोड soure को संशोधित करने की आवश्यकता के बिना जोड़ सकते हैं। –
@ जोहान, ... जो एओपी कंपाइलर को एक उत्कृष्ट हैकिंग टूल बनाता है। – weekens
@weekens, बिल्कुल - इसे ओओपी के प्रतिस्थापन नहीं बल्कि ओओपी को लागू करने के लिए सुविधाजनक साधन है, कभी-कभी हैक्स द्वारा। –