खेल के अंत में आ रहा है, लेकिन मैं इसे बाद के डेवलपर्स के लिए प्रदान करता हूं जो इस प्रश्न पर ठोकर खा सकते हैं।
यदि आपका आवेदन सही तरीके से संचालित करने के लिए निर्भर करता है, तो मैं AOP के खिलाफ दृढ़ता से सलाह दूंगा । पहलू इस तरह काम करते हैं:
- सलाह (अतिरिक्त व्यवहार) पर लागू होती है
- बिंदुओं को मिलाएं (ऐसे स्थान जहां अतिरिक्त कोड संलग्न किया जा सकता है, इस तरह की विधि शुरू या समाप्त होती है, या जब किसी दिए गए इवेंट ट्रिगर होते हैं)
- ... जहां पॉइंटकट (एक पैटर्न जो पता लगाता है कि क्या दिया गया प्वाइंट पॉइंट मैच करता है) पैटर्न मैच करता है
जो लोग लंबे समय से कंप्यूटर कर रहे हैं, इस तथ्य के लिए कि पैटर्न का उपयोग किया जाता है, बारीकी से देखने के लिए कुछ हो सकता है। तो यहां एक ऐसे बिंदु का उदाहरण दिया गया है set
, जो तर्कों की परवाह किए बिना नामित किसी भी विधि से मेल खाता है:
call(* set(..))
तो यह एक काफी व्यापक बिंदु है और यह स्पष्ट होना चाहिए कि देखभाल के साथ इसे संभालने की सलाह दी जाती है (कोई दंडित इरादा नहीं) क्योंकि आप कई चीजों के लिए सलाह दे रहे हैं।
या बिल्ली, चलो नाम या हस्ताक्षर की परवाह किए बिना, हर चीज के लिए सलाह लागू करें !
execution(* *(..))
तो स्पष्ट रूप से हमें सावधान रहना चाहिए क्योंकि यहां बहुत शक्ति है, लेकिन यह पहलुओं के खिलाफ एक तर्क नहीं है - यह सावधानी के लिए एक तर्क है क्योंकि यहां बहुत अधिक शक्ति है और पैटर्न मिलान आसानी से जा सकता है (बस अपने पसंदीदा खोज इंजन को हिट करें अनूप बग्स और मस्ती करते हैं)।
तो यहाँ एक अपेक्षाकृत सुरक्षित बिंदु की तरह दिखता है:
pointcut setter(): target(Point) &&
( call(void setX(int)) ||
call(void setY(int)) );
यह स्पष्ट रूप से सलाह प्रदान करता है यदि किसी ऑब्जेक्ट पर नाम setX
या विधि पाए जाते हैं। विधियाँ केवल s प्राप्त कर सकती हैं और वे होनी चाहिए । बहुत सुरक्षित लगता है, है ना? ठीक है, यह सुरक्षित है अगर वे तरीके मौजूद हैं और आपने सही सलाह लागू की है। यदि नहीं, तो बहुत बुरा; यह चुपचाप विफल रहता है।setY
Point
int
void
एक उदाहरण देने के लिए, एक मित्र एक जावा एप्लिकेशन को डिबग करने की कोशिश कर रहा था, जहां हर कोई एक बार एक महान समय में, यह गलत डेटा लौटाएगा। यह एक असीम विफलता थी और विशेष रूप से किसी विशेष घटना या डेटा के साथ सहसंबद्ध प्रतीत नहीं हुई। यह एक थ्रेडिंग बग था, ऐसा कुछ जो परीक्षण या पता लगाने के लिए बेहद मुश्किल है। जैसा कि यह पता चला है, वे पहलुओं को लॉक करने के तरीकों का उपयोग कर रहे थे और उन्हें "धागा सुरक्षित" बना रहे थे, लेकिन एक प्रोग्रामर ने एक विधि का नाम बदल दिया और एक पॉइंटकट इसे मैच करने में विफल रहा, इस प्रकार एप्लिकेशन का एक मूक टूटना हुआ।
इस प्रकार, मैं लोगों को बताता हूं कि यदि उन्हें अपवाद जैसे पहलुओं का इलाज करने के लिए AOP का उपयोग करना चाहिए: एक अच्छी तरह से डिज़ाइन की गई प्रणाली में और अगर कुछ भी गलत नहीं हुआ, तो उन्हें हटाया जा सकता है और सॉफ्टवेयर अभी भी सही ढंग से काम करता है। हालाँकि, यदि प्रोग्राम की कार्यक्षमता AOP पर निर्भर करती है, तो आप अपने प्रोग्राम के लिए एक सुगंध का परिचय देते हैं जो अनुचित है।
इस प्रकार, लॉगिंग, डिबगिंग और ट्रेसिंग व्यवहार के महान उदाहरण हैं जो पहलुओं के लिए एकदम सही हैं, लेकिन सुरक्षा? नहीं। धागा सुरक्षा? नहीं।
AOP के एक मजबूत विकल्प के लिए, लक्षण देखें । भाषा पर बोल्ट किए जाने के बजाय, वे सीधे इसमें एकीकृत होते हैं, आपको "विशेषता से अवगत" आईडीई की आवश्यकता नहीं है (हालांकि यह मदद कर सकता है) और संकलन-समय की विफलताएं हैं यदि आपके लिए आवश्यक तरीके मौजूद नहीं हैं। लक्षण चिंताओं को अलग करने से निपटने का एक बहुत साफ काम करते हैं क्योंकि समस्या शुरू से ही बेहतर थी। मैं उन्हें बड़े पैमाने पर उपयोग करता हूं और वे शानदार हैं।