पहलू आधारित प्रोग्रामिंग: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(4 intermediate revisions by 3 users not shown)
Line 3: Line 3:




[[ कम्प्यूटिंग | कम्प्यूटिंग]] में, आस्पेक्ट-ओरिएंटेड प्रोग्रामिंग (AOP) [[प्रोग्रामिंग प्रतिमान]] है, जिसका उद्देश्य [[क्रॉस-कटिंग चिंता]]ओं को अलग करने की अनुमति देकर [[ प्रतिरूपकता (प्रोग्रामिंग) |प्रतिरूपकता (प्रोग्रामिंग)]] को बढ़ाना है। यह मौजूदा कोड में व्यवहार जोड़कर ऐसा करता है (एक [[सलाह (प्रोग्रामिंग)]]) ''बिना'' कोड को संशोधित किए, इसके बजाय अलग से निर्दिष्ट करता है कि कौन सा कोड [[ बिंदुकट |बिंदुकट]] विनिर्देश के माध्यम से संशोधित किया गया है, जैसे कि फ़ंक्शन का नाम शुरू होने पर सभी फ़ंक्शन कॉल लॉग करें 'तय करना{{'"}}. यह उन व्यवहारों की अनुमति देता है जो व्यापार तर्क (जैसे लॉगिंग) के लिए केंद्रीय नहीं हैं, उन्हें कार्यक्षमता के लिए कोड कोर को अव्यवस्थित किए बिना प्रोग्राम में जोड़ा जाना चाहिए।


AOP में प्रोग्रामिंग विधियाँ और उपकरण शामिल हैं जो स्रोत कोड के स्तर पर चिंताओं के मॉड्यूलरीकरण का समर्थन करते हैं, जबकि पहलू-उन्मुख सॉफ़्टवेयर विकास संपूर्ण इंजीनियरिंग अनुशासन को संदर्भित करता है।
[[ कम्प्यूटिंग |कम्प्यूटिंग]] में '''आस्पेक्ट ओरिएंटेड प्रोग्रामिंग''' (एओपी) [[प्रोग्रामिंग प्रतिमान|प्रोग्रामिंग तकनीक]] है, जिसका उद्देश्य [[क्रॉस-कटिंग चिंता|क्रॉस-कटिंग]]  से होने वाली समस्याओं को अलग करने की अनुमति देकर [[ प्रतिरूपकता (प्रोग्रामिंग) |प्रतिरूपकता (प्रोग्रामिंग)]] को बढ़ावा देना है। यह वर्तमान समय में कोडिंग विधि में इसे संयोजित करता है जो ''बिना'' कोड को संशोधित किए, इसके अतिरिक्त अलग से निर्दिष्टता प्रदान करता है, इस प्रकार इससे यह पता चलता हैं कि कौन सा कोड [[ बिंदुकट |बिंदुकट]] विनिर्देश के माध्यम से संशोधित किया गया है, जैसे कि फ़ंक्शन का नाम प्रारंभ होने पर सभी फ़ंक्शन कॉल लॉग करना 'तय करना{{'"}} इत्यादि कार्य इसके द्वारा किये जाते हैं। इस प्रकार यह उन व्यवहारों को भी अनुमति देता है जो व्यापार तर्क जैसे लॉगिंग के लिए केंद्रीकृत नहीं होते हैं, उनकी कार्यक्षमताओं को आंकने के लिए कोड कोर को अव्यवस्थित किए बिना प्रोग्राम में जोड़ा जाना चाहिए।


आस्पेक्ट-ओरिएंटेड प्रोग्रामिंग में प्रोग्राम लॉजिक को अलग-अलग हिस्सों (तथाकथित ''चिंताओं'', कार्यक्षमता के एकजुट क्षेत्रों) में तोड़ना शामिल है। लगभग सभी प्रोग्रामिंग प्रतिमान अमूर्तता (जैसे, कार्य, प्रक्रियाएं, मॉड्यूल, वर्ग, विधियाँ) प्रदान करके अलग-अलग, स्वतंत्र संस्थाओं में चिंताओं के समूहीकरण और इनकैप्सुलेशन (कंप्यूटर विज्ञान) के कुछ स्तर का समर्थन करते हैं, जिनका उपयोग इन चिंताओं को लागू करने, सार करने और बनाने के लिए किया जा सकता है। . कुछ चिंताएँ कार्यक्रम में कई अमूर्तताओं में कटौती करती हैं, और कार्यान्वयन के इन रूपों की अवहेलना करती हैं। इन चिंताओं को ''क्रॉस-कटिंग चिंताएं'' या क्षैतिज चिंताएं कहा जाता है।
एओपी में प्रोग्रामिंग विधियाँ और उपकरण सम्मिलित होते हैं जो स्रोत कोड के स्तर पर आने वाली समस्याओं के मॉड्यूलरीकरण का समर्थन करते हैं, जबकि एस्पेक्ट ओरिएंटेड सॉफ़्टवेयर विकास संपूर्ण अभियांत्रिकी के अनुशासन को संदर्भित करता है।


[[डेटा प्रविष्ट कराना]] क्रॉसकटिंग चिंता का उदाहरण है क्योंकि लॉगिंग रणनीति सिस्टम के प्रत्येक लॉग किए गए हिस्से को आवश्यक रूप से प्रभावित करती है। लॉगिंग जिससे सभी लॉग क्लास और तरीके 'क्रॉसकट' हो जाते हैं।
आस्पेक्ट-ओरिएंटेड प्रोग्रामिंग में प्रोग्राम लॉजिक को अलग-अलग भागों जैसे तथाकथित ''समस्याओं'', कार्यक्षमता के एकजुट क्षेत्रों में पृथक करना सम्मिलित है। लगभग सभी प्रोग्रामिंग ओरिएंटेड प्रोग्रामिंग जैसे, फंक्शन, प्रोसेसिंग, मॉड्यूल, वर्ग, विधियाँ प्रदान करके अलग-अलग, स्वतंत्र संस्थाओं में आने वाली समस्याओं के समूहीकरण और इनकैप्सुलेशन को कंप्यूटर विज्ञान के कुछ स्तर का समर्थन करते हैं, जिनका उपयोग इस प्रकार से आने वाली समस्याओं को लागू करने, इसे संदर्भित करने और बनाने के लिए उपयोग किया जा सकता है। इस प्रकार कुछ आने वाली इस प्रकार की सम्स्याएँ फंक्शन में कई कार्यों में कमी कर देती हैं, और कार्यान्वयन के प्रारूप की अवहेलना करती हैं। इस प्रकार से आने वाली समस्याओं को ''क्रॉस-कटिंग समस्याएँ'' या क्षैतिज समस्याएँ कहा जाता है।


सभी AOP कार्यान्वयनों में कुछ क्रॉसकटिंग अभिव्यक्तियाँ होती हैं जो प्रत्येक चिंता को स्थान पर समाहित करती हैं। कार्यान्वयन के बीच का अंतर प्रदान किए गए निर्माणों की शक्ति, सुरक्षा और उपयोगिता में निहित है। उदाहरण के लिए, इंटरसेप्टर जो प्रकार-सुरक्षा या डिबगिंग के लिए अधिक समर्थन के बिना क्रॉसकटिंग के सीमित रूप को व्यक्त करने के तरीकों को निर्दिष्ट करते हैं। [[AspectJ]] में ऐसे कई भाव हैं और उन्हें विशेष वर्ग, [[पहलू (कंप्यूटर विज्ञान)]] में समाहित करता है। उदाहरण के लिए, पहलू आधार कोड (एक कार्यक्रम का गैर-पहलू हिस्सा) के व्यवहार को बदल सकता है, जो कि परिमाणीकरण में निर्दिष्ट विभिन्न सम्मिलित बिंदुओं (एक कार्यक्रम में बिंदु) [[पहलू-उन्मुख प्रोग्रामिंग में सलाह]]अतिरिक्त व्यवहार) में सलाह लागू करता है। क्वेरी को पॉइंटकट कहा जाता है (जो पता लगाता है कि दिए गए [[ जुड़ने का बिंदु |जुड़ने का बिंदु]] से मेल खाता है या नहीं)। पहलू सदस्यों या माता-पिता को जोड़ने जैसे अन्य वर्गों में बाइनरी-संगत संरचनात्मक परिवर्तन भी कर सकता है।
[[डेटा प्रविष्ट कराना]] क्रॉसकटिंग समस्या का उदाहरण है क्योंकि लॉगिंग करने वाली इस रणनीति को सिस्टम के प्रत्येक लॉग किए गए भाग को आवश्यक रूप से प्रभावित करती है। इस प्रकार लॉगिंग जिससे सभी लॉग क्लास और तरीके 'क्रॉसकट' हो जाते हैं।
 
सभी एओपी कार्यान्वयनों में कुछ क्रॉसकटिंग अभिव्यक्तियाँ होती हैं जो प्रत्येक समस्या को स्थान पर समाहित करती हैं। कार्यान्वयन के बीच का अंतर प्रदान किए गए निर्माणों की शक्ति, सुरक्षा और उपयोगिता में निहित है। इस प्रकार उदाहरण के लिए, इंटरसेप्टर जो प्रकार-सुरक्षा या डिबगिंग के लिए अधिक समर्थन के बिना क्रॉसकटिंग के सीमित रूप को व्यक्त करने के विधियों को निर्दिष्ट करते हैं। इस प्रकार [[AspectJ|एस्पेक्टजे]] में ऐसे कई भाव हैं और उन्हें विशेष वर्ग, [[पहलू (कंप्यूटर विज्ञान)|एस्पेक्ट (कंप्यूटर विज्ञान)]] में समाहित करता है। उदाहरण के लिए, एस्पेक्ट आधार कोड (एक फंक्शन का अनएस्पेक्ट ओरिएंटेड प्रोग्रामिंग) के व्यवहार को परिवर्तित करता है, जो कि परिमाण स्वरूप इसमें निर्दिष्ट विभिन्न सम्मिलित बिंदुओं जैसे किसी फंक्शन में बिंदु को [[पहलू-उन्मुख प्रोग्रामिंग में सलाह|एस्पेक्ट ओरिएंटेड प्रोग्रामिंग में]] उपयोग करने के अतिरिक्त इसके व्यवहार में कमांड लागू करता है। क्वेरी को पॉइंटकट कहा जाता है, जो इस प्रकार यह पता लगाता है कि दिए गए [[ जुड़ने का बिंदु |संयोजन के बिंदु]] से यह मेल खाता है या नहीं खाता हैं। एस्पेक्ट सदस्यों या पैरेंट को जोड़ने जैसे अन्य वर्गों में बाइनरी-संगत संरचनात्मक परिवर्तन भी कर सकता है।


== इतिहास ==
== इतिहास ==
AOP के कई प्रत्यक्ष पूर्ववृत्त A1 और A2 हैं:<ref>{{Cite conference | doi = 10.1007/BFb0053381 | title = पहलू आधारित प्रोग्रामिंग| work = Proceedings of the 11th European Conference on Object-Oriented Programming | conference = [[European Conference on Object-Oriented Programming|ECOOP]]'97 | volume = 1241 | pages = 220–242 | series = [[Lecture Notes in Computer Science|LNCS]] | year = 1997 | last1 = Kiczales | first1 = G. | author1-link = Gregor Kiczales | last2 = Lamping | first2 = J. | last3 = Mendhekar | first3 = A. | last4 = Maeda | first4 = C. | last5 = Lopes | first5 = C. | last6 = Loingtier | first6 = J. M. | last7 = Irwin | first7 = J. | isbn = 3-540-63089-9 | citeseerx = 10.1.1.115.8660 | url = http://www.cs.ubc.ca/~gregor/papers/kiczales-ECOOP1997-AOP.pdf | url-status = live | archive-url = https://web.archive.org/web/20160112141810/http://www.cs.ubc.ca/%7Egregor/papers/kiczales-ECOOP1997-AOP.pdf | archive-date = 2016-01-12 }}</ref> [[प्रतिबिंब (कंप्यूटर प्रोग्रामिंग)]] और [[मेटाऑब्जेक्ट]]्स, विषय-उन्मुख प्रोग्रामिंग, संरचना फ़िल्टर और अनुकूली प्रोग्रामिंग।<ref>"Adaptive Object Oriented Programming: The Demeter Approach with Propagation Patterns" ''Karl Liebherr'' 1996 {{ISBN|0-534-94602-X}} presents a well-worked version of essentially the same thing (Lieberherr subsequently recognized this and reframed his approach).</ref>
एओपी के कई प्रत्यक्ष पूर्ववृत्त A1 और A2 हैं:<ref>{{Cite conference | doi = 10.1007/BFb0053381 | title = पहलू आधारित प्रोग्रामिंग| work = Proceedings of the 11th European Conference on Object-Oriented Programming | conference = [[European Conference on Object-Oriented Programming|ECOOP]]'97 | volume = 1241 | pages = 220–242 | series = [[Lecture Notes in Computer Science|LNCS]] | year = 1997 | last1 = Kiczales | first1 = G. | author1-link = Gregor Kiczales | last2 = Lamping | first2 = J. | last3 = Mendhekar | first3 = A. | last4 = Maeda | first4 = C. | last5 = Lopes | first5 = C. | last6 = Loingtier | first6 = J. M. | last7 = Irwin | first7 = J. | isbn = 3-540-63089-9 | citeseerx = 10.1.1.115.8660 | url = http://www.cs.ubc.ca/~gregor/papers/kiczales-ECOOP1997-AOP.pdf | url-status = live | archive-url = https://web.archive.org/web/20160112141810/http://www.cs.ubc.ca/%7Egregor/papers/kiczales-ECOOP1997-AOP.pdf | archive-date = 2016-01-12 }}</ref> [[प्रतिबिंब (कंप्यूटर प्रोग्रामिंग)]] और [[मेटाऑब्जेक्ट|मेटाऑब्जेक्ट्स]], सब्जेक्ट ओरिएंटेड प्रोग्रामिंग, संरचना फ़िल्टर और अनुकूली प्रोग्रामिंग के प्रतिरूप हैं।<ref>"Adaptive Object Oriented Programming: The Demeter Approach with Propagation Patterns" ''Karl Liebherr'' 1996 {{ISBN|0-534-94602-X}} presents a well-worked version of essentially the same thing (Lieberherr subsequently recognized this and reframed his approach).</ref> [[ज़ेरॉक्स PARC|ज़ेरॉक्स पीएआरसी]] में [[ग्रेगोर किकज़ालेस]] और उनके सहयोगियों ने एओपी की स्पष्ट अवधारणा विकसित की थी, और इस प्रकार जावा के लिए एस्पेक्टजे एओपी एक्सटेंशन के साथ इसका अनुसरण किया गया था। इस प्रकार आईबीएम की अनुसंधान टीम ने भाषा डिजाइन दृष्टिकोण पर उपकरण दृष्टिकोण का अनुसरण किया और 2001 में हाइपर/जे और [[चिंता हेरफेर पर्यावरण|समस्या हेरफेर पर्यावरण]] प्रस्तावित किया, जिसका व्यापक उपयोग नहीं देखा गया है।
[[ज़ेरॉक्स PARC]] में [[ग्रेगोर किकज़ालेस]] और उनके सहयोगियों ने AOP की स्पष्ट अवधारणा विकसित की, और जावा के लिए AspectJ AOP एक्सटेंशन के साथ इसका अनुसरण किया। आईबीएम की अनुसंधान टीम ने भाषा डिजाइन दृष्टिकोण पर उपकरण दृष्टिकोण का अनुसरण किया और 2001 में हाइपर/जे और [[चिंता हेरफेर पर्यावरण]] प्रस्तावित किया, जिसका व्यापक उपयोग नहीं देखा गया है।
 
इस आलेख के उदाहरण AspectJ का उपयोग करते हैं।
 
[[Microsoft Transaction Server]] को AOP का पहला प्रमुख एप्लिकेशन माना जाता है, जिसके बाद [[Enterprise JavaBeans]] आता है।<ref name="BoxSells2002">{{cite book|author1=Don Box|author2=Chris Sells|title=Essential.NET: The common language runtime|url=https://archive.org/details/essentialnetcomm01boxd|url-access=registration|access-date=4 October 2011|date=4 November 2002|publisher=Addison-Wesley Professional|isbn=978-0-201-73411-9|page=[https://archive.org/details/essentialnetcomm01boxd/page/206 206]}}</ref><ref name="RomanSriganesh2005">{{cite book|last1=Roman|first1=Ed|last2=Sriganesh|first2=Rima Patel|last3=Brose|first3=Gerald|title=मास्टरिंग एंटरप्राइज JavaBeans|url=https://books.google.com/books?id=60oym_-uu3EC&pg=PA285|access-date=4 October 2011|date=1 January 2005|publisher=John Wiley and Sons|isbn=978-0-7645-8492-3|page=285}}</ref>


इस आलेख के उदाहरण एस्पेक्टजे का उपयोग करते हैं।


== प्रेरणा और बुनियादी अवधारणाएँ ==
[[Microsoft Transaction Server|माइक्रोसाॅफ्ट ट्रांसैक्शन सर्वर]] को एओपी का पहला प्रमुख एप्लिकेशन माना जाता है, जिसके बाद [[Enterprise JavaBeans|इंटरप्राइस जावाबींस]] आता है।<ref name="BoxSells2002">{{cite book|author1=Don Box|author2=Chris Sells|title=Essential.NET: The common language runtime|url=https://archive.org/details/essentialnetcomm01boxd|url-access=registration|access-date=4 October 2011|date=4 November 2002|publisher=Addison-Wesley Professional|isbn=978-0-201-73411-9|page=[https://archive.org/details/essentialnetcomm01boxd/page/206 206]}}</ref><ref name="RomanSriganesh2005">{{cite book|last1=Roman|first1=Ed|last2=Sriganesh|first2=Rima Patel|last3=Brose|first3=Gerald|title=मास्टरिंग एंटरप्राइज JavaBeans|url=https://books.google.com/books?id=60oym_-uu3EC&pg=PA285|access-date=4 October 2011|date=1 January 2005|publisher=John Wiley and Sons|isbn=978-0-7645-8492-3|page=285}}</ref>
आमतौर पर, पहलू कोड के रूप में बिखरा हुआ या उलझा हुआ होता है, जिससे इसे समझना और बनाए रखना कठिन हो जाता है। यह कार्य के आधार पर बिखरा हुआ है (जैसे लॉगिंग) कई असंबद्ध कार्यों में फैला हुआ है जो संभवतः पूरी तरह से असंबंधित प्रणालियों, विभिन्न स्रोत भाषाओं आदि में इसके कार्य का उपयोग कर सकता है। इसका मतलब है कि लॉगिंग को बदलने के लिए सभी प्रभावित मॉड्यूल को संशोधित करने की आवश्यकता हो सकती है। . पहलू न केवल सिस्टम के मेनलाइन फ़ंक्शन के साथ पेचीदा हो जाते हैं जिसमें वे अभिव्यक्त होते हैं बल्कि दूसरे के साथ भी। इसका मतलब है कि चिंता को बदलने के लिए सभी पेचीदा चिंताओं को समझना होगा या कुछ ऐसा साधन होना चाहिए जिससे परिवर्तनों के प्रभाव का अनुमान लगाया जा सके।
== प्रेरणा और मौलिक अवधारणाएँ ==
सामान्यतः, एस्पेक्ट कोड के रूप में यह प्रसारिस या उलझा हुआ होता है, जिससे इसे समझना और बनाए रखना कठिन हो जाता है। यह कार्य के आधार पर प्रसारित होता है, जैसे लॉगिंग इसका मुख्य उदाहरण हैं। इस प्रकार कई असंबद्ध कार्यों में यह प्रसारित होता है जो संभवतः पूर्ण रूप से असंबंधित प्रणालियों, विभिन्न स्रोत भाषाओं आदि में इसके कार्य का उपयोग कर सकता है। इसका अर्थ है कि लॉगिंग को परिवर्तित करने के लिए सभी प्रभावित मॉड्यूल को संशोधित करने की आवश्यकता हो सकती है। इस प्रकार एस्पेक्ट न केवल सिस्टम के मेनलाइन फ़ंक्शन के साथ अलग व्यवहार करता हैं, जिसमें वे अभिव्यक्त होते हैं बल्कि दूसरे के साथ भी इसी प्रकार रहते हैं। इसका अर्थ है कि समस्या को परिवर्तित करने के लिए सभी अलग प्रकार से आने वाली सम्स्याओं को समझना होगा या कुछ ऐसा साधन होना चाहिए जिससे परिवर्तनों के प्रभाव का अनुमान लगाया जा सके।


उदाहरण के लिए, खाते से दूसरे खाते में राशि स्थानांतरित करने के लिए अवधारणात्मक रूप से बहुत ही सरल विधि के साथ बैंकिंग एप्लिकेशन पर विचार करें:<ref>Note: The examples in this article appear in a syntax that resembles that of the [[Java (programming language)|Java]] language.</ref>
उदाहरण के लिए, खाते से दूसरे खाते में राशि स्थानांतरित करने के लिए अवधारणात्मक रूप से बहुत ही सरल विधि के साथ बैंकिंग एप्लिकेशन पर विचार करें:<ref>Note: The examples in this article appear in a syntax that resembles that of the [[Java (programming language)|Java]] language.</ref>
Line 35: Line 33:
}
}
</syntaxhighlight>
</syntaxhighlight>
हालांकि, यह स्थानांतरण विधि कुछ विचारों को अनदेखा करती है जो तैनात आवेदन की आवश्यकता होगी: यह सत्यापित करने के लिए सुरक्षा जांच की कमी है कि वर्तमान उपयोगकर्ता के पास इस ऑपरेशन को करने के लिए प्राधिकरण है; आकस्मिक डेटा हानि को रोकने के लिए [[डेटाबेस लेनदेन]] को ऑपरेशन को समाहित करना चाहिए; डायग्नोस्टिक्स के लिए, ऑपरेशन को सिस्टम लॉग आदि में लॉग इन किया जाना चाहिए।
चूंकि, यह स्थानांतरण विधि कुछ विचारों को अनदेखा करती है, जो इस प्रकार उपयोग में लाए जाने वाले एप्लीकेशन की आवश्यकता होगी: यह सत्यापित करने के लिए सुरक्षा जांच की कमी है कि वर्तमान उपयोगकर्ता के पास इस ऑपरेशन को करने के लिए प्राधिकरण है, इस प्रकार आकस्मिक डेटा हानि को रोकने के लिए [[डेटाबेस लेनदेन]] को ऑपरेशन को समाहित करना चाहिए, डायग्नोस्टिक्स के लिए, ऑपरेशन को सिस्टम लॉग आदि में लॉग इन किया जाना चाहिए।


उन सभी नई चिंताओं के साथ संस्करण, उदाहरण के लिए, कुछ इस तरह दिख सकता है:
उन सभी नई आने वाली सम्स्याओं के साथ संस्करण, उदाहरण के लिए, कुछ इस प्रकार दिख सकता है:


<syntaxhighlight lang="java">
<syntaxhighlight lang="java">
Line 62: Line 60:
}
}
</syntaxhighlight>
</syntaxhighlight>
इस उदाहरण में, अन्य रुचियाँ बुनियादी कार्यक्षमता (कभी-कभी व्यावसायिक तर्क चिंता कहा जाता है) के साथ उलझ गई हैं। लेन-देन, सुरक्षा और लॉगिंग सभी क्रॉस-कटिंग चिंताओं का उदाहरण देते हैं।
इस उदाहरण में, अन्य मौलिक कार्यक्षमता जिसे कभी-कभी व्यावसायिक तर्क समस्या कहा जाता है, इसके साथ उलझ गई हैं। इस प्रकार लेन-देन, सुरक्षा और लॉगिंग सभी क्रॉस-कटिंग आने वाली सम्स्याओं का उदाहरण देते हैं।


अब विचार करें कि क्या होता है यदि हमें अचानक (उदाहरण के लिए) आवेदन के लिए सुरक्षा विचारों को बदलने की आवश्यकता होती है। कार्यक्रम के वर्तमान संस्करण में, सुरक्षा से संबंधित संचालन कई तरीकों में बिखरा हुआ दिखाई देता है, और इस तरह के बदलाव के लिए बड़े प्रयास की आवश्यकता होगी।
अब विचार करें कि क्या होता है यदि हमें अचानक (उदाहरण के लिए) एप्लीकेशन के लिए सुरक्षा विचारों को परिवर्तित करने की आवश्यकता होती है। इस प्रकार फंक्शन के वर्तमान संस्करण में, सुरक्षा से संबंधित संचालन कई तरीकों में प्रसारित होता हुआ दिखाई देता है, और इस प्रकार के परिवर्तित कराव के लिए बड़े प्रयास की आवश्यकता होगी।


एओपी इस समस्या को हल करने का प्रयास करता है, प्रोग्रामर को स्टैंड-अलोन मॉड्यूल में क्रॉस-कटिंग चिंताओं को व्यक्त करने की अनुमति देता है जिसे पहलू कहा जाता है। पहलुओं में सलाह हो सकती है (प्रोग्राम में निर्दिष्ट बिंदुओं में शामिल कोड) और अंतर-प्रकार की घोषणाएं (संरचनात्मक सदस्यों को अन्य वर्गों में जोड़ा गया)। उदाहरण के लिए, सुरक्षा मॉड्यूल में ऐसी सलाह शामिल हो सकती है जो बैंक खाते तक पहुँचने से पहले सुरक्षा जाँच करती है। पॉइंटकट उस समय को परिभाषित करता है (जॉइन पॉइंट्स) जब कोई बैंक खाते तक पहुंच सकता है, और सलाह निकाय में कोड परिभाषित करता है कि सुरक्षा जांच कैसे लागू की जाती है। इस तरह, चेक और स्थानों दोनों को ही स्थान पर बनाए रखा जा सकता है। इसके अलावा, अच्छा पॉइंटकट बाद में कार्यक्रम में बदलाव का अनुमान लगा सकता है, इसलिए यदि कोई अन्य डेवलपर बैंक खाते तक पहुंचने के लिए नई विधि बनाता है, तो सलाह नई पद्धति पर लागू होगी जब यह निष्पादित होगी।
एओपी इस समस्या को हल करने का प्रयास करता है, प्रोग्रामर को स्टैंड-अलोन मॉड्यूल में क्रॉस-कटिंग आने वाली सम्स्याओं को व्यक्त करने की अनुमति देता है जिसे एस्पेक्ट कहा जाता है। ओरिएंटेशन में कमांड हो सकती है (प्रोग्राम में निर्दिष्ट बिंदुओं में सम्मिलित कोड) और अंतर-प्रकार की घोषणाएं (संरचनात्मक सदस्यों को अन्य वर्गों में जोड़ा गया)। उदाहरण के लिए, सुरक्षा मॉड्यूल में ऐसी कमांड सम्मिलित हो सकती है जो बैंक खाते तक पहुँचने से पहले सुरक्षा जाँच करती है। पॉइंटकट उस समय को परिभाषित करता है, इस प्रकार जॉइन पॉइंट्स जब कोई बैंक खाते तक पहुंच सकता है, और कमांड निकाय में कोड परिभाषित करता है कि सुरक्षा जांच कैसे लागू की जाती है। इस प्रकार, चेक और स्थानों दोनों को ही स्थान पर बनाए रखा जा सकता है। इसके अतिरिक्त, अच्छा पॉइंटकट बाद में फंक्शन में परिवर्तित होने का अनुमान लगा सकता है, इसलिए यदि कोई अन्य डेवलपर बैंक खाते तक पहुंचने के लिए नई विधि बनाता है, तो इस प्रकार कमांड नई पद्धति पर लागू होगी जब यह निष्पादित होगी।


इसलिए उपरोक्त उदाहरण के लिए पहलू में लॉगिंग लागू करना:
इसलिए उपरोक्त उदाहरण के लिए एस्पेक्ट में लॉगिंग लागू करना:


<syntaxhighlight lang="aspectj">
<syntaxhighlight lang="aspectj">
Line 83: Line 81:
}
}
</syntaxhighlight>
</syntaxhighlight>
कोई AOP को डिबगिंग टूल या उपयोगकर्ता-स्तरीय टूल के रूप में सोच सकता है। सलाह उन मामलों के लिए आरक्षित होनी चाहिए जहां आप फ़ंक्शन को बदल नहीं सकते (उपयोगकर्ता स्तर)<ref>{{cite web|url=https://www.नू.ऑर्ग/software/emacs/manual/html_node/elisp/Advising-Functions.html|title=नू.ऑर्ग|website=www.नू.ऑर्ग|access-date=5 May 2018|url-status=live|archive-url=https://web.archive.org/web/20171224053656/http://www.नू.ऑर्ग/software/emacs/manual/html_node/elisp/Advising-Functions.html|archive-date=24 December 2017}}</ref> या फ़ंक्शन को उत्पादन कोड (डीबगिंग) में बदलना नहीं चाहते हैं।
कोई एओपी को डिबगिंग टूल या उपयोगकर्ता-स्तरीय टूल के रूप में सोच सकता है। इस प्रकार कमांड उन स्थितियों के लिए आरक्षित होनी चाहिए जहां आप फ़ंक्शन को परिवर्तित कर नहीं सकते (उपयोगकर्ता स्तर)<ref>{{cite web|url=https://www.नू.ऑर्ग/software/emacs/manual/html_node/elisp/Advising-Functions.html|title=नू.ऑर्ग|website=www.नू.ऑर्ग|access-date=5 May 2018|url-status=live|archive-url=https://web.archive.org/web/20171224053656/http://www.नू.ऑर्ग/software/emacs/manual/html_node/elisp/Advising-Functions.html|archive-date=24 December 2017}}</ref> या फ़ंक्शन को उत्पादन कोड (डीबगिंग) में परिवर्तित करना नहीं चाहते हैं।


== बिंदु मॉडल से जुड़ें ==
== बिंदु मॉडल से संयोजन ==
पहलू-उन्मुख भाषा का सलाह-संबंधित घटक ज्वाइन पॉइंट मॉडल (JPM) को परिभाषित करता है। जेपीएम तीन चीजों को परिभाषित करता है:
एस्पेक्ट ओरिएंटेड भाषा का कमांड-संबंधित घटक ज्वाइन पॉइंट मॉडल (जेपीएम) को परिभाषित करता है। जेपीएम तीन चीजों को परिभाषित करता है:


# जब सलाह चल सकती है। इन्हें जॉइन पॉइंट्स कहा जाता है क्योंकि ये रनिंग प्रोग्राम में पॉइंट्स होते हैं जहाँ अतिरिक्त व्यवहार को उपयोगी रूप से जोड़ा जा सकता है। ज्वाइन पॉइंट को उपयोगी होने के लिए सामान्य प्रोग्रामर द्वारा पता करने योग्य और समझने योग्य होना चाहिए। इस तरह के बदलावों में पहलू स्थिर होने के लिए इसे असंगत कार्यक्रम परिवर्तनों में भी स्थिर होना चाहिए। कई AOP कार्यान्वयन विधि निष्पादन और फ़ील्ड संदर्भों को जुड़ने वाले बिंदुओं के रूप में समर्थन करते हैं।
# जब कमांड चल सकती है। इन्हें जॉइन पॉइंट्स कहा जाता है क्योंकि ये रनिंग प्रोग्राम में पॉइंट्स होते हैं जहाँ अतिरिक्त व्यवहार को उपयोगी रूप से जोड़ा जा सकता है। ज्वाइन पॉइंट को उपयोगी होने के लिए सामान्य प्रोग्रामर द्वारा पता करने योग्य और समझने योग्य होना चाहिए। इस प्रकार के परिवर्तित करने में एस्पेक्ट स्थिर होने के लिए इसे असंगत फंक्शन परिवर्तनों में भी स्थिर होना चाहिए। कई एओपी कार्यान्वयन विधि निष्पादन और फ़ील्ड संदर्भों को जुड़ने वाले बिंदुओं के रूप में समर्थन करते हैं।
# बिंदुओं को जोड़ने (या परिमाणित) करने का तरीका, जिसे पॉइंटकट कहा जाता है। पॉइंटकट निर्धारित करते हैं कि दिया गया ज्वाइन पॉइंट मैच करता है या नहीं। अधिकांश उपयोगी पॉइंटकट लैंग्वेज बेस लैंग्वेज जैसे सिंटैक्स का उपयोग करती हैं (उदाहरण के लिए, AspectJ जावा सिग्नेचर का उपयोग करता है) और नामकरण और संयोजन के माध्यम से पुन: उपयोग की अनुमति देता है।
# बिंदुओं को जोड़ने (या परिमाणित) करने का तरीका, जिसे पॉइंटकट कहा जाता है। पॉइंटकट निर्धारित करते हैं कि दिया गया ज्वाइन पॉइंट मैच करता है या नहीं। अधिकांश उपयोगी पॉइंटकट लैंग्वेज बेस लैंग्वेज जैसे सिंटैक्स का उपयोग करती हैं (उदाहरण के लिए, एस्पेक्टजे जावा सिग्नेचर का उपयोग करता है) और नामकरण और संयोजन के माध्यम से पुन: उपयोग की अनुमति देता है।
# जुड़ने के बिंदु पर चलने के लिए कोड निर्दिष्ट करने का साधन। AspectJ इस सलाह को आस्पेक्ट-ओरिएंटेड प्रोग्रामिंग में कॉल करता है, और इसे ज्वाइन पॉइंट्स के पहले, बाद में और आसपास चला सकता है। कुछ कार्यान्वयन किसी अन्य वर्ग पर पहलू में विधि को परिभाषित करने जैसी चीजों का भी समर्थन करते हैं।
# जुड़ने के बिंदु पर चलने के लिए कोड निर्दिष्ट करने का साधन हैं। एस्पेक्टजे इस कमांड को आस्पेक्ट-ओरिएंटेड प्रोग्रामिंग में कॉल करता है, और इसे ज्वाइन पॉइंट्स के पहले, बाद में और आसपास चला सकता है। कुछ कार्यान्वयन किसी अन्य वर्ग पर एस्पेक्ट में विधि को परिभाषित करने जैसी चीजों का भी समर्थन करते हैं।


जॉइन-पॉइंट मॉडल की तुलना जॉइन पॉइंट्स के आधार पर की जा सकती है, जॉइन पॉइंट्स कैसे निर्दिष्ट किए जाते हैं, जॉइन पॉइंट्स पर अनुमत संचालन और संरचनात्मक संवर्द्धन जो व्यक्त किए जा सकते हैं।
जॉइन-पॉइंट मॉडल की तुलना जॉइन पॉइंट्स के आधार पर की जा सकती है, जॉइन पॉइंट्स कैसे निर्दिष्ट किए जाते हैं, इस प्रकार जॉइन पॉइंट्स पर अनुमत संचालन और संरचनात्मक संवर्द्धन जो व्यक्त किए जा सकते हैं।


=== AspectJ का ज्वाइन-पॉइंट मॉडल ===
=== एस्पेक्टजे का ज्वाइन-पॉइंट मॉडल ===
{{Main article|AspectJ }}
{{Main article|एस्पेक्ट जे}}
{{unordered list
{{unordered list
| The join points in AspectJ include method or constructor call or execution, the initialization of a class or object, field read and write access, exception handlers, etc. They do not include loops, super calls, throws clauses, multiple statements, etc.
| एस्पेक्टजे में जुड़ने वाले बिंदुओं में विधि या कन्स्ट्रक्टर कॉल या निष्पादन, कक्षा या ऑब्जेक्ट का प्रारंभ, फ़ील्ड पढ़ने और लिखने का उपयोग, अपवाद हैंडलर इत्यादि सम्मिलित हैं। इसमें लूप, सुपर कॉल, फेंक खंड, एकाधिक कथन इत्यादि सम्मिलित नहीं हैं।| पॉइंटकट 'आदिम पॉइंटकट डिज़ाइनर' (PCDs) के संयोजन द्वारा निर्दिष्ट किए जाते हैं।
| Pointcuts are specified by combinations of ''primitive pointcut designators'' (PCDs).


"Kinded" PCDs match a particular kind of join point (e.g., method execution) and tend to take as input a Java-like signature. One such pointcut looks like this:
"किंडेड" पीसीडी एक विशेष प्रकार के जॉइन पॉइंट (जैसे, विधि निष्पादन) से मेल खाते हैं और इनपुट के रूप में जावा-जैसे हस्ताक्षर लेते हैं। ऐसा ही एक पॉइंटकट इस तरह दिखता है:


   execution(* set*(*))
   execution(* set*(*))


This pointcut matches a method-execution join point, if the method name starts with "<code>set</code>" and there is exactly one argument of any type.
यदि विधि नाम से शुरू होता है, तो यह पॉइंटकट विधि-निष्पादन ज्वाइन पॉइंट से मेल खाता है"<code>set</code>" और किसी भी प्रकार का एक ही तर्क है।


"Dynamic" PCDs check runtime types and bind variables. For example,
"गतिशील" पीसीडी रनटाइम प्रकारों की जांच करते हैं और वेरिएबल्स को बाइंड करते हैं। उदाहरण के लिए,


   this(Point)
   this(Point)


This pointcut matches when the currently executing object is an instance of class <code>Point</code>. Note that the unqualified name of a class can be used via Java's normal type lookup.
यह पॉइंटकट तब मेल खाता है जब वर्तमान में निष्पादित वस्तु वर्ग का एक उदाहरण है <code>Point</code>.ध्यान दें कि जावा के सामान्य प्रकार के लुकअप के माध्यम से कक्षा के अयोग्य नाम का उपयोग किया जा सकता है।


"Scope" PCDs limit the lexical scope of the join point. For example:
"स्कोप" PCDs ज्वाइन पॉइंट के लेक्सिकल स्कोप को सीमित करते हैं। उदाहरण के लिए:


   within(com.company.*)
   within(com.company.*)


This pointcut matches any join point in any type in the <code>com.company</code> package. The ''<code>*</code>'' is one form of the wildcards that can be used to match many things with one signature.
यह पॉइंटकट किसी भी प्रकार के किसी भी जॉइन पॉइंट से मेल खाता है <code>com.company</code> पैकेज,  ''<code>*</code>'' वाइल्डकार्ड का एक रूप है जिसका उपयोग एक हस्ताक्षर से कई चीजों का मिलान करने के लिए किया जा सकता है।


Pointcuts can be composed and named for reuse. For example:
पॉइंटकट की रचना की जा सकती है और पुन: उपयोग के लिए नामित किया जा सकता है। उदाहरण के लिए:
<syntaxhighlight lang="aspectj">
<syntaxhighlight lang="aspectj">
  pointcut set() : execution(* set*(*) ) && this(Point) && within(com.company.*);
  pointcut set() : execution(* set*(*) ) && this(Point) && within(com.company.*);
</syntaxhighlight>
</syntaxhighlight>
This pointcut matches a method-execution join point, if the method name starts with "<code>set</code>" and <code>this</code> is an instance of type <code>Point</code> in the <code>com.company</code> package. It can be referred to using the name "<code>set()</code>".
यदि विधि नाम से शुरू होता है, तो यह पॉइंटकट विधि-निष्पादन ज्वाइन पॉइंट से मेल खाता है "<code>set</code>" और <code>this</code> प्रकार का उदाहरण है <code>Point</code> में <code>com.company</code> पैकेज रहता हैं। इसे नाम का उपयोग करके संदर्भित किया जा सकता है "<code>set()</code>".


| Advice specifies to run at (before, after, or around) a join point (specified with a pointcut) certain code (specified like code in a method). The AOP runtime invokes Advice automatically when the pointcut matches the join point. For example:
|यह कमांड एक निश्चित कोड (एक विधि में कोड की तरह निर्दिष्ट) एक ज्वाइन पॉइंट (पॉइंटकट के साथ निर्दिष्ट) पर (पहले, बाद में, या आसपास) चलाने के लिए निर्दिष्ट करती है। जब पॉइंटकट ज्वाइन पॉइंट से मेल खाता है तो एओपी रनटाइम सलाह को स्वचालित रूप से आमंत्रित करता है। उदाहरण के लिए:
<syntaxhighlight lang="aspectj">
<syntaxhighlight lang="aspectj">
  after() : set() {
  after() : set() {
Line 131: Line 128:
</syntaxhighlight>
</syntaxhighlight>


This effectively specifies: "if the ''<code>set()</code>'' pointcut matches the join point, run the code <code>Display.update()</code> after the join point completes."}}
यह प्रभावी रूप से निर्दिष्ट करता है: "if the ''<code>set()</code>'' pointcut matches the join point, run the code <code>Display.update()</code> after the join point completes."}}


=== अन्य संभावित ज्वाइन पॉइंट मॉडल ===
=== अन्य संभावित ज्वाइन पॉइंट मॉडल ===
अन्य प्रकार के जेपीएम हैं। सभी सलाह भाषाओं को उनके JPM के संदर्भ में परिभाषित किया जा सकता है। उदाहरण के लिए, [[एकीकृत मॉडलिंग भाषा]] के लिए काल्पनिक पहलू भाषा में निम्नलिखित JPM हो सकते हैं:
अन्य प्रकार के जेपीएम हैं। सभी कमांड भाषाओं को उनके जेपीएम के संदर्भ में परिभाषित किया जा सकता है। इस प्रकार उदाहरण के लिए, [[एकीकृत मॉडलिंग भाषा]] के लिए काल्पनिक एस्पेक्ट भाषा में निम्नलिखित जेपीएम हो सकते हैं:


* ज्वाइन पॉइंट सभी मॉडल तत्व हैं।
* ज्वाइन पॉइंट सभी मॉडल तत्व हैं।
Line 141: Line 138:


=== अंतर-प्रकार की घोषणाएं ===
=== अंतर-प्रकार की घोषणाएं ===
अंतर-प्रकार की घोषणा मॉड्यूल की संरचना को प्रभावित करने वाली क्रॉसकटिंग चिंताओं को व्यक्त करने का तरीका प्रदान करती है। खुली कक्षाओं और [[विस्तार विधि]]यों के रूप में भी जाना जाता है, यह प्रोग्रामर को स्थान पर सदस्यों या किसी अन्य वर्ग के माता-पिता की घोषणा करने में सक्षम बनाता है, आमतौर पर पहलू से संबंधित सभी कोड को संयोजित करने के लिए। उदाहरण के लिए, यदि प्रोग्रामर ने इसके बजाय आगंतुकों का उपयोग करके क्रॉसकटिंग डिस्प्ले-अपडेट चिंता को लागू किया, तो [[आगंतुक पैटर्न]] का उपयोग करते हुए अंतर-प्रकार की घोषणा AspectJ में इस तरह दिखाई दे सकती है:
अंतर-प्रकार की घोषणा मॉड्यूल की संरचना को प्रभावित करने वाली क्रॉसकटिंग आने वाली सम्स्याओं को व्यक्त करने का तरीका प्रदान करती है। खुली क्लासेस और [[विस्तार विधि]]यों के रूप में भी जाना जाता है, यह प्रोग्रामर को स्थान पर सदस्यों या किसी अन्य वर्ग के पैरेंट की घोषणा करने में सक्षम बनाता है, सामान्यतः एस्पेक्ट से संबंधित सभी कोड को संयोजित करने के लिए किया जाता हैं। इस प्रकार उदाहरण के लिए, यदि प्रोग्रामर ने इसके अतिरिक्त आगंतुकों का उपयोग करके क्रॉसकटिंग डिस्प्ले-अपडेट समस्या को लागू किया, तो [[आगंतुक पैटर्न]] का उपयोग करते हुए अंतर-प्रकार की घोषणा एस्पेक्टजे में इस प्रकार दिखाई दे सकती है:


<syntaxhighlight lang="aspectj">
<syntaxhighlight lang="aspectj">
Line 151: Line 148:
   }
   }
</syntaxhighlight>
</syntaxhighlight>
यह कोड स्निपेट जोड़ता है <code>acceptVisitor</code> विधि को <code>Point</code> कक्षा।
यह कोड स्निपेट जोड़ता है, जिसमें <code>acceptVisitor</code> विधि को <code>Point</code> की क्लास के रूप में उपयोग करते हैं।


यह आवश्यकता है कि कोई भी संरचनात्मक परिवर्धन मूल वर्ग के साथ संगत हो, ताकि मौजूदा वर्ग के ग्राहक तब तक काम करते रहें, जब तक कि AOP कार्यान्वयन सभी ग्राहकों को हर समय नियंत्रित करने की अपेक्षा नहीं कर सकता।
यह आवश्यकता है कि कोई भी संरचनात्मक परिवर्धन मूल वर्ग के साथ संगत हो, जिससे कि इस प्रकार वर्तमान वर्ग के ग्राहक तब तक कार्य करते रहें, जब तक कि एओपी कार्यान्वयन सभी ग्राहकों को हर समय नियंत्रित करने की अपेक्षा नहीं करते हैं।


== कार्यान्वयन ==
== कार्यान्वयन ==
अंतर्निहित भाषाओं और परिवेशों के आधार पर AOP प्रोग्राम अन्य प्रोग्रामों को दो अलग-अलग तरीकों से प्रभावित कर सकते हैं:
अंतर्निहित भाषाओं और परिवेशों के आधार पर एओपी प्रोग्राम अन्य प्रोग्रामों को दो अलग-अलग तरीकों से प्रभावित कर सकते हैं:


# एक संयुक्त कार्यक्रम तैयार किया जाता है, जो मूल भाषा में मान्य होता है और सामान्य कार्यक्रम से अंतिम दुभाषिया तक अप्रभेद्य होता है
# एक संयुक्त फंक्शन तैयार किया जाता है, जो मूल भाषा में मान्य होता है और सामान्य फंक्शन से अंतिम दुभाषिया तक अप्रभेद्य होता है
# एओपी सुविधाओं को समझने और लागू करने के लिए अंतिम दुभाषिया या पर्यावरण को अद्यतन किया गया है।
# एओपी सुविधाओं को समझने और लागू करने के लिए अंतिम दुभाषिया या पर्यावरण को अद्यतन किया गया है।


बदलते वातावरण की कठिनाई का मतलब है कि अधिकांश कार्यान्वयन प्रकार के [[कार्यक्रम परिवर्तन]] के माध्यम से संगत संयोजन कार्यक्रम तैयार करते हैं जिन्हें बुनाई के रूप में जाना जाता है। [[पहलू बुनकर]] पहलू-उन्मुख कोड पढ़ता है और एकीकृत पहलुओं के साथ उपयुक्त वस्तु-उन्मुख कोड उत्पन्न करता है। ही AOP भाषा को विभिन्न प्रकार की बुनाई विधियों के माध्यम से लागू किया जा सकता है, इसलिए किसी भाषा के शब्दार्थ को कभी भी बुनाई के कार्यान्वयन के संदर्भ में नहीं समझा जाना चाहिए। संयोजन की किस विधि का उपयोग किया जाता है, केवल कार्यान्वयन की गति और इसकी तैनाती में आसानी प्रभावित होती है।
परिवर्तित करते वातावरण की कठिनाई का अर्थ है कि अधिकांश कार्यान्वयन प्रकार के [[कार्यक्रम परिवर्तन|फंक्शन परिवर्तन]] के माध्यम से संगत संयोजन फंक्शन तैयार करते हैं जिन्हें बुनाई के रूप में जाना जाता है। [[पहलू बुनकर|एस्पेक्ट प्रोग्रामर]] एस्पेक्ट ओरिएंटेड कोड पढ़ते है और एकीकृत ओरिएंटेशन के साथ उपयुक्त वस्तु-उन्मुख कोड उत्पन्न करता है। इस प्रकार एओपी भाषा को विभिन्न प्रकार की बुनाई विधियों के माध्यम से लागू किया जा सकता है, इसलिए किसी भाषा के शब्दार्थ को कभी भी इसके कार्यान्वयन के संदर्भ में नहीं समझा जाना चाहिए। इस संयोजन की किस विधि का उपयोग किया जाता है, केवल कार्यान्वयन की गति और इसकी उपयोग में लाए जाने वालेी में सरलता प्रभावित होती है।


सिस्टम प्रीप्रोसेसरों का उपयोग करके स्रोत-स्तर की बुनाई को लागू कर सकता है (जैसा कि C ++ मूल रूप से [[CFront]] में लागू किया गया था) जिसके लिए प्रोग्राम स्रोत फ़ाइलों तक पहुंच की आवश्यकता होती है। हालाँकि, जावा का अच्छी तरह से परिभाषित बाइनरी फॉर्म बायटेकोड बुनकरों को किसी भी जावा प्रोग्राम के साथ .class-file फॉर्म में काम करने में सक्षम बनाता है। बाइटकोड बुनकरों को निर्माण प्रक्रिया के दौरान तैनात किया जा सकता है या, यदि वर्ग लोडिंग के दौरान बुनाई मॉडल प्रति-वर्ग है। AspectJ ने 2001 में स्रोत-स्तर की बुनाई के साथ शुरुआत की, 2002 में प्रति-श्रेणी बायटेकोड वीवर दिया, और 2005 में [[AspectWerkz]] के एकीकरण के बाद उन्नत लोड-टाइम समर्थन की पेशकश की।
सिस्टम प्रीप्रोसेसरों का उपयोग करके स्रोत-स्तर की बुनाई को लागू कर सकता है, जैसा कि C ++ मूल रूप से [[CFront|सी फ्रंट]] में लागू किया गया था, जिसके लिए प्रोग्राम स्रोत फ़ाइलों तक पहुंच की आवश्यकता होती है। चूंकि, जावा का अच्छी तरह से परिभाषित बाइनरी फॉर्म बायटेकोड बुनकरों को किसी भी जावा प्रोग्राम के साथ .class-file फॉर्म में कार्य करने में सक्षम बनाता है। बाइटकोड बनाने वालों को निर्माण प्रक्रिया के समय उपयोग में लाए जाने वाले किया जा सकता है या, यदि वर्ग लोडिंग के समय बुनाई मॉडल प्रति-वर्ग है। इस प्रकार एस्पेक्टजे ने 2001 में स्रोत-स्तर की बुनाई के साथ प्रारंभ की, 2002 में प्रति-श्रेणी बायटेकोड वीवर दिया, और 2005 में [[AspectWerkz|एस्पेक्ट वर्क्ज]] के एकीकरण के बाद उन्नत लोड-टाइम समर्थन की प्रस्तुति की हैं।


कोई भी समाधान जो प्रोग्राम को रनटाइम पर जोड़ता है उसे ऐसे विचार प्रदान करने होते हैं जो प्रोग्रामर के अलग-अलग मॉडल को बनाए रखने के लिए उन्हें ठीक से अलग करते हैं। एकाधिक स्रोत फ़ाइलों के लिए जावा का बायटेकोड समर्थन किसी भी डिबगर को स्रोत संपादक में ठीक से बुनी गई .class फ़ाइल के माध्यम से आगे बढ़ने में सक्षम बनाता है। हालाँकि, कुछ तृतीय-पक्ष डिकंपाइलर बुने हुए कोड को संसाधित नहीं कर सकते हैं क्योंकि वे सभी समर्थित बायटेकोड रूपों के बजाय जावैक द्वारा निर्मित कोड की अपेक्षा करते हैं (नीचे #Criticism|§ आलोचना भी देखें)।
कोई भी समाधान जो प्रोग्राम को रनटाइम पर जोड़ता है उसे ऐसे विचार प्रदान करने होते हैं, जो इस प्रकार प्रोग्रामर के अलग-अलग मॉडल को बनाए रखने के लिए उन्हें ठीक से अलग करते हैं। एकाधिक स्रोत फ़ाइलों के लिए जावा का बायटेकोड समर्थन किसी भी डिबगर को स्रोत संपादक में ठीक से बुनी गई .class फ़ाइल के माध्यम से आगे बढ़ने में सक्षम बनाता है। चूंकि, कुछ तृतीय-पक्ष डिकंपाइलर बुने हुए कोड को संसाधित नहीं कर सकते हैं क्योंकि वे सभी समर्थित बायटेकोड रूपों के अतिरिक्त जावैक द्वारा निर्मित कोड की अपेक्षा करते हैं।


[[तैनाती-समय]] की बुनाई और दृष्टिकोण प्रदान करती है।<ref>{{cite web |url=http://www.forum2.org/tal/AspectJ2EE.pdf |title=संग्रहीत प्रति|access-date=2005-06-19 |url-status=dead |archive-url=https://web.archive.org/web/20051008065854/http://www.forum2.org/tal/AspectJ2EE.pdf |archive-date=2005-10-08 }}</ref> यह मूल रूप से पोस्ट-प्रोसेसिंग का अर्थ है, लेकिन उत्पन्न कोड को पैच करने के बजाय, यह बुनाई दृष्टिकोण मौजूदा वर्गों को उपवर्गित करता है ताकि संशोधनों को विधि-ओवरराइडिंग द्वारा पेश किया जा सके। मौजूदा कक्षाएं रनटाइम पर भी अछूती रहती हैं, और विकास के दौरान सभी मौजूदा टूल्स (डीबगर, प्रोफाइलर इत्यादि) का उपयोग किया जा सकता है। [[आईबीएम]] के [[वेबस्फेयर]] जैसे कई [[ चल देना |चल देना]] ई एप्लिकेशन सर्वरों के कार्यान्वयन में समान दृष्टिकोण पहले ही साबित हो चुका है।
[[तैनाती-समय|उपयोग में लाए जाने वालेी-समय]] की बुनाई और दृष्टिकोण प्रदान करती है।<ref>{{cite web |url=http://www.forum2.org/tal/AspectJ2EE.pdf |title=संग्रहीत प्रति|access-date=2005-06-19 |url-status=dead |archive-url=https://web.archive.org/web/20051008065854/http://www.forum2.org/tal/AspectJ2EE.pdf |archive-date=2005-10-08 }}</ref> यह मूल रूप से पोस्ट-प्रोसेसिंग का अर्थ है, अपितु उत्पन्न कोड को पैच करने के अतिरिक्त, यह बुनाई दृष्टिकोण वर्तमान वर्गों को उपवर्गित करता है जिससे कि संशोधनों को विधि-ओवरराइडिंग द्वारा प्रस्तुत किया जा सके। वर्तमान क्लासेस रनटाइम पर भी उपयोग नहीं होती हैं, और इस प्रकार विकास के समय सभी वर्तमान टूल्स जैसे डीबगर, प्रोफाइलर इत्यादि का उपयोग किया जा सकता है। इस प्रकार [[आईबीएम]] के [[वेबस्फेयर]] जैसे कई [[ चल देना |चल देना]] ई एप्लिकेशन सर्वरों के कार्यान्वयन में समान दृष्टिकोण पहले ही साबित हो चुका है।


=== शब्दावली ===
=== शब्दावली ===


पहलू-उन्मुख प्रोग्रामिंग में प्रयुक्त मानक शब्दावली में शामिल हो सकते हैं:
एस्पेक्ट ओरिएंटेड प्रोग्रामिंग में प्रयुक्त मानक शब्दावली में सम्मिलित हो सकते हैं:
 
;फिल्म आदि में दृश्यों के संपादन संबंधी समस्याएँ: {{main article|क्रास कटिंग कंसर्न}} भले ही OO मॉडल में अधिकांश वर्ग एकल, विशिष्ट कार्य करेंगे, वे अधिकांशतः अन्य वर्गों के साथ सामान्य, द्वितीयक आवश्यकताओं को साझा करते हैं। उदाहरण के लिए, जब भी कोई थ्रेड किसी विधि में प्रवेश करता है या बाहर निकलता है, तो हम डेटा-एक्सेस परत के भीतर क्लासेस में और यूआई परत में क्लासेस में भी लॉगिंग जोड़ना चाह सकते हैं। इस प्रकार आगे की आने वाली इस प्रकार की सम्स्याएँ सुरक्षा से संबंधित हो सकती हैं जैसे एक्सेस कंट्रोल # कंप्यूटर सुरक्षा<ref name="dewin2002">B. De Win, B. Vanhaute and B. De Decker. "Security through aspect-oriented programming". In ''Advances in Network and Distributed Systems Security'' (2002).</ref> या [[सूचना प्रवाह (सूचना सिद्धांत)]]।<ref name="pasquier2014">T. Pasquier, J. Bacon and B. Shand. "FlowR: Aspect Oriented Programming for Information Flow Control in Ruby". In ''ACM Proceedings of the 13th international conference on Modularity (Aspect Oriented Software Development)'' (2014).</ref> भले ही प्रत्येक वर्ग की बहुत अलग प्राथमिक कार्यक्षमता है, इस प्रकार द्वितीयक कार्यक्षमता करने के लिए आवश्यक कोड अधिकांशतः समान होता है।
;कमांड: {{main article|ए़डवाइस प्रोग्रामिंग}} यह वह अतिरिक्त कोड है जिसे आप अपने वर्तमान मॉडल पर लागू करना चाहते हैं। हमारे उदाहरण में, यह लॉगिंग कोड है जिसे हम तब लागू करना चाहते हैं जब थ्रेड किसी विधि में प्रवेश करता है या बाहर निकलता है।
 
प्वाइंटकट: {{main article|प्वाइंटकट}}


;फिल्म आदि में दृश्यों के संपादन संबंधी चिंताएं: {{main article|Cross-cutting concern}} भले ही OO मॉडल में अधिकांश वर्ग एकल, विशिष्ट कार्य करेंगे, वे अक्सर अन्य वर्गों के साथ सामान्य, द्वितीयक आवश्यकताओं को साझा करते हैं। उदाहरण के लिए, जब भी कोई थ्रेड किसी विधि में प्रवेश करता है या बाहर निकलता है, तो हम डेटा-एक्सेस परत के भीतर कक्षाओं में और यूआई परत में कक्षाओं में भी लॉगिंग जोड़ना चाह सकते हैं। आगे की चिंताएँ सुरक्षा से संबंधित हो सकती हैं जैसे एक्सेस कंट्रोल # कंप्यूटर सुरक्षा<ref name="dewin2002">B. De Win, B. Vanhaute and B. De Decker. "Security through aspect-oriented programming". In ''Advances in Network and Distributed Systems Security'' (2002).</ref> या [[सूचना प्रवाह (सूचना सिद्धांत)]]।<ref name="pasquier2014">T. Pasquier, J. Bacon and B. Shand. "FlowR: Aspect Oriented Programming for Information Flow Control in Ruby". In ''ACM Proceedings of the 13th international conference on Modularity (Aspect Oriented Software Development)'' (2014).</ref> भले ही प्रत्येक वर्ग की बहुत अलग प्राथमिक कार्यक्षमता है, द्वितीयक कार्यक्षमता करने के लिए आवश्यक कोड अक्सर समान होता है।
यह एप्लीकेशन में निष्पादन के बिंदु को दिया गया शब्द है जिस पर क्रॉस-कटिंग समस्या को लागू करने की आवश्यकता है। हमारे उदाहरण में, जब थ्रेड किसी मेथड में प्रवेश करता है तो पॉइंटकट पहुँच जाता है, और जब थ्रेड मेथड से बाहर निकलता है तो और पॉइंटकट पहुँच जाता है।
;सलाह: {{main article|Advice (programming)}} यह वह अतिरिक्त कोड है जिसे आप अपने मौजूदा मॉडल पर लागू करना चाहते हैं। हमारे उदाहरण में, यह लॉगिंग कोड है जिसे हम तब लागू करना चाहते हैं जब थ्रेड किसी विधि में प्रवेश करता है या बाहर निकलता है।
;एस्पेक्ट: {{main article|एस्पेक्ट (कम्प्यूटर विज्ञान)}} पॉइंटकट और कमांड के संयोजन को एस्पेक्ट कहा जाता है। उपरोक्त उदाहरण में, हम पॉइंटकट को परिभाषित करके और सही कमांड देकर अपने एप्लिकेशन में लॉगिंग एस्पेक्ट जोड़ते हैं।
प्वाइंटकट: {{main article|Pointcut}} यह आवेदन में निष्पादन के बिंदु को दिया गया शब्द है जिस पर क्रॉस-कटिंग चिंता को लागू करने की आवश्यकता है। हमारे उदाहरण में, जब थ्रेड किसी मेथड में प्रवेश करता है तो पॉइंटकट पहुँच जाता है, और जब थ्रेड मेथड से बाहर निकलता है तो और पॉइंटकट पहुँच जाता है।
;पहलू: {{main article|Aspect (computer science)}} पॉइंटकट और सलाह के संयोजन को पहलू कहा जाता है। उपरोक्त उदाहरण में, हम पॉइंटकट को परिभाषित करके और सही सलाह देकर अपने एप्लिकेशन में लॉगिंग पहलू जोड़ते हैं।


== अन्य प्रोग्रामिंग प्रतिमानों की तुलना ==
== अन्य प्रोग्रामिंग ओरिएंटेशन की तुलना ==
वस्तु-उन्मुख प्रोग्रामिंग और [[कम्प्यूटेशनल प्रतिबिंब]] से उभरे पहलू। AOP भाषाओं में कार्यक्षमता समान होती है, लेकिन मेटाऑब्जेक्ट की तुलना में अधिक प्रतिबंधित होती है। पहलू प्रोग्रामिंग अवधारणाओं जैसे विषयों (प्रोग्रामिंग), मिश्रण, और [[प्रतिनिधिमंडल (प्रोग्रामिंग)]] से निकटता से संबंधित हैं। पहलू-उन्मुख प्रोग्रामिंग प्रतिमानों का उपयोग करने के अन्य तरीकों में सं[[रचना फ़िल्टर]] और हाइपर/जे दृष्टिकोण शामिल हैं। कम से कम 1970 के दशक के बाद से, डेवलपर्स इंटरसेप्शन और डिस्पैच-पैचिंग के रूपों का उपयोग कर रहे हैं जो AOP के लिए कार्यान्वयन के कुछ तरीकों से मिलते जुलते हैं, लेकिन इनमें कभी भी ऐसा शब्दार्थ नहीं था जो क्रॉसकटिंग विनिर्देशों को ही स्थान पर लिखा गया हो।  
वस्तु-उन्मुख प्रोग्रामिंग और [[कम्प्यूटेशनल प्रतिबिंब]] से एस्पेक्ट उपओग होते हैं। एओपी भाषाओं में कार्यक्षमता समान होती है, अपितु मेटाऑब्जेक्ट की तुलना में अधिक प्रतिबंधित होती है। इस प्रकार एस्पेक्ट प्रोग्रामिंग अवधारणाओं जैसे विषयों (प्रोग्रामिंग), मिश्रण, और [[प्रतिनिधिमंडल (प्रोग्रामिंग)]] से निकटता से संबंधित हैं। एस्पेक्ट ओरिएंटेड प्रोग्रामिंग ओरिएंटेशन का उपयोग करने के अन्य तरीकों में सं[[रचना फ़िल्टर]] और हाइपर/जे दृष्टिकोण सम्मिलित हैं। इस प्रकार कम से कम 1970 के दशक के बाद से, डेवलपर्स इंटरसेप्शन और डिस्पैच-पैचिंग के रूपों का उपयोग कर रहे हैं जो एओपी के लिए कार्यान्वयन के कुछ तरीकों से मिलते जुलते हैं, अपितु इनमें कभी भी ऐसा शब्दार्थ नहीं था जो क्रॉसकटिंग विनिर्देशों को ही स्थान पर लिखा गया हो।  


डिजाइनरों ने कोड के पृथक्करण को प्राप्त करने के वैकल्पिक तरीकों पर विचार किया है, जैसे कि C Sharp (प्रोग्रामिंग भाषा) | C# के आंशिक प्रकार, लेकिन ऐसे दृष्टिकोणों में परिमाणीकरण तंत्र की कमी होती है जो घोषणात्मक कथन के साथ कोड के कई जुड़ने वाले बिंदुओं तक पहुँचने की अनुमति देता है।
डिजाइनरों ने कोड के पृथक्करण को प्राप्त करने के वैकल्पिक तरीकों पर विचार किया है, जैसे कि C शार्प (प्रोग्रामिंग भाषा) या C# के आंशिक प्रकार, अपितु ऐसे दृष्टिकोणों में परिमाणीकरण तंत्र की कमी होती है जो घोषणात्मक कथन के साथ कोड के कई जुड़ने वाले बिंदुओं तक पहुँचने की अनुमति देता है।


हालांकि यह असंबंधित प्रतीत हो सकता है, परीक्षण में, मॉक या स्टब्स के उपयोग के लिए एओपी तकनीकों के उपयोग की आवश्यकता होती है, जैसे सलाह के आसपास, और आगे। यहां सहयोगी वस्तुएं परीक्षण के उद्देश्य के लिए हैं, क्रॉस कटिंग चिंता। इस प्रकार विभिन्न मॉक ऑब्जेक्ट फ्रेमवर्क ये सुविधाएँ प्रदान करते हैं। उदाहरण के लिए, प्रक्रिया शेष राशि प्राप्त करने के लिए सेवा का आह्वान करती है। प्रक्रिया के परीक्षण में, जहां से राशि आती है वह महत्वहीन है, केवल यह कि प्रक्रिया आवश्यकताओं के अनुसार शेष राशि का उपयोग करती है।
चूंकि यह असंबंधित प्रतीत हो सकता है, परीक्षण में, मॉक या स्टब्स के उपयोग के लिए एओपी तकनीकों के उपयोग की आवश्यकता होती है, जैसे कमांड के आसपास, और आगे उपलब्ध होते हैं। यहां सहयोगी वस्तुएं परीक्षण के उद्देश्य के लिए क्रॉस कटिंग समस्या हैं। इस प्रकार विभिन्न मॉक ऑब्जेक्ट फ्रेमवर्क ये सुविधाएँ प्रदान करते हैं। इस प्रकार उदाहरण के लिए, प्रक्रिया शेष राशि प्राप्त करने के लिए सेवा का आह्वान करती है। प्रक्रिया के परीक्षण में, जहां से राशि आती है वह महत्वहीन है, केवल यह कि प्रक्रिया आवश्यकताओं के अनुसार शेष राशि का उपयोग करती है।


== गोद लेने के मुद्दे ==
== रीफैक्टरिंग की समस्याएँ ==


त्रुटियों को रोकने के लिए प्रोग्रामर को कोड पढ़ने और समझने में सक्षम होना चाहिए कि क्या हो रहा है।<ref>[[Edsger Dijkstra]], [http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD249.PDF ''Notes on Structured Programming''] {{webarchive|url=https://web.archive.org/web/20061012020239/http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD249.PDF |date=2006-10-12 }}, pg. 1-2</ref>
त्रुटियों को रोकने के लिए प्रोग्रामर को कोड पढ़ने और समझने में सक्षम होना चाहिए कि क्या हो रहा है।<ref>[[Edsger Dijkstra]], [http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD249.PDF ''Notes on Structured Programming''] {{webarchive|url=https://web.archive.org/web/20061012020239/http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD249.PDF |date=2006-10-12 }}, pg. 1-2</ref> उचित शिक्षा के साथ भी, स्थिर संरचना और फंक्शन के गतिशील प्रवाह दोनों को देखने के लिए उचित समर्थन के बिना क्रॉस-कटिंग आने वाली सम्स्याओं को समझना कठिन हो सकता है।<ref name="harmful" /> 2002 की प्रारंभ में, एस्पेक्टजे ने क्रॉस-कटिंग आने वाली सम्स्याओं की कल्पना का समर्थन करने के लिए आईडीई प्लग-इन प्रदान करना प्रारंभ किया। वे सुविधाएँ, साथ ही आस्पेक्ट कोड असिस्ट और [[ कोड रीफैक्टरिंग |कोड रीफैक्टरिंग]] अब सरल हैं।
उचित शिक्षा के साथ भी, स्थिर संरचना और कार्यक्रम के गतिशील प्रवाह दोनों को देखने के लिए उचित समर्थन के बिना क्रॉस-कटिंग चिंताओं को समझना मुश्किल हो सकता है।<ref name="harmful" />2002 की शुरुआत में, AspectJ ने क्रॉस-कटिंग चिंताओं की कल्पना का समर्थन करने के लिए IDE प्लग-इन प्रदान करना शुरू किया। वे सुविधाएँ, साथ ही आस्पेक्ट कोड असिस्ट और [[ कोड रीफैक्टरिंग |कोड रीफैक्टरिंग]] अब आम हैं।


एओपी की शक्ति को देखते हुए, यदि कोई प्रोग्रामर क्रॉसकटिंग को व्यक्त करने में तार्किक गलती करता है, तो यह व्यापक कार्यक्रम विफलता का कारण बन सकता है। इसके विपरीत, अन्य प्रोग्रामर प्रोग्राम में शामिल होने वाले बिंदुओं को बदल सकता है - उदाहरण के लिए, नाम बदलने या विधियों को स्थानांतरित करके - उन तरीकों से जो कि पहलू लेखक ने अनुमान नहीं लगाया था, [[अप्रत्याशित परिणाम]]ों के साथ। क्रॉसकटिंग चिंताओं को संशोधित करने का फायदा प्रोग्रामर को पूरे सिस्टम को आसानी से प्रभावित करने में सक्षम बनाता है; नतीजतन, ऐसी समस्याएं किसी विफलता के लिए दो या दो से अधिक डेवलपर्स के बीच जिम्मेदारी पर संघर्ष के रूप में उपस्थित होती हैं। हालाँकि, AOP की उपस्थिति में इन समस्याओं का समाधान बहुत आसान हो सकता है, क्योंकि केवल पहलू को बदलने की आवश्यकता है, जबकि AOP के बिना संबंधित समस्याएँ बहुत अधिक फैल सकती हैं।
एओपी की शक्ति को देखते हुए, यदि कोई प्रोग्रामर क्रॉसकटिंग को व्यक्त करने में तार्किक गलती करता है, तो यह व्यापक फंक्शन विफलता का कारण बन सकता है। इसके विपरीत, अन्य प्रोग्रामर प्रोग्राम में सम्मिलित होने वाले बिंदुओं को परिवर्तित कर सकता है - उदाहरण के लिए, नाम परिवर्तित करने या विधियों को स्थानांतरित करके - उन तरीकों से जो कि एस्पेक्ट लेखक ने अनुमान नहीं लगाया था, [[अप्रत्याशित परिणाम|अप्रत्याशित परिणामों]] के साथ उपलब्ध रहती हैं। क्रॉसकटिंग आने वाली सम्स्याओं को संशोधित करने का लाभ प्रोग्रामर को पूरे सिस्टम को सरलता से प्रभावित करने में सक्षम बनाता है, नतीजतन, ऐसी समस्याएं किसी विफलता के लिए दो या दो से अधिक डेवलपर्स के बीच जिम्मेदारी पर संघर्ष के रूप में उपस्थित होती हैं। चूंकि इस प्रकार एओपी की उपस्थिति में इन समस्याओं का समाधान बहुत आसान हो सकता है, क्योंकि केवल एस्पेक्ट को परिवर्तित करने की आवश्यकता है, जबकि एओपी के बिना संबंधित समस्याएँ बहुत अधिक फैल सकती हैं।


== आलोचना ==
== आलोचना ==
AOP के प्रभाव की सबसे बुनियादी आलोचना यह है कि नियंत्रण प्रवाह अस्पष्ट है, और यह न केवल बहुत बदनाम [[GOTO]] से भी बदतर है, बल्कि वास्तव में जोक [[COME FROM]] बयान के समान है।<ref name="harmful" />आवेदन की अनजानता, जो एओपी की कई परिभाषाओं के लिए मौलिक है (प्रश्न में कोड का कोई संकेत नहीं है कि सलाह लागू की जाएगी, जिसे पॉइंटकट में निर्दिष्ट किया गया है), इसका मतलब है कि सलाह स्पष्ट के विपरीत दिखाई नहीं दे रही है विधि कॉल।<ref name="harmful">{{cite conference|url=http://pp.info.uni-karlsruhe.de/uploads/publikationen/constantinides04eiwas.pdf| title=AOP को हानिकारक माना जाता है|first1=Constantinos |last1=Constantinides |first2=Therapon |last2=Skotiniotis |first3=Maximilian |last3=Störzer|date=September 2004|access-date=5 May 2018|url-status=live|archive-url=https://web.archive.org/web/20160323061458/https://pp.info.uni-karlsruhe.de/uploads/publikationen/constantinides04eiwas.pdf|archive-date=23 March 2016|conference=European Interactive Workshop on Aspects in Software (EIWAS)| location=Berlin, Germany}}</ref><ref>[[C2:ComeFrom]]</ref> उदाहरण के लिए, आओ से कार्यक्रम की तुलना करें:<ref name="harmful"/>
एओपी के प्रभाव की सबसे मौलिक आलोचना यह है कि नियंत्रण प्रवाह अस्पष्ट है, और यह न केवल बहुत बदनाम [[GOTO]] से भी बदतर है, बल्कि वास्तव में जोक [[COME FROM]] बयान के समान है।<ref name="harmful" /> एप्लीकेशन की जानकारी न होने पर जो एओपी की कई परिभाषाओं के लिए मौलिक है, इस कारण इस प्रश्न में कोड का कोई संकेत नहीं मिलता है कि कमांड लागू की जाएगी, जिसे पॉइंटकट में निर्दिष्ट किया गया है, इसका अर्थ है कि इसे काॅल करने पर कमांड स्पष्ट रूप से इसके विपरीत कार्य नहीं करती हैं।<ref name="harmful">{{cite conference|url=http://pp.info.uni-karlsruhe.de/uploads/publikationen/constantinides04eiwas.pdf| title=AOP को हानिकारक माना जाता है|first1=Constantinos |last1=Constantinides |first2=Therapon |last2=Skotiniotis |first3=Maximilian |last3=Störzer|date=September 2004|access-date=5 May 2018|url-status=live|archive-url=https://web.archive.org/web/20160323061458/https://pp.info.uni-karlsruhe.de/uploads/publikationen/constantinides04eiwas.pdf|archive-date=23 March 2016|conference=European Interactive Workshop on Aspects in Software (EIWAS)| location=Berlin, Germany}}</ref><ref>[[C2:ComeFrom]]</ref> उदाहरण के लिए इस फंक्शन की तुलना करें:<ref name="harmful"/>
  5 इनपुट एक्स
  5 INPUT X
10 प्रिंट 'परिणाम है:'
10 PRINT 'Result is :'
15 प्रिंट एक्स
15 PRINT X
20 10 से आते हैं
20 COME FROM 10
25 एक्स = एक्स * एक्स
25     X = X * X
30 वापसी
 
</वाक्यविन्यास हाइलाइट>
30 RETURN
समान शब्दार्थ के साथ AOP अंश के साथ:
 
<वाक्यविन्यास प्रकाश लैंग = जावा हाइलाइट = 8>
समान शब्दार्थ के साथ एओपी एलिमेंट के साथ:
मुख्य() {
main() {
  इनपुट एक्स
 
  प्रिंट (परिणाम (एक्स))
    input x
}
    print(result(x))
इनपुट परिणाम (int x) {वापसी x}
}
चारों ओर (int x): कॉल (परिणाम (int)) && तर्क (x) {
input result(int x) { return x }
  इंट टेम्प = आगे बढ़ना (एक्स)
around(int x): call(result(int)) && args(x) {
  वापसी अस्थायी * अस्थायी
    int temp = proceed(x)
}
    return temp * temp
}


दरअसल, पॉइंटकट रनटाइम स्थिति पर निर्भर हो सकता है और इस प्रकार स्थिर रूप से निर्धारक नहीं हो सकता है। इसे कम किया जा सकता है लेकिन स्थिर विश्लेषण और आईडीई समर्थन द्वारा हल नहीं किया जा सकता है जो दिखाता है कि कौन सी सलाह संभावित रूप से मेल खाती है।
इस प्रकार पॉइंटकट रनटाइम स्थिति पर निर्भर हो सकता है और इस प्रकार स्थिर रूप से निर्धारक नहीं हो सकता है। इसे कम किया जा सकता है अपितु स्थिर विश्लेषण और आईडीई समर्थन द्वारा हल नहीं किया जा सकता है जो दिखाता है कि कौन सी कमांड संभावित रूप से मेल खाती है।


सामान्य आलोचना यह है कि एओपी मॉड्यूलरिटी और कोड की संरचना दोनों में सुधार करने का दावा करता है, लेकिन कुछ इसका विरोध करते हैं कि यह इन लक्ष्यों को कम करता है और स्वतंत्र विकास और कार्यक्रमों की समझ को बाधित करता है।<ref name="steimann">{{Cite journal | doi = 10.1145/1167515.1167514| title = पहलू-उन्मुख प्रोग्रामिंग की विरोधाभासी सफलता| journal = ACM SIGPLAN Notices| volume = 41| issue = 10| pages = 481–497| year = 2006| last1 = Steimann | first1 = F. | citeseerx = 10.1.1.457.2210}}, ([http://people.dsv.su.se/~johano/ioor/succ_aop.pdf slides] {{webarchive|url=https://web.archive.org/web/20160304060007/http://people.dsv.su.se/~johano/ioor/succ_aop.pdf |date=2016-03-04 }},[http://www.eecs.ucf.edu/~leavens/modular-aop/Discussion.pdf slides 2] {{webarchive|url=https://web.archive.org/web/20150923234021/http://www.eecs.ucf.edu/~leavens/modular-aop/Discussion.pdf |date=2015-09-23 }}, [http://www.oopsla.org/2006/submission/essays/the_paradoxical_success_of_aspect-oriented_programming.html abstract] {{webarchive|url=https://web.archive.org/web/20150924060711/http://www.oopsla.org/2006/submission/essays/the_paradoxical_success_of_aspect-oriented_programming.html |date=2015-09-24 }}), Friedrich Steimann, Gary T. Leavens, [[OOPSLA]] 2006</ref> विशेष रूप से, पॉइंटकट द्वारा मात्रा का ठहराव प्रतिरूपकता को तोड़ता है: सामान्य तौर पर, पहलू-उन्मुख कार्यक्रम के गतिशील निष्पादन के बारे में तर्क करने के लिए पूरे कार्यक्रम का ज्ञान होना चाहिए।<ref>{{cite web|url=http://www.eecs.ucf.edu/~leavens/modular-aop/|title=पहलू-उन्मुख कार्यक्रमों के लिए अधिक मॉड्यूलर तर्क|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20150812045258/http://www.eecs.ucf.edu/~leavens/modular-aop/|archive-date=12 August 2015}}</ref> इसके अलावा, जबकि इसके लक्ष्यों (क्रॉस-कटिंग चिंताओं को संशोधित करना) को अच्छी तरह से समझा जाता है, इसकी वास्तविक परिभाषा स्पष्ट नहीं है और स्पष्ट रूप से अन्य अच्छी तरह से स्थापित तकनीकों से अलग नहीं है।<ref name="steimann" />क्रॉस-कटिंग चिंताएँ संभावित रूप से एक-दूसरे को क्रॉस-कट करती हैं, जिसके लिए कुछ समाधान तंत्र की आवश्यकता होती है, जैसे ऑर्डर देना।<ref name="steimann" />वास्तव में, पहलू खुद पर लागू हो सकते हैं, जिससे [[झूठा विरोधाभास]] जैसी समस्याएं हो सकती हैं।<ref>{{cite web|url=http://www.fernuni-hagen.de/ps/pubs/FOAL2006.pdf|title=एओपी और झूठे की एंटीनोमी|website=fernuni-hagen.de|access-date=5 May 2018|url-status=live|archive-url=https://web.archive.org/web/20170809201001/http://www.fernuni-hagen.de/ps/pubs/FOAL2006.pdf|archive-date=9 August 2017}}</ref>
सामान्य आलोचना यह है कि एओपी मॉड्यूलरिटी और कोड की संरचना दोनों में सुधार करने का दावा करता है, अपितु कुछ इसका विरोध करते हैं कि यह इन लक्ष्यों को कम करता है और स्वतंत्र विकास और फंक्शनों की समझ को बाधित करता है।<ref name="steimann">{{Cite journal | doi = 10.1145/1167515.1167514| title = पहलू-उन्मुख प्रोग्रामिंग की विरोधाभासी सफलता| journal = ACM SIGPLAN Notices| volume = 41| issue = 10| pages = 481–497| year = 2006| last1 = Steimann | first1 = F. | citeseerx = 10.1.1.457.2210}}, ([http://people.dsv.su.se/~johano/ioor/succ_aop.pdf slides] {{webarchive|url=https://web.archive.org/web/20160304060007/http://people.dsv.su.se/~johano/ioor/succ_aop.pdf |date=2016-03-04 }},[http://www.eecs.ucf.edu/~leavens/modular-aop/Discussion.pdf slides 2] {{webarchive|url=https://web.archive.org/web/20150923234021/http://www.eecs.ucf.edu/~leavens/modular-aop/Discussion.pdf |date=2015-09-23 }}, [http://www.oopsla.org/2006/submission/essays/the_paradoxical_success_of_aspect-oriented_programming.html abstract] {{webarchive|url=https://web.archive.org/web/20150924060711/http://www.oopsla.org/2006/submission/essays/the_paradoxical_success_of_aspect-oriented_programming.html |date=2015-09-24 }}), Friedrich Steimann, Gary T. Leavens, [[OOPSLA]] 2006</ref> विशेष रूप से, पॉइंटकट द्वारा मात्रा का ठहराव प्रतिरूपकता को तोड़ता है: सामान्यतः, एस्पेक्ट ओरिएंटेड फंक्शन के गतिशील निष्पादन के बारे में तर्क करने के लिए पूरे फंक्शन का ज्ञान होना चाहिए।<ref>{{cite web|url=http://www.eecs.ucf.edu/~leavens/modular-aop/|title=पहलू-उन्मुख कार्यक्रमों के लिए अधिक मॉड्यूलर तर्क|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20150812045258/http://www.eecs.ucf.edu/~leavens/modular-aop/|archive-date=12 August 2015}}</ref> इसके अतिरिक्त, जबकि इसके लक्ष्यों की ओर क्रॉस-कटिंग आने वाली सम्स्याओं को संशोधित करके इसको अच्छी तरह से समझा जाता है, इसकी वास्तविक परिभाषा स्पष्ट नहीं है और स्पष्ट रूप से अन्य अच्छी तरह से स्थापित तकनीकों से अलग नहीं है।<ref name="steimann" /> इस प्रकार क्रॉस-कटिंग आने वाली इस प्रकार की सम्स्याएँ संभावित रूप से एक-दूसरे को क्रॉस-कट करती हैं, जिसके लिए कुछ समाधान तंत्र की आवश्यकता होती है, जैसे ऑर्डर देना इत्यादि।<ref name="steimann" /> इस प्रकार वास्तव में, एस्पेक्ट खुद पर लागू हो सकते हैं, जिससे [[झूठा विरोधाभास|असत्य]] होने जैसी समस्याएं हो सकती हैं।<ref>{{cite web|url=http://www.fernuni-hagen.de/ps/pubs/FOAL2006.pdf|title=एओपी और झूठे की एंटीनोमी|website=fernuni-hagen.de|access-date=5 May 2018|url-status=live|archive-url=https://web.archive.org/web/20170809201001/http://www.fernuni-hagen.de/ps/pubs/FOAL2006.pdf|archive-date=9 August 2017}}</ref> इस तकनीकी आलोचनाओं में सम्मिलित है कि पॉइंटकट का परिमाणीकरण यह परिभाषित करना हैं कि कमांड कहाँ निष्पादित की जाती है। इस प्रकार फंक्शन में परिवर्तनों के प्रति अत्यंत संवेदनशील है, जिसे नाजुक पॉइंटकट समस्या के रूप में जाना जाता है।<ref name="steimann" />पॉइंटकट के साथ समस्याओं को अट्रैक्टिव माना जाता है: यदि कोई पॉइंटकट के क्वांटिफिकेशन को स्पष्ट एनोटेशन से परिवर्तित कर देता है, तो इस प्रकार वह इसके अतिरिक्त [[विशेषता-उन्मुख प्रोग्रामिंग]] प्राप्त करता है, जो कि केवल स्पष्ट सबरूटीन कॉल है और स्कैटरिंग की समान समस्या से ग्रस्त है जिसे हल करने के लिए एओपी को डिज़ाइन किया गया था।<ref name="steimann" />
तकनीकी आलोचनाओं में शामिल है कि पॉइंटकट का परिमाणीकरण (यह परिभाषित करना कि सलाह कहाँ निष्पादित की जाती है) कार्यक्रम में परिवर्तनों के प्रति अत्यंत संवेदनशील है, जिसे नाजुक पॉइंटकट समस्या के रूप में जाना जाता है।<ref name="steimann" />पॉइंटकट के साथ समस्याओं को अट्रैक्टिव माना जाता है: यदि कोई पॉइंटकट के क्वांटिफिकेशन को स्पष्ट एनोटेशन से बदल देता है, तो वह इसके बजाय [[विशेषता-उन्मुख प्रोग्रामिंग]] प्राप्त करता है, जो कि केवल स्पष्ट सबरूटीन कॉल है और स्कैटरिंग की समान समस्या से ग्रस्त है जिसे हल करने के लिए AOP को डिज़ाइन किया गया था।<ref name="steimann" />
== कार्यान्वयन ==
== कार्यान्वयन ==
निम्नलिखित [[प्रोग्रामिंग भाषा]]ओं ने AOP को भाषा के भीतर या बाहरी पुस्तकालय के रूप में लागू किया है:
निम्नलिखित [[प्रोग्रामिंग भाषा]]ओं ने एओपी को भाषा के भीतर या बाहरी लाइब्रेरी के रूप में लागू किया है:
*.नेट फ्रेमवर्क लैंग्वेज (सी शार्प (प्रोग्रामिंग लैंग्वेज)|सी# / विजुअल बेसिक .NET|VB.NET)<ref>Numerous:
*.नेट फ्रेमवर्क लैंग्वेज (सी शार्प (प्रोग्रामिंग लैंग्वेज)|सी# / विजुअल बेसिक .NET|VB.NET)<ref>Numerous:
[https://github.com/vc3/Afterthought Afterthought] {{webarchive|url=https://web.archive.org/web/20160315162029/https://github.com/vc3/Afterthought |date=2016-03-15 }}, [http://www.rapier-loom.net/ LOOM.NET] {{webarchive|url=https://web.archive.org/web/20080827215106/http://www.rapier-loom.net/ |date=2008-08-27 }}, [http://www.codeplex.com/entlib Enterprise Library 3.0 Policy Injection Application Block] {{webarchive|url=https://web.archive.org/web/20070119154829/http://www.codeplex.com/entlib |date=2007-01-19 }}, [http://sourceforge.net/projects/aspectdng/ AspectDNG] {{webarchive|url=https://web.archive.org/web/20040929053513/http://sourceforge.net/projects/aspectdng |date=2004-09-29 }}, [http://www.castleproject.org/projects/dynamicproxy/ DynamicProxy] {{webarchive|url=https://web.archive.org/web/20151205001755/http://www.castleproject.org/projects/dynamicproxy/ |date=2015-12-05 }}, [http://composestar.sourceforge.net/ Compose*] {{webarchive|url=http://archive.wikiwix.com/cache/20050821193804/http://composestar.sourceforge.net/ |date=2005-08-21 }}, [http://www.postsharp.net/ PostSharp] {{webarchive|url=https://web.archive.org/web/20160503095409/https://www.postsharp.net/ |date=2016-05-03 }}, [http://www.seasar.org/en/dotnet/ Seasar.NET] {{webarchive|url=https://web.archive.org/web/20060725015434/http://www.seasar.org/en/dotnet/ |date=2006-07-25 }}, [http://dotspect.tigris.org/ DotSpect (.SPECT)] {{webarchive|url=https://web.archive.org/web/20060331071126/http://dotspect.tigris.org/ |date=2006-03-31 }}, [http://www.springframework.net/ Spring.NET] {{webarchive|url=https://web.archive.org/web/20060402205922/http://springframework.net/ |date=2006-04-02 }} (as part of its functionality), [https://www.cs.columbia.edu/~eaddy/wicca Wicca and Phx.Morph] {{webarchive|url=https://web.archive.org/web/20061207110849/http://www1.cs.columbia.edu/~eaddy/wicca/ |date=2006-12-07 }}, [http://setpoint.codehaus.org/ SetPoint] {{webarchive|url=https://web.archive.org/web/20081007002006/http://setpoint.codehaus.org/ |date=2008-10-07 }}</ref>
[https://github.com/vc3/Afterthought Afterthought] {{webarchive|url=https://web.archive.org/web/20160315162029/https://github.com/vc3/Afterthought |date=2016-03-15 }}, [http://www.rapier-loom.net/ LOOM.NET] {{webarchive|url=https://web.archive.org/web/20080827215106/http://www.rapier-loom.net/ |date=2008-08-27 }}, [http://www.codeplex.com/entlib Enterprise Library 3.0 Policy Injection Application Block] {{webarchive|url=https://web.archive.org/web/20070119154829/http://www.codeplex.com/entlib |date=2007-01-19 }}, [http://sourceforge.net/projects/aspectdng/ AspectDNG] {{webarchive|url=https://web.archive.org/web/20040929053513/http://sourceforge.net/projects/aspectdng |date=2004-09-29 }}, [http://www.castleproject.org/projects/dynamicproxy/ DynamicProxy] {{webarchive|url=https://web.archive.org/web/20151205001755/http://www.castleproject.org/projects/dynamicproxy/ |date=2015-12-05 }}, [http://composestar.sourceforge.net/ Compose*] {{webarchive|url=http://archive.wikiwix.com/cache/20050821193804/http://composestar.sourceforge.net/ |date=2005-08-21 }}, [http://www.postsharp.net/ PostSharp] {{webarchive|url=https://web.archive.org/web/20160503095409/https://www.postsharp.net/ |date=2016-05-03 }}, [http://www.seasar.org/en/dotnet/ Seasar.NET] {{webarchive|url=https://web.archive.org/web/20060725015434/http://www.seasar.org/en/dotnet/ |date=2006-07-25 }}, [http://dotspect.tigris.org/ DotSpect (.SPECT)] {{webarchive|url=https://web.archive.org/web/20060331071126/http://dotspect.tigris.org/ |date=2006-03-31 }}, [http://www.springframework.net/ Spring.NET] {{webarchive|url=https://web.archive.org/web/20060402205922/http://springframework.net/ |date=2006-04-02 }} (as part of its functionality), [https://www.cs.columbia.edu/~eaddy/wicca Wicca and Phx.Morph] {{webarchive|url=https://web.archive.org/web/20061207110849/http://www1.cs.columbia.edu/~eaddy/wicca/ |date=2006-12-07 }}, [http://setpoint.codehaus.org/ SetPoint] {{webarchive|url=https://web.archive.org/web/20081007002006/http://setpoint.codehaus.org/ |date=2008-10-07 }}</ref>
**[https://www.postsharp.net/ PostSharp] मुक्त लेकिन सीमित संस्करण के साथ वाणिज्यिक एओपी कार्यान्वयन है।
**[https://www.postsharp.net/ पोस्ट शार्प] मुक्त अपितु सीमित संस्करण के साथ वाणिज्यिक एओपी कार्यान्वयन है।
**[[एकता आवेदन ब्लॉक]] डेटा एक्सेस, सुरक्षा, लॉगिंग, अपवाद हैंडलिंग और अन्य सहित प्रोग्रामिंग के मुख्य क्षेत्रों में सिद्ध प्रथाओं को सुविधाजनक बनाने के लिए एपीआई प्रदान करता है।
**[[एकता आवेदन ब्लॉक|यूनिट एप्लीकेशन ब्लॉक]] डेटा एक्सेस, सुरक्षा, लॉगिंग, अपवाद हैंडलिंग और अन्य सहित प्रोग्रामिंग के मुख्य क्षेत्रों में सिद्ध प्रथाओं को सुविधाजनक बनाने के लिए एपीआई प्रदान करता है।
**[https://github.com/tfreyburger/aspectDN/ AspectDN] AOP कार्यान्वयन है जो पहलुओं को सीधे .net एक्ज़ीक्यूटेबल फ़ाइलों पर बुनने की अनुमति देता है।
**[https://github.com/tfreyburger/aspectDN/ एस्पेक्ट डीएन] एओपी कार्यान्वयन है जो ओरिएंटेशन को सीधे .net एक्ज़ीक्यूटेबल फ़ाइलों पर बुनने की अनुमति देता है।
*[[ ActionScript ]]<ref>{{cite web|url=http://www.as3commons.org/as3-commons-bytecode|title=Welcome to as3-commons-bytecode|website=as3commons.org|access-date=5 May 2018|url-status=live|archive-url=https://web.archive.org/web/20141003100345/http://www.as3commons.org/as3-commons-bytecode/|archive-date=3 October 2014}}</ref>
*[[ ActionScript | एक्शन स्क्रिप्ट]] <ref>{{cite web|url=http://www.as3commons.org/as3-commons-bytecode|title=Welcome to as3-commons-bytecode|website=as3commons.org|access-date=5 May 2018|url-status=live|archive-url=https://web.archive.org/web/20141003100345/http://www.as3commons.org/as3-commons-bytecode/|archive-date=3 October 2014}}</ref>
* अदा (प्रोग्रामिंग भाषा)<ref>{{cite web|url=http://www.adacore.com/uploads/technical-papers/Ada2012_Rational_Introducion.pdf|title=Ada2012 Rationale|website=adacore.com|access-date=5 May 2018|url-status=live|archive-url=https://web.archive.org/web/20160418132340/http://www.adacore.com/uploads/technical-papers/Ada2012_Rational_Introducion.pdf|archive-date=18 April 2016}}</ref>
* स्टाइल (प्रोग्रामिंग भाषा)<ref>{{cite web|url=http://www.adacore.com/uploads/technical-papers/Ada2012_Rational_Introducion.pdf|title=Ada2012 Rationale|website=adacore.com|access-date=5 May 2018|url-status=live|archive-url=https://web.archive.org/web/20160418132340/http://www.adacore.com/uploads/technical-papers/Ada2012_Rational_Introducion.pdf|archive-date=18 April 2016}}</ref>
*ऑटो [[AutoHotkey]]<ref>{{cite web|url=http://www.autohotkey.com/forum/viewtopic.php?p=243426|archive-url=https://archive.today/2013.01.17-125117/http://www.autohotkey.com/forum/viewtopic.php?p=243426|url-status=dead|archive-date=17 January 2013|title=समारोह हुक|website=autohotkey.com|access-date=5 May 2018}}</ref>
*ऑटो [[AutoHotkey]]<ref>{{cite web|url=http://www.autohotkey.com/forum/viewtopic.php?p=243426|archive-url=https://archive.today/2013.01.17-125117/http://www.autohotkey.com/forum/viewtopic.php?p=243426|url-status=dead|archive-date=17 January 2013|title=समारोह हुक|website=autohotkey.com|access-date=5 May 2018}}</ref>
* [[सी (प्रोग्रामिंग भाषा)]] / [[सी ++]]<ref>Several: [[AspectC++]], [http://wwwiti.cs.uni-magdeburg.de/iti_db/forschung/fop/featurec/ FeatureC++], [http://www.cs.ubc.ca/labs/spl/projects/aspectc.html AspectC] {{webarchive|url=https://web.archive.org/web/20060821190630/http://www.cs.ubc.ca/labs/spl/projects/aspectc.html |date=2006-08-21 }}, [http://www.aspectc.net/ AspeCt-oriented C] {{webarchive|url=https://web.archive.org/web/20081120144608/http://www.aspectc.net/ |date=2008-11-20 }}, [https://archive.today/2012.07.21-212648/http://www.bramadams.org/aspicere/index.html Aspicere]</ref>
* [[सी (प्रोग्रामिंग भाषा)]] / [[सी ++]]<ref>Several: [[AspectC++]], [http://wwwiti.cs.uni-magdeburg.de/iti_db/forschung/fop/featurec/ FeatureC++], [http://www.cs.ubc.ca/labs/spl/projects/aspectc.html AspectC] {{webarchive|url=https://web.archive.org/web/20060821190630/http://www.cs.ubc.ca/labs/spl/projects/aspectc.html |date=2006-08-21 }}, [http://www.aspectc.net/ AspeCt-oriented C] {{webarchive|url=https://web.archive.org/web/20081120144608/http://www.aspectc.net/ |date=2008-11-20 }}, [https://archive.today/2012.07.21-212648/http://www.bramadams.org/aspicere/index.html Aspicere]</ref>
* [[कोबोल]]<ref>{{cite web|url=http://homepages.vub.ac.be/~kdeschut/cobble/|title=रास्ते का पत्थर|website=vub.ac.be|access-date=5 May 2018}}{{dead link|date=May 2018 |bot=SheriffIsInTown |fix-attempted=yes }}</ref>
* [[कोबोल]]<ref>{{cite web|url=http://homepages.vub.ac.be/~kdeschut/cobble/|title=रास्ते का पत्थर|website=vub.ac.be|access-date=5 May 2018}}{{dead link|date=May 2018 |bot=SheriffIsInTown |fix-attempted=yes }}</ref>
* [[कोको (एपीआई)]] [[ उद्देश्य सी |उद्देश्य सी]] फ्रेमवर्क<ref>{{cite web|url=http://www.ood.neu.edu/aspectcocoa/|title=पहलूकोको|website=neu.edu|access-date=5 May 2018|url-status=dead|archive-url=https://web.archive.org/web/20071026022525/http://www.ood.neu.edu/aspectcocoa/|archive-date=26 October 2007}}</ref>
* [[कोको (एपीआई)]] [[ उद्देश्य सी |उद्देश्य सी]] फ्रेमवर्क<ref>{{cite web|url=http://www.ood.neu.edu/aspectcocoa/|title=पहलूकोको|website=neu.edu|access-date=5 May 2018|url-status=dead|archive-url=https://web.archive.org/web/20071026022525/http://www.ood.neu.edu/aspectcocoa/|archive-date=26 October 2007}}</ref>
*[[ठंडा गलन]]<ref>{{cite web|url=http://coldspringframework.org/|title=ColdSpring Framework: Welcome|date=5 November 2005|access-date=5 May 2018|url-status=bot: unknown|archive-url=https://web.archive.org/web/20051105014513/http://coldspringframework.org/|archive-date=5 November 2005}}</ref>
*[[ठंडा गलन|कोल्ड फ्यूजन]]<ref>{{cite web|url=http://coldspringframework.org/|title=ColdSpring Framework: Welcome|date=5 November 2005|access-date=5 May 2018|url-status=bot: unknown|archive-url=https://web.archive.org/web/20051105014513/http://coldspringframework.org/|archive-date=5 November 2005}}</ref>
* [[सामान्य लिस्प]]<ref>{{cite web|url=http://common-lisp.net/project/closer/aspectl.html|title=Closer Project: AspectL.|access-date=11 August 2015|url-status=live|archive-url=http://archive.wikiwix.com/cache/20110223172923/http://common-lisp.net/project/closer/aspectl.html|archive-date=23 February 2011}}</ref>
* [[सामान्य लिस्प]]<ref>{{cite web|url=http://common-lisp.net/project/closer/aspectl.html|title=Closer Project: AspectL.|access-date=11 August 2015|url-status=live|archive-url=http://archive.wikiwix.com/cache/20110223172923/http://common-lisp.net/project/closer/aspectl.html|archive-date=23 February 2011}}</ref>
* [[डेल्फी (प्रोग्रामिंग भाषा)]]<ref>{{cite web|url=https://code.google.com/p/infra/|title=इंफ्रा - डेल्फी के लिए एकीकृत फ्रेमवर्क - गूगल प्रोजेक्ट होस्टिंग|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20150909070130/http://code.google.com/p/infra/|archive-date=9 September 2015}}</ref><ref>{{cite web|url=https://code.google.com/p/meaop/|title=meaop - MeSDK: MeObjects, MeRTTI, MeAOP - Delphi AOP(Aspect Oriented Programming), MeRemote, MeService... - Google Project Hosting|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20150910210536/http://code.google.com/p/meaop/|archive-date=10 September 2015}}</ref><ref>{{cite web|url=https://code.google.com/p/delphisorcery/|title=Google प्रोजेक्ट होस्टिंग|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20141225080131/https://code.google.com/p/delphisorcery/|archive-date=25 December 2014}}</ref>
* [[डेल्फी (प्रोग्रामिंग भाषा)]]<ref>{{cite web|url=https://code.google.com/p/infra/|title=इंफ्रा - डेल्फी के लिए एकीकृत फ्रेमवर्क - गूगल प्रोजेक्ट होस्टिंग|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20150909070130/http://code.google.com/p/infra/|archive-date=9 September 2015}}</ref><ref>{{cite web|url=https://code.google.com/p/meaop/|title=meaop - MeSDK: MeObjects, MeRTTI, MeAOP - Delphi AOP(Aspect Oriented Programming), MeRemote, MeService... - Google Project Hosting|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20150910210536/http://code.google.com/p/meaop/|archive-date=10 September 2015}}</ref><ref>{{cite web|url=https://code.google.com/p/delphisorcery/|title=Google प्रोजेक्ट होस्टिंग|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20141225080131/https://code.google.com/p/delphisorcery/|archive-date=25 December 2014}}</ref>
* [[डेल्फी प्रिज्म]]<ref>{{cite web|url=http://prismwiki.codegear.com/en/Cirrus|title=RemObjects सिरस|website=codegear.com|access-date=5 May 2018|url-status=dead|archive-url=https://web.archive.org/web/20120123094027/http://prismwiki.codegear.com/en/Cirrus|archive-date=23 January 2012}}</ref>
* [[डेल्फी प्रिज्म]]<ref>{{cite web|url=http://prismwiki.codegear.com/en/Cirrus|title=RemObjects सिरस|website=codegear.com|access-date=5 May 2018|url-status=dead|archive-url=https://web.archive.org/web/20120123094027/http://prismwiki.codegear.com/en/Cirrus|archive-date=23 January 2012}}</ref>
*[[ई (सत्यापन भाषा)]] (आईईईई 1647)
*[[ई (सत्यापन भाषा)]] (आईईईई 1647)
*[[Emacs लिस्प]]<ref>{{cite web|url=https://www.gnu.org/software/emacs/elisp/html_node/Advising-Functions.html|title=Emacs सलाह कार्य|website=gnu.org|access-date=5 May 2018|url-status=live|archive-url=https://web.archive.org/web/20111024211408/http://www.gnu.org/software/emacs/elisp/html_node/Advising-Functions.html|archive-date=24 October 2011}}</ref>
*[[Emacs लिस्प|ईमैक लिस्प]]<ref>{{cite web|url=https://www.gnu.org/software/emacs/elisp/html_node/Advising-Functions.html|title=Emacs सलाह कार्य|website=gnu.org|access-date=5 May 2018|url-status=live|archive-url=https://web.archive.org/web/20111024211408/http://www.gnu.org/software/emacs/elisp/html_node/Advising-Functions.html|archive-date=24 October 2011}}</ref>
* [[ग्रूवी (प्रोग्रामिंग भाषा)]]
* [[ग्रूवी (प्रोग्रामिंग भाषा)]]
* [[हास्केल (प्रोग्रामिंग भाषा)]]<ref>[[Monad (functional programming)|Monad]]s allow program semantics to be altered by changing the type of the program without altering its code: {{cite journal | citeseerx = 10.1.1.25.8262 | title = Monads As a theoretical basis for AOP |journal = International Workshop on Aspect-Oriented Programming at ECOOP | first = Wolfgang | last = De Meuter | year = 1997| page = 25 }} {{cite journal | url = http://dl.acm.org/citation.cfm?id=2451457 | title = A Typed Monadic Embedding of Aspects | first1 = Nicolas | last1 = Tabareau | first2 = Ismael | last2 = Figueroa | first3 = Éric | last3 = Tanter | journal = Proceedings of the 12th Annual International Conference on Aspect-oriented Software Development | series = Aosd '13 | date = March 2013 | pages = 171–184 | doi = 10.1145/2451436.2451457 | isbn = 9781450317665 | s2cid = 27256161 }} [[Type class]]es allow additional capabilities to be added to a type: {{cite journal | first1 = Martin | last1 = Sulzmann | first2 = Meng | last2 = Wang | url = http://portal.acm.org/citation.cfm?id=1233842 | title = Aspect-oriented programming with type classes | journal = Proceedings of the 6th Workshop on Foundations of Aspect-oriented Languages | date = March 2007 | pages = 65–74 | doi = 10.1145/1233833.1233842 | isbn = 978-1595936615 | s2cid = 3253858 }}.</ref>
* [[हास्केल (प्रोग्रामिंग भाषा)]]<ref>[[Monad (functional programming)|Monad]]s allow program semantics to be altered by changing the type of the program without altering its code: {{cite journal | citeseerx = 10.1.1.25.8262 | title = Monads As a theoretical basis for AOP |journal = International Workshop on Aspect-Oriented Programming at ECOOP | first = Wolfgang | last = De Meuter | year = 1997| page = 25 }} {{cite journal | url = http://dl.acm.org/citation.cfm?id=2451457 | title = A Typed Monadic Embedding of Aspects | first1 = Nicolas | last1 = Tabareau | first2 = Ismael | last2 = Figueroa | first3 = Éric | last3 = Tanter | journal = Proceedings of the 12th Annual International Conference on Aspect-oriented Software Development | series = Aosd '13 | date = March 2013 | pages = 171–184 | doi = 10.1145/2451436.2451457 | isbn = 9781450317665 | s2cid = 27256161 }} [[Type class]]es allow additional capabilities to be added to a type: {{cite journal | first1 = Martin | last1 = Sulzmann | first2 = Meng | last2 = Wang | url = http://portal.acm.org/citation.cfm?id=1233842 | title = Aspect-oriented programming with type classes | journal = Proceedings of the 6th Workshop on Foundations of Aspect-oriented Languages | date = March 2007 | pages = 65–74 | doi = 10.1145/1233833.1233842 | isbn = 978-1595936615 | s2cid = 3253858 }}.</ref>
* [[जावा (प्रोग्रामिंग भाषा)]]<ref>Numerous others: [http://www.caesarj.org/ CaesarJ] {{webarchive|url=https://web.archive.org/web/20081219181529/http://caesarj.org/ |date=2008-12-19 }}, [http://composestar.sourceforge.net/ Compose*] {{webarchive|url=http://archive.wikiwix.com/cache/20050821193804/http://composestar.sourceforge.net/ |date=2005-08-21 }}, [http://dynaop.dev.java.net/ Dynaop] {{webarchive|url=https://web.archive.org/web/20070724061030/https://dynaop.dev.java.net/ |date=2007-07-24 }}, [http://jac.objectweb.org/ JAC] {{webarchive|url=https://web.archive.org/web/20040619135517/http://jac.objectweb.org/ |date=2004-06-19 }}, [[Google Guice]] (as part of its functionality), [http://www.csg.is.titech.ac.jp/~chiba/javassist/ Javassist] {{webarchive|url=https://web.archive.org/web/20040901095342/http://www.csg.is.titech.ac.jp/~chiba/javassist/ |date=2004-09-01 }}, [http://ssel.vub.ac.be/jasco/ JAsCo (and AWED)] {{webarchive|url=https://web.archive.org/web/20050411010213/http://ssel.vub.ac.be/jasco/ |date=2005-04-11 }}, [http://www.ics.uci.edu/~trungcn/jaml/ JAML] {{webarchive|url=https://web.archive.org/web/20050415091244/http://www.ics.uci.edu/~trungcn/jaml/ |date=2005-04-15 }}, [http://labs.jboss.com/portal/jbossaop JBoss AOP] {{webarchive|url=https://web.archive.org/web/20061017211354/http://labs.jboss.com/portal/jbossaop/ |date=2006-10-17 }}, [http://roots.iai.uni-bonn.de/research/logicaj LogicAJ] {{webarchive|url=https://web.archive.org/web/20060504154852/http://roots.iai.uni-bonn.de/research/logicaj/ |date=2006-05-04 }}, [http://www.objectteams.org/ Object Teams] {{webarchive|url=https://web.archive.org/web/20050831200910/http://objectteams.org/ |date=2005-08-31 }}, [http://prose.ethz.ch/ PROSE] {{webarchive|url=https://web.archive.org/web/20070124094344/http://prose.ethz.ch/ |date=2007-01-24 }}, [http://www.aspectbench.org/ The AspectBench Compiler for AspectJ (abc)] {{webarchive|url=https://web.archive.org/web/20141216200424/http://aspectbench.org/ |date=2014-12-16 }}, [[Spring framework]] (as part of its functionality), [[Seasar]], [http://roots.iai.uni-bonn.de/research/jmangler/ The JMangler Project] {{webarchive|url=https://web.archive.org/web/20051028191025/http://roots.iai.uni-bonn.de/research/jmangler/ |date=2005-10-28 }}, [http://injectj.sourceforge.net/ InjectJ] {{webarchive|url=https://web.archive.org/web/20050405080539/http://injectj.sourceforge.net/ |date=2005-04-05 }}, [http://www.csg.is.titech.ac.jp/projects/gluonj/ GluonJ] {{webarchive|url=https://web.archive.org/web/20070206010219/http://www.csg.is.titech.ac.jp/projects/gluonj/ |date=2007-02-06 }}, [http://www.st.informatik.tu-darmstadt.de/static/pages/projects/AORTA/Steamloom.jsp Steamloom] {{webarchive|url=https://web.archive.org/web/20070818100432/http://www.st.informatik.tu-darmstadt.de/static/pages/projects/AORTA/Steamloom.jsp |date=2007-08-18 }}</ref>
* [[जावा (प्रोग्रामिंग भाषा)]]<ref>Numerous others: [http://www.caesarj.org/ CaesarJ] {{webarchive|url=https://web.archive.org/web/20081219181529/http://caesarj.org/ |date=2008-12-19 }}, [http://composestar.sourceforge.net/ Compose*] {{webarchive|url=http://archive.wikiwix.com/cache/20050821193804/http://composestar.sourceforge.net/ |date=2005-08-21 }}, [http://dynaop.dev.java.net/ Dynaop] {{webarchive|url=https://web.archive.org/web/20070724061030/https://dynaop.dev.java.net/ |date=2007-07-24 }}, [http://jac.objectweb.org/ JAC] {{webarchive|url=https://web.archive.org/web/20040619135517/http://jac.objectweb.org/ |date=2004-06-19 }}, [[Google Guice]] (as part of its functionality), [http://www.csg.is.titech.ac.jp/~chiba/javassist/ Javassist] {{webarchive|url=https://web.archive.org/web/20040901095342/http://www.csg.is.titech.ac.jp/~chiba/javassist/ |date=2004-09-01 }}, [http://ssel.vub.ac.be/jasco/ JAsCo (and AWED)] {{webarchive|url=https://web.archive.org/web/20050411010213/http://ssel.vub.ac.be/jasco/ |date=2005-04-11 }}, [http://www.ics.uci.edu/~trungcn/jaml/ JAML] {{webarchive|url=https://web.archive.org/web/20050415091244/http://www.ics.uci.edu/~trungcn/jaml/ |date=2005-04-15 }}, [http://labs.jboss.com/portal/jbossaop JBoss AOP] {{webarchive|url=https://web.archive.org/web/20061017211354/http://labs.jboss.com/portal/jbossaop/ |date=2006-10-17 }}, [http://roots.iai.uni-bonn.de/research/logicaj LogicAJ] {{webarchive|url=https://web.archive.org/web/20060504154852/http://roots.iai.uni-bonn.de/research/logicaj/ |date=2006-05-04 }}, [http://www.objectteams.org/ Object Teams] {{webarchive|url=https://web.archive.org/web/20050831200910/http://objectteams.org/ |date=2005-08-31 }}, [http://prose.ethz.ch/ PROSE] {{webarchive|url=https://web.archive.org/web/20070124094344/http://prose.ethz.ch/ |date=2007-01-24 }}, [http://www.aspectbench.org/ The AspectBench Compiler for AspectJ (abc)] {{webarchive|url=https://web.archive.org/web/20141216200424/http://aspectbench.org/ |date=2014-12-16 }}, [[Spring framework]] (as part of its functionality), [[Seasar]], [http://roots.iai.uni-bonn.de/research/jmangler/ The JMangler Project] {{webarchive|url=https://web.archive.org/web/20051028191025/http://roots.iai.uni-bonn.de/research/jmangler/ |date=2005-10-28 }}, [http://injectj.sourceforge.net/ InjectJ] {{webarchive|url=https://web.archive.org/web/20050405080539/http://injectj.sourceforge.net/ |date=2005-04-05 }}, [http://www.csg.is.titech.ac.jp/projects/gluonj/ GluonJ] {{webarchive|url=https://web.archive.org/web/20070206010219/http://www.csg.is.titech.ac.jp/projects/gluonj/ |date=2007-02-06 }}, [http://www.st.informatik.tu-darmstadt.de/static/pages/projects/AORTA/Steamloom.jsp Steamloom] {{webarchive|url=https://web.archive.org/web/20070818100432/http://www.st.informatik.tu-darmstadt.de/static/pages/projects/AORTA/Steamloom.jsp |date=2007-08-18 }}</ref>
**पहलूजे
**एस्पेक्टजे
*[[जावास्क्रिप्ट]]<ref>Many: [http://i.gotfresh.info/2007/12/7/advised-methods-for-javascript-with-prototype/ Advisable] {{webarchive|url=https://web.archive.org/web/20080704052200/http://i.gotfresh.info/2007/12/7/advised-methods-for-javascript-with-prototype |date=2008-07-04 }}, [https://code.google.com/p/ajaxpect/ Ajaxpect] {{webarchive|url=https://web.archive.org/web/20160709203939/https://code.google.com/p/ajaxpect/ |date=2016-07-09 }}, [http://plugins.jquery.com/project/AOP jQuery AOP Plugin] {{webarchive|url=https://web.archive.org/web/20080113184156/http://plugins.jquery.com/project/AOP |date=2008-01-13 }}, [http://aspectes.tigris.org/ Aspectes] {{webarchive|url=http://archive.wikiwix.com/cache/20060508035836/http://aspectes.tigris.org/ |date=2006-05-08 }}, [http://www.aspectjs.com/ AspectJS] {{webarchive|url=https://web.archive.org/web/20081216010832/http://www.aspectjs.com/ |date=2008-12-16 }}, [http://www.cerny-online.com/cerny.js/ Cerny.js] {{webarchive|url=https://web.archive.org/web/20070627024906/http://www.cerny-online.com/cerny.js/ |date=2007-06-27 }}, [http://dojotoolkit.org/ Dojo Toolkit] {{webarchive|url=https://web.archive.org/web/20060221211958/http://www.dojotoolkit.org/ |date=2006-02-21 }}, [http://humax.sourceforge.net/ Humax Web Framework] {{webarchive|url=https://web.archive.org/web/20081209103012/http://humax.sourceforge.net/ |date=2008-12-09 }}, [https://code.google.com/p/joose-js/ Joose] {{webarchive|url=https://web.archive.org/web/20150318193601/http://code.google.com/p/joose-js/ |date=2015-03-18 }}, [[Prototype.js|Prototype]] - [http://www.prototypejs.org/api/function/wrap Prototype Function#wrap] {{webarchive|url=https://web.archive.org/web/20090505233620/http://www.prototypejs.org/api/function/wrap |date=2009-05-05 }}, [http://developer.yahoo.com/yui/3/api/Do.html YUI 3 (Y.Do)] {{webarchive|url=https://web.archive.org/web/20110125115930/https://developer.yahoo.com/yui/3/api/Do.html |date=2011-01-25 }}</ref>
*[[जावास्क्रिप्ट]]<ref>Many: [http://i.gotfresh.info/2007/12/7/advised-methods-for-javascript-with-prototype/ Advisable] {{webarchive|url=https://web.archive.org/web/20080704052200/http://i.gotfresh.info/2007/12/7/advised-methods-for-javascript-with-prototype |date=2008-07-04 }}, [https://code.google.com/p/ajaxpect/ Ajaxpect] {{webarchive|url=https://web.archive.org/web/20160709203939/https://code.google.com/p/ajaxpect/ |date=2016-07-09 }}, [http://plugins.jquery.com/project/AOP jQuery AOP Plugin] {{webarchive|url=https://web.archive.org/web/20080113184156/http://plugins.jquery.com/project/AOP |date=2008-01-13 }}, [http://aspectes.tigris.org/ Aspectes] {{webarchive|url=http://archive.wikiwix.com/cache/20060508035836/http://aspectes.tigris.org/ |date=2006-05-08 }}, [http://www.aspectjs.com/ AspectJS] {{webarchive|url=https://web.archive.org/web/20081216010832/http://www.aspectjs.com/ |date=2008-12-16 }}, [http://www.cerny-online.com/cerny.js/ Cerny.js] {{webarchive|url=https://web.archive.org/web/20070627024906/http://www.cerny-online.com/cerny.js/ |date=2007-06-27 }}, [http://dojotoolkit.org/ Dojo Toolkit] {{webarchive|url=https://web.archive.org/web/20060221211958/http://www.dojotoolkit.org/ |date=2006-02-21 }}, [http://humax.sourceforge.net/ Humax Web Framework] {{webarchive|url=https://web.archive.org/web/20081209103012/http://humax.sourceforge.net/ |date=2008-12-09 }}, [https://code.google.com/p/joose-js/ Joose] {{webarchive|url=https://web.archive.org/web/20150318193601/http://code.google.com/p/joose-js/ |date=2015-03-18 }}, [[Prototype.js|Prototype]] - [http://www.prototypejs.org/api/function/wrap Prototype Function#wrap] {{webarchive|url=https://web.archive.org/web/20090505233620/http://www.prototypejs.org/api/function/wrap |date=2009-05-05 }}, [http://developer.yahoo.com/yui/3/api/Do.html YUI 3 (Y.Do)] {{webarchive|url=https://web.archive.org/web/20110125115930/https://developer.yahoo.com/yui/3/api/Do.html |date=2011-01-25 }}</ref>
* लोगटॉक (प्रोग्रामिंग भाषा)<ref>Using built-in support for categories (which allows the encapsulation of aspect code) and event-driven programming (which allows the definition of ''before'' and after ''event'' handlers).</ref>
* लोगटॉक (प्रोग्रामिंग भाषा)<ref>Using built-in support for categories (which allows the encapsulation of aspect code) and event-driven programming (which allows the definition of ''before'' and after ''event'' handlers).</ref>
* [[लुआ (प्रोग्रामिंग भाषा)]]<ref>{{cite web|url=http://luaforge.net/projects/aspectlua/|title=पहलूलुआ|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20150717094121/http://luaforge.net/projects/aspectlua/|archive-date=17 July 2015}}</ref>
* [[लुआ (प्रोग्रामिंग भाषा)]]<ref>{{cite web|url=http://luaforge.net/projects/aspectlua/|title=पहलूलुआ|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20150717094121/http://luaforge.net/projects/aspectlua/|archive-date=17 July 2015}}</ref>
* [[बनाना (सॉफ्टवेयर)]]<ref>{{cite web|url=http://www.bramadams.org/makao/|archive-url=https://archive.today/2012.07.24-151524/http://www.bramadams.org/makao/|url-status=dead|archive-date=24 July 2012|title=मकाओ, पुनः (कविता) -इंजीनियरिंग बिल्ड सिस्टम|access-date=11 August 2015}}</ref>
* [[बनाना (सॉफ्टवेयर)|मेक (सॉफ्टवेयर)]]<ref>{{cite web|url=http://www.bramadams.org/makao/|archive-url=https://archive.today/2012.07.24-151524/http://www.bramadams.org/makao/|url-status=dead|archive-date=24 July 2012|title=मकाओ, पुनः (कविता) -इंजीनियरिंग बिल्ड सिस्टम|access-date=11 August 2015}}</ref>
*[[मतलब]]<ref>{{cite web|url=http://www.sable.mcgill.ca/mclab/aspectmatlab/index.html|title=मैकलैब|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20150924093214/http://www.sable.mcgill.ca/mclab/aspectmatlab/index.html|archive-date=24 September 2015}}</ref>
*[[मतलब|मैटलेब]]<ref>{{cite web|url=http://www.sable.mcgill.ca/mclab/aspectmatlab/index.html|title=मैकलैब|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20150924093214/http://www.sable.mcgill.ca/mclab/aspectmatlab/index.html|archive-date=24 September 2015}}</ref>
* [[एमएल (प्रोग्रामिंग भाषा)]]<ref>{{cite web|url=http://www.cs.princeton.edu/sip/projects/aspectml/|title=AspectML - पहलू-उन्मुख कार्यात्मक प्रोग्रामिंग भाषा अनुसंधान|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20101205005108/http://www.cs.princeton.edu/sip/projects/aspectml/|archive-date=5 December 2010}}</ref>
* [[एमएल (प्रोग्रामिंग भाषा)]]<ref>{{cite web|url=http://www.cs.princeton.edu/sip/projects/aspectml/|title=AspectML - पहलू-उन्मुख कार्यात्मक प्रोग्रामिंग भाषा अनुसंधान|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20101205005108/http://www.cs.princeton.edu/sip/projects/aspectml/|archive-date=5 December 2010}}</ref>
*[[नेमर्ले]]<ref>{{cite web|url=https://github.com/rsdn/nemerle/blob/master/README.md|title=nemerle/README.md at master · rsdn/nemerle|website=[[GitHub]] |access-date=22 March 2018}}</ref>
*[[नेमर्ले]]<ref>{{cite web|url=https://github.com/rsdn/nemerle/blob/master/README.md|title=nemerle/README.md at master · rsdn/nemerle|website=[[GitHub]] |access-date=22 March 2018}}</ref>
Line 253: Line 252:
* [[रैकेट (प्रोग्रामिंग भाषा)]]<ref>{{cite web|url=http://planet.racket-lang.org/display.ss?package=aspectscheme.plt&owner=dutchyn|title=PLaneT Package Repository : PLaneT > dutchyn > aspectscheme.plt|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20150905062740/http://planet.racket-lang.org/display.ss?package=aspectscheme.plt&owner=dutchyn|archive-date=5 September 2015}}</ref>
* [[रैकेट (प्रोग्रामिंग भाषा)]]<ref>{{cite web|url=http://planet.racket-lang.org/display.ss?package=aspectscheme.plt&owner=dutchyn|title=PLaneT Package Repository : PLaneT > dutchyn > aspectscheme.plt|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20150905062740/http://planet.racket-lang.org/display.ss?package=aspectscheme.plt&owner=dutchyn|archive-date=5 September 2015}}</ref>
* [[रूबी (प्रोग्रामिंग भाषा)]]<ref>{{cite web|url=http://aspectr-fork.sourceforge.net/|title=AspectR - रूबी में सरल पहलू-उन्मुख प्रोग्रामिंग|access-date=11 August 2015|url-status=live|archive-url=http://archive.wikiwix.com/cache/20150812003432/http://aspectr-fork.sourceforge.net/|archive-date=12 August 2015}}</ref><ref>{{cite web|url=http://aquarium.rubyforge.org/|archive-url=https://web.archive.org/web/20071026055811/http://aquarium.rubyforge.org/|url-status=dead|archive-date=26 October 2007|title=घर|author=Dean Wampler|access-date=11 August 2015}}</ref><ref>{{cite web|url=https://github.com/gcao/aspector|title=gcao/aspector|work=GitHub|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20150104180534/https://github.com/gcao/aspector|archive-date=4 January 2015}}</ref>
* [[रूबी (प्रोग्रामिंग भाषा)]]<ref>{{cite web|url=http://aspectr-fork.sourceforge.net/|title=AspectR - रूबी में सरल पहलू-उन्मुख प्रोग्रामिंग|access-date=11 August 2015|url-status=live|archive-url=http://archive.wikiwix.com/cache/20150812003432/http://aspectr-fork.sourceforge.net/|archive-date=12 August 2015}}</ref><ref>{{cite web|url=http://aquarium.rubyforge.org/|archive-url=https://web.archive.org/web/20071026055811/http://aquarium.rubyforge.org/|url-status=dead|archive-date=26 October 2007|title=घर|author=Dean Wampler|access-date=11 August 2015}}</ref><ref>{{cite web|url=https://github.com/gcao/aspector|title=gcao/aspector|work=GitHub|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20150104180534/https://github.com/gcao/aspector|archive-date=4 January 2015}}</ref>
* [[ चीख़ | चीख़]] स्मॉलटॉक<ref>{{cite web|url=http://www.prakinf.tu-ilmenau.de/~hirsch/Projects/Squeak/पहलू/|title=पहलू|website=tu-ilmenau.de|access-date=5 May 2018|url-status=dead|archive-url=https://web.archive.org/web/20060106112030/http://www.prakinf.tu-ilmenau.de/~hirsch/Projects/Squeak/पहलू/|archive-date=6 January 2006}}</ref><ref>{{cite web|url=http://csl.ensm-douai.fr/MetaclassTalk|title=MetaclassTalk: Reflection and Meta-Programming in Smalltalk|access-date=11 August 2015|url-status=dead|archive-url=https://web.archive.org/web/20150729062351/http://csl.ensm-douai.fr/MetaclassTalk|archive-date=29 July 2015}}</ref>
* [[ चीख़ | स्क्वीक]] स्मॉलटॉक<ref>{{cite web|url=http://www.prakinf.tu-ilmenau.de/~hirsch/Projects/Squeak/पहलू/|title=पहलू|website=tu-ilmenau.de|access-date=5 May 2018|url-status=dead|archive-url=https://web.archive.org/web/20060106112030/http://www.prakinf.tu-ilmenau.de/~hirsch/Projects/Squeak/पहलू/|archive-date=6 January 2006}}</ref><ref>{{cite web|url=http://csl.ensm-douai.fr/MetaclassTalk|title=MetaclassTalk: Reflection and Meta-Programming in Smalltalk|access-date=11 August 2015|url-status=dead|archive-url=https://web.archive.org/web/20150729062351/http://csl.ensm-douai.fr/MetaclassTalk|archive-date=29 July 2015}}</ref>
*यूएमएल 2|यूएमएल 2.0<ref>{{cite web|url=http://www.iit.edu/~concur/weavr|title=WEAVR|website=iit.edu|access-date=5 May 2018|url-status=live|archive-url=https://web.archive.org/web/20081212200221/http://www.iit.edu/~concur/weavr/|archive-date=12 December 2008}}</ref>
*यूएमएल 2|यूएमएल 2.0<ref>{{cite web|url=http://www.iit.edu/~concur/weavr|title=WEAVR|website=iit.edu|access-date=5 May 2018|url-status=live|archive-url=https://web.archive.org/web/20081212200221/http://www.iit.edu/~concur/weavr/|archive-date=12 December 2008}}</ref>
* [[एक्सएमएल]]<ref>{{cite web|url=https://code.google.com/p/aspectxml/|title=AspectXML - एक पहलू-उन्मुख XML वीविंग इंजन (AXLE) - Google प्रोजेक्ट होस्टिंग|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20150912161613/http://code.google.com/p/aspectxml/|archive-date=12 September 2015}}</ref>
* [[एक्सएमएल]]<ref>{{cite web|url=https://code.google.com/p/aspectxml/|title=AspectXML - एक पहलू-उन्मुख XML वीविंग इंजन (AXLE) - Google प्रोजेक्ट होस्टिंग|access-date=11 August 2015|url-status=live|archive-url=https://web.archive.org/web/20150912161613/http://code.google.com/p/aspectxml/|archive-date=12 September 2015}}</ref>
== यह भी देखें ==
== यह भी देखें ==
* [[वितरित एओपी]]
* [[वितरित एओपी]]
* [[विशेषता व्याकरण]], औपचारिकता जिसका उपयोग कार्यात्मक प्रोग्रामिंग भाषाओं के शीर्ष पर पहलू-उन्मुख प्रोग्रामिंग के लिए किया जा सकता है
* [[विशेषता व्याकरण]], औपचारिकता जिसका उपयोग फंक्शनिंग प्रोग्रामिंग भाषाओं के शीर्ष पर एस्पेक्ट ओरिएंटेड प्रोग्रामिंग के लिए किया जा सकता है
* प्रोग्रामिंग प्रतिमान
* प्रोग्रामिंग ओरिएंटेशन
* विषय-उन्मुख प्रोग्रामिंग, पहलू-उन्मुख प्रोग्रामिंग का विकल्प
* सब्जेक्ट ओरिएंटेड प्रोग्रामिंग, एस्पेक्ट ओरिएंटेड प्रोग्रामिंग का विकल्प
* भूमिका-उन्मुख प्रोग्रामिंग, पहलू-उन्मुख प्रोग्रामिंग का विकल्प
* करैक्टर ओरिएंटेड प्रोग्रामिंग, एस्पेक्ट ओरिएंटेड प्रोग्रामिंग का विकल्प
* [[विधेय प्रेषण]], [[भूमिका उन्मुख प्रोग्रामिंग]] का पुराना विकल्प
* [[विधेय प्रेषण]], [[भूमिका उन्मुख प्रोग्रामिंग]] का पुराना विकल्प
* [[निष्पादन योग्य यूएमएल]]
* [[निष्पादन योग्य यूएमएल]]
Line 273: Line 270:


==अग्रिम पठन==
==अग्रिम पठन==
* {{Cite conference | doi = 10.1007/BFb0053381| title = Aspect-oriented programming| work = Proceedings of the 11th European Conference on Object-Oriented Programming| conference = [[European Conference on Object-Oriented Programming|ECOOP]]'97| volume = 1241| pages = 220–242| series = [[Lecture Notes in Computer Science|LNCS]]| year = 1997| last1 = Kiczales | first1 = G. | author1-link = Gregor Kiczales | last2 = Lamping | first2 = J. | last3 = Mendhekar | first3 = A. | last4 = Maeda | first4 = C. | last5 = Lopes | first5 = C. | last6 = Loingtier | first6 = J. M. | last7 = Irwin | first7 = J. | isbn = 3-540-63089-9| citeseerx = 10.1.1.115.8660| url = http://www.cs.ubc.ca/~gregor/papers/kiczales-ECOOP1997-AOP.pdf}} The paper generally considered to be the authoritative reference for AOP.
* {{Cite conference | doi = 10.1007/BFb0053381| title = Aspect-oriented programming| work = Proceedings of the 11th European Conference on Object-Oriented Programming| conference = [[European Conference on Object-Oriented Programming|ECOOP]]'97| volume = 1241| pages = 220–242| series = [[Lecture Notes in Computer Science|LNCS]]| year = 1997| last1 = Kiczales | first1 = G. | author1-link = Gregor Kiczales | last2 = Lamping | first2 = J. | last3 = Mendhekar | first3 = A. | last4 = Maeda | first4 = C. | last5 = Lopes | first5 = C. | last6 = Loingtier | first6 = J. M. | last7 = Irwin | first7 = J. | isbn = 3-540-63089-9| citeseerx = 10.1.1.115.8660| url = http://www.cs.ubc.ca/~gregor/papers/kiczales-ECOOP1997-AOP.pdf}} The paper generally considered to be the authoritative reference for एओपी.
* {{cite book |author1=Robert E. Filman |author2=Tzilla Elrad |author3=Siobhán Clarke |author4=Mehmet Aksit | year = 2004 | title = Aspect-Oriented Software Development | isbn = 978-0-321-21976-3}}
* {{cite book |author1=Robert E. Filman |author2=Tzilla Elrad |author3=Siobhán Clarke |author4=Mehmet Aksit | year = 2004 | title = Aspect-Oriented Software Development | isbn = 978-0-321-21976-3}}
* {{cite book |author1=Renaud Pawlak, Lionel Seinturier  |author2=Jean-Philippe Retaillé  |name-list-style=amp| year = 2005 | title = Foundations of AOP for J2EE Development | isbn = 978-1-59059-507-7}}
* {{cite book |author1=Renaud Pawlak, Lionel Seinturier  |author2=Jean-Philippe Retaillé  |name-list-style=amp| year = 2005 | title = Foundations of AOP for J2EE Development | isbn = 978-1-59059-507-7}}
Line 288: Line 285:


== बाहरी संबंध ==
== बाहरी संबंध ==
* [[Eric Bodden]]'s [http://www.sable.mcgill.ca/aop.net/ list of AOP tools] in .net framework
* [[Eric Bodden]]'s [http://www.sable.mcgill.ca/aop.net/ list of एओपी tools] in .net framework
* [https://web.archive.org/web/20030821074213/http://aosd.net/conference/ Aspect-Oriented Software Development], annual conference on AOP
* [https://web.archive.org/web/20030821074213/http://aosd.net/conference/ Aspect-Oriented Software Development], annual conference on एओपी
* [http://www.eclipse.org/aspectj/doc/released/progguide/index.html AspectJ Programming Guide]
* [http://www.eclipse.org/aspectj/doc/released/progguide/index.html एस्पेक्टजे Programming Guide]
* [https://web.archive.org/web/20141216200424/http://aspectbench.org/ The AspectBench Compiler for AspectJ], another Java implementation
* [https://web.archive.org/web/20141216200424/http://aspectbench.org/ The AspectBench Compiler for एस्पेक्टजे], another Java implementation
* [http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=AOP@work: Series of IBM developerWorks articles on AOP]
* [http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=AOP@work: Series of IBM developerWorks articles on एओपी]
* {{cite web |last1=Laddad |first1=Ramnivas |date=2002-01-18 |df=mdy |url=https://www.infoworld.com/article/2073918/i-want-my-aop---part-1.html |title=I want my AOP!, Part 1 |work=[[JavaWorld]] |access-date=2020-07-20}} A detailed series of articles on basics of aspect-oriented programming and AspectJ
* {{cite web |last1=Laddad |first1=Ramnivas |date=2002-01-18 |df=mdy |url=https://www.infoworld.com/article/2073918/i-want-my-aop---part-1.html |title=I want my AOP!, Part 1 |work=[[JavaWorld]] |access-date=2020-07-20}} A detailed series of articles on basics of aspect-oriented programming and एस्पेक्टजे
* [https://web.archive.org/web/20090821185951/http://codefez.com/what-is-aspect-oriented-programming/ What is Aspect-Oriented Programming?], introduction with RemObjects Taco
* [https://web.archive.org/web/20090821185951/http://codefez.com/what-is-aspect-oriented-programming/ What is Aspect-Oriented Programming?], introduction with RemObjects Taco
* [http://www.cis.uab.edu/gray/Research/C-SAW/ Constraint-Specification Aspect Weaver]
* [http://www.cis.uab.edu/gray/Research/C-SAW/ Constraint-Specification Aspect Weaver]
* [http://www.devx.com/Java/Article/28422 Aspect- vs. Object-Oriented Programming: Which Technique, When?]
* [http://www.devx.com/Java/Article/28422 Aspect- vs. Object-Oriented Programming: Which Technique, When?]
* [http://video.google.com/videoplay?docid=8566923311315412414&q=engEDU Gregor Kiczales, Professor of Computer Science, explaining AOP], video 57 min.
* [http://video.google.com/videoplay?docid=8566923311315412414&q=engEDU Gregor Kiczales, Professor of Computer Science, explaining एओपी], video 57 min.
* [http://database.ittoolbox.com/documents/academic-articles/what-does-aspectoriented-programming-mean-to-cobol-4570 Aspect Oriented Programming in COBOL] {{Webarchive|url=https://web.archive.org/web/20081217055353/http://database.ittoolbox.com/documents/academic-articles/what-does-aspectoriented-programming-mean-to-cobol-4570 |date=2008-12-17 }}
* [http://database.ittoolbox.com/documents/academic-articles/what-does-aspectoriented-programming-mean-to-cobol-4570 Aspect Oriented Programming in COBOL] {{Webarchive|url=https://web.archive.org/web/20081217055353/http://database.ittoolbox.com/documents/academic-articles/what-does-aspectoriented-programming-mean-to-cobol-4570 |date=2008-12-17 }}
* [http://static.springframework.org/spring/docs/2.0.x/reference/aop.html Aspect-Oriented Programming in Java with Spring Framework]
* [http://static.springframework.org/spring/docs/2.0.x/reference/aop.html Aspect-Oriented Programming in Java with Spring Framework]
* [http://www.sharpcrafters.com/aop.net Wiki dedicated to AOP methods on.NET]
* [http://www.sharpcrafters.com/aop.net Wiki dedicated to एओपी methods on.NET]
*[https://web.archive.org/web/20090124183215/http://dssg.cs.umb.edu/wiki/index.php/Early_Aspects_for_Business_Process_Modeling Early Aspects for Business Process Modeling (An Aspect Oriented Language for BPMN)]
*[https://web.archive.org/web/20090124183215/http://dssg.cs.umb.edu/wiki/index.php/Early_Aspects_for_Business_Process_Modeling Early Aspects for Business Process Modeling (An Aspect Oriented Language for BPMN)]
* [http://java2novice.com/spring/aop-and-aspectj-introduction/ Spring AOP and AspectJ Introduction]
* [http://java2novice.com/spring/aop-and-aspectj-introduction/ Spring एओपी and एस्पेक्टजे Introduction]
* [http://www.cs.bilkent.edu.tr/~bedir/CS586-AOSD AOSD Graduate Course at Bilkent University]
* [http://www.cs.bilkent.edu.tr/~bedir/CS586-AOSD AOSD Graduate Course at Bilkent University]
* [http://www.se-radio.net/podcast/2008-08/episode-106-introduction-aop Introduction to AOP - Software Engineering Radio Podcast Episode 106]
* [http://www.se-radio.net/podcast/2008-08/episode-106-introduction-aop Introduction to एओपी - Software Engineering Radio Podcast Episode 106]
* [https://web.archive.org/web/20120801133941/http://innoli.com/en/Innoli-EN/OpenSource.html An Objective-C implementation of AOP by Szilveszter Molnar]
* [https://web.archive.org/web/20120801133941/http://innoli.com/en/Innoli-EN/OpenSource.html An Objective-C implementation of एओपी by Szilveszter Molnar]
* [https://github.com/forensix/MGAOP Aspect-Oriented programming for iOS and OS X by Manuel Gebele]
* [https://github.com/forensix/MGAOP Aspect-Oriented programming for iOS and OS X by Manuel Gebele]
* [https://community.devexpress.com/blogs/wpf/archive/2013/12/04/devexpress-mvvm-framework-introduction-to-poco-viewmodels.aspx DevExpress MVVM Framework. Introduction to POCO ViewModels]
* [https://community.devexpress.com/blogs/wpf/archive/2013/12/04/devexpress-mvvm-framework-introduction-to-poco-viewmodels.aspx DevExpress MVVM Framework. Introduction to POCO ViewModels]
{{aosd}}
{{aosd}}


{{DEFAULTSORT:Aspect-Oriented Programming}}[[Category: पहलू-उन्मुख प्रोग्रामिंग | पहलू-उन्मुख प्रोग्रामिंग ]] [[Category: पहलू उन्मुख सॉफ्टवेयर विकास]] [[Category: प्रोग्रामिंग प्रतिमान]]
{{DEFAULTSORT:Aspect-Oriented Programming}}
 
 


[[Category: Machine Translated Page]]
[[Category:All articles with dead external links]]
[[Category:Created On 13/05/2023]]
[[Category:Articles with dead external links from May 2018]]
[[Category:Articles with hatnote templates targeting a nonexistent page|Aspect-Oriented Programming]]
[[Category:Articles with permanently dead external links]]
[[Category:CS1 errors]]
[[Category:CS1 maint]]
[[Category:Collapse templates|Aspect-Oriented Programming]]
[[Category:Created On 13/05/2023|Aspect-Oriented Programming]]
[[Category:Lua-based templates|Aspect-Oriented Programming]]
[[Category:Machine Translated Page|Aspect-Oriented Programming]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists|Aspect-Oriented Programming]]
[[Category:Pages with script errors|Aspect-Oriented Programming]]
[[Category:Sidebars with styles needing conversion|Aspect-Oriented Programming]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready|Aspect-Oriented Programming]]
[[Category:Templates generating microformats|Aspect-Oriented Programming]]
[[Category:Templates that add a tracking category|Aspect-Oriented Programming]]
[[Category:Templates that are not mobile friendly|Aspect-Oriented Programming]]
[[Category:Templates that generate short descriptions|Aspect-Oriented Programming]]
[[Category:Templates using TemplateData|Aspect-Oriented Programming]]
[[Category:Webarchive template other archives]]
[[Category:Webarchive template wayback links|Aspect-Oriented Programming]]
[[Category:Wikipedia metatemplates|Aspect-Oriented Programming]]
[[Category:पहलू-उन्मुख प्रोग्रामिंग| पहलू-उन्मुख प्रोग्रामिंग ]]
[[Category:पहलू उन्मुख सॉफ्टवेयर विकास|Aspect-Oriented Programming]]
[[Category:प्रोग्रामिंग प्रतिमान|Aspect-Oriented Programming]]

Latest revision as of 15:20, 25 May 2023


कम्प्यूटिंग में आस्पेक्ट ओरिएंटेड प्रोग्रामिंग (एओपी) प्रोग्रामिंग तकनीक है, जिसका उद्देश्य क्रॉस-कटिंग से होने वाली समस्याओं को अलग करने की अनुमति देकर प्रतिरूपकता (प्रोग्रामिंग) को बढ़ावा देना है। यह वर्तमान समय में कोडिंग विधि में इसे संयोजित करता है जो बिना कोड को संशोधित किए, इसके अतिरिक्त अलग से निर्दिष्टता प्रदान करता है, इस प्रकार इससे यह पता चलता हैं कि कौन सा कोड बिंदुकट विनिर्देश के माध्यम से संशोधित किया गया है, जैसे कि फ़ंक्शन का नाम प्रारंभ होने पर सभी फ़ंक्शन कॉल लॉग करना 'तय करना'" इत्यादि कार्य इसके द्वारा किये जाते हैं। इस प्रकार यह उन व्यवहारों को भी अनुमति देता है जो व्यापार तर्क जैसे लॉगिंग के लिए केंद्रीकृत नहीं होते हैं, उनकी कार्यक्षमताओं को आंकने के लिए कोड कोर को अव्यवस्थित किए बिना प्रोग्राम में जोड़ा जाना चाहिए।

एओपी में प्रोग्रामिंग विधियाँ और उपकरण सम्मिलित होते हैं जो स्रोत कोड के स्तर पर आने वाली समस्याओं के मॉड्यूलरीकरण का समर्थन करते हैं, जबकि एस्पेक्ट ओरिएंटेड सॉफ़्टवेयर विकास संपूर्ण अभियांत्रिकी के अनुशासन को संदर्भित करता है।

आस्पेक्ट-ओरिएंटेड प्रोग्रामिंग में प्रोग्राम लॉजिक को अलग-अलग भागों जैसे तथाकथित समस्याओं, कार्यक्षमता के एकजुट क्षेत्रों में पृथक करना सम्मिलित है। लगभग सभी प्रोग्रामिंग ओरिएंटेड प्रोग्रामिंग जैसे, फंक्शन, प्रोसेसिंग, मॉड्यूल, वर्ग, विधियाँ प्रदान करके अलग-अलग, स्वतंत्र संस्थाओं में आने वाली समस्याओं के समूहीकरण और इनकैप्सुलेशन को कंप्यूटर विज्ञान के कुछ स्तर का समर्थन करते हैं, जिनका उपयोग इस प्रकार से आने वाली समस्याओं को लागू करने, इसे संदर्भित करने और बनाने के लिए उपयोग किया जा सकता है। इस प्रकार कुछ आने वाली इस प्रकार की सम्स्याएँ फंक्शन में कई कार्यों में कमी कर देती हैं, और कार्यान्वयन के प्रारूप की अवहेलना करती हैं। इस प्रकार से आने वाली समस्याओं को क्रॉस-कटिंग समस्याएँ या क्षैतिज समस्याएँ कहा जाता है।

डेटा प्रविष्ट कराना क्रॉसकटिंग समस्या का उदाहरण है क्योंकि लॉगिंग करने वाली इस रणनीति को सिस्टम के प्रत्येक लॉग किए गए भाग को आवश्यक रूप से प्रभावित करती है। इस प्रकार लॉगिंग जिससे सभी लॉग क्लास और तरीके 'क्रॉसकट' हो जाते हैं।

सभी एओपी कार्यान्वयनों में कुछ क्रॉसकटिंग अभिव्यक्तियाँ होती हैं जो प्रत्येक समस्या को स्थान पर समाहित करती हैं। कार्यान्वयन के बीच का अंतर प्रदान किए गए निर्माणों की शक्ति, सुरक्षा और उपयोगिता में निहित है। इस प्रकार उदाहरण के लिए, इंटरसेप्टर जो प्रकार-सुरक्षा या डिबगिंग के लिए अधिक समर्थन के बिना क्रॉसकटिंग के सीमित रूप को व्यक्त करने के विधियों को निर्दिष्ट करते हैं। इस प्रकार एस्पेक्टजे में ऐसे कई भाव हैं और उन्हें विशेष वर्ग, एस्पेक्ट (कंप्यूटर विज्ञान) में समाहित करता है। उदाहरण के लिए, एस्पेक्ट आधार कोड (एक फंक्शन का अनएस्पेक्ट ओरिएंटेड प्रोग्रामिंग) के व्यवहार को परिवर्तित करता है, जो कि परिमाण स्वरूप इसमें निर्दिष्ट विभिन्न सम्मिलित बिंदुओं जैसे किसी फंक्शन में बिंदु को एस्पेक्ट ओरिएंटेड प्रोग्रामिंग में उपयोग करने के अतिरिक्त इसके व्यवहार में कमांड लागू करता है। क्वेरी को पॉइंटकट कहा जाता है, जो इस प्रकार यह पता लगाता है कि दिए गए संयोजन के बिंदु से यह मेल खाता है या नहीं खाता हैं। एस्पेक्ट सदस्यों या पैरेंट को जोड़ने जैसे अन्य वर्गों में बाइनरी-संगत संरचनात्मक परिवर्तन भी कर सकता है।

इतिहास

एओपी के कई प्रत्यक्ष पूर्ववृत्त A1 और A2 हैं:[1] प्रतिबिंब (कंप्यूटर प्रोग्रामिंग) और मेटाऑब्जेक्ट्स, सब्जेक्ट ओरिएंटेड प्रोग्रामिंग, संरचना फ़िल्टर और अनुकूली प्रोग्रामिंग के प्रतिरूप हैं।[2] ज़ेरॉक्स पीएआरसी में ग्रेगोर किकज़ालेस और उनके सहयोगियों ने एओपी की स्पष्ट अवधारणा विकसित की थी, और इस प्रकार जावा के लिए एस्पेक्टजे एओपी एक्सटेंशन के साथ इसका अनुसरण किया गया था। इस प्रकार आईबीएम की अनुसंधान टीम ने भाषा डिजाइन दृष्टिकोण पर उपकरण दृष्टिकोण का अनुसरण किया और 2001 में हाइपर/जे और समस्या हेरफेर पर्यावरण प्रस्तावित किया, जिसका व्यापक उपयोग नहीं देखा गया है।

इस आलेख के उदाहरण एस्पेक्टजे का उपयोग करते हैं।

माइक्रोसाॅफ्ट ट्रांसैक्शन सर्वर को एओपी का पहला प्रमुख एप्लिकेशन माना जाता है, जिसके बाद इंटरप्राइस जावाबींस आता है।[3][4]

प्रेरणा और मौलिक अवधारणाएँ

सामान्यतः, एस्पेक्ट कोड के रूप में यह प्रसारिस या उलझा हुआ होता है, जिससे इसे समझना और बनाए रखना कठिन हो जाता है। यह कार्य के आधार पर प्रसारित होता है, जैसे लॉगिंग इसका मुख्य उदाहरण हैं। इस प्रकार कई असंबद्ध कार्यों में यह प्रसारित होता है जो संभवतः पूर्ण रूप से असंबंधित प्रणालियों, विभिन्न स्रोत भाषाओं आदि में इसके कार्य का उपयोग कर सकता है। इसका अर्थ है कि लॉगिंग को परिवर्तित करने के लिए सभी प्रभावित मॉड्यूल को संशोधित करने की आवश्यकता हो सकती है। इस प्रकार एस्पेक्ट न केवल सिस्टम के मेनलाइन फ़ंक्शन के साथ अलग व्यवहार करता हैं, जिसमें वे अभिव्यक्त होते हैं बल्कि दूसरे के साथ भी इसी प्रकार रहते हैं। इसका अर्थ है कि समस्या को परिवर्तित करने के लिए सभी अलग प्रकार से आने वाली सम्स्याओं को समझना होगा या कुछ ऐसा साधन होना चाहिए जिससे परिवर्तनों के प्रभाव का अनुमान लगाया जा सके।

उदाहरण के लिए, खाते से दूसरे खाते में राशि स्थानांतरित करने के लिए अवधारणात्मक रूप से बहुत ही सरल विधि के साथ बैंकिंग एप्लिकेशन पर विचार करें:[5]

void transfer(Account fromAcc, Account toAcc, int amount) throws Exception {
  if (fromAcc.getBalance() < amount)
      throw new InsufficientFundsException();

  fromAcc.withdraw(amount);
  toAcc.deposit(amount);
}

चूंकि, यह स्थानांतरण विधि कुछ विचारों को अनदेखा करती है, जो इस प्रकार उपयोग में लाए जाने वाले एप्लीकेशन की आवश्यकता होगी: यह सत्यापित करने के लिए सुरक्षा जांच की कमी है कि वर्तमान उपयोगकर्ता के पास इस ऑपरेशन को करने के लिए प्राधिकरण है, इस प्रकार आकस्मिक डेटा हानि को रोकने के लिए डेटाबेस लेनदेन को ऑपरेशन को समाहित करना चाहिए, डायग्नोस्टिक्स के लिए, ऑपरेशन को सिस्टम लॉग आदि में लॉग इन किया जाना चाहिए।

उन सभी नई आने वाली सम्स्याओं के साथ संस्करण, उदाहरण के लिए, कुछ इस प्रकार दिख सकता है:

void transfer(Account fromAcc, Account toAcc, int amount, User user,
    Logger logger, Database database) throws Exception {
  logger.info("Transferring money...");
  
  if (!isUserAuthorised(user, fromAcc)) {
    logger.info("User has no permission.");
    throw new UnauthorisedUserException();
  }
  
  if (fromAcc.getBalance() < amount) {
    logger.info("Insufficient funds.");
    throw new InsufficientFundsException();
  }

  fromAcc.withdraw(amount);
  toAcc.deposit(amount);

  database.commitChanges();  // Atomic operation.

  logger.info("Transaction successful.");
}

इस उदाहरण में, अन्य मौलिक कार्यक्षमता जिसे कभी-कभी व्यावसायिक तर्क समस्या कहा जाता है, इसके साथ उलझ गई हैं। इस प्रकार लेन-देन, सुरक्षा और लॉगिंग सभी क्रॉस-कटिंग आने वाली सम्स्याओं का उदाहरण देते हैं।

अब विचार करें कि क्या होता है यदि हमें अचानक (उदाहरण के लिए) एप्लीकेशन के लिए सुरक्षा विचारों को परिवर्तित करने की आवश्यकता होती है। इस प्रकार फंक्शन के वर्तमान संस्करण में, सुरक्षा से संबंधित संचालन कई तरीकों में प्रसारित होता हुआ दिखाई देता है, और इस प्रकार के परिवर्तित कराव के लिए बड़े प्रयास की आवश्यकता होगी।

एओपी इस समस्या को हल करने का प्रयास करता है, प्रोग्रामर को स्टैंड-अलोन मॉड्यूल में क्रॉस-कटिंग आने वाली सम्स्याओं को व्यक्त करने की अनुमति देता है जिसे एस्पेक्ट कहा जाता है। ओरिएंटेशन में कमांड हो सकती है (प्रोग्राम में निर्दिष्ट बिंदुओं में सम्मिलित कोड) और अंतर-प्रकार की घोषणाएं (संरचनात्मक सदस्यों को अन्य वर्गों में जोड़ा गया)। उदाहरण के लिए, सुरक्षा मॉड्यूल में ऐसी कमांड सम्मिलित हो सकती है जो बैंक खाते तक पहुँचने से पहले सुरक्षा जाँच करती है। पॉइंटकट उस समय को परिभाषित करता है, इस प्रकार जॉइन पॉइंट्स जब कोई बैंक खाते तक पहुंच सकता है, और कमांड निकाय में कोड परिभाषित करता है कि सुरक्षा जांच कैसे लागू की जाती है। इस प्रकार, चेक और स्थानों दोनों को ही स्थान पर बनाए रखा जा सकता है। इसके अतिरिक्त, अच्छा पॉइंटकट बाद में फंक्शन में परिवर्तित होने का अनुमान लगा सकता है, इसलिए यदि कोई अन्य डेवलपर बैंक खाते तक पहुंचने के लिए नई विधि बनाता है, तो इस प्रकार कमांड नई पद्धति पर लागू होगी जब यह निष्पादित होगी।

इसलिए उपरोक्त उदाहरण के लिए एस्पेक्ट में लॉगिंग लागू करना:

aspect Logger {
  void Bank.transfer(Account fromAcc, Account toAcc, int amount, User user, Logger logger)  {
    logger.info("Transferring money...");
  }

  void Bank.getMoneyBack(User user, int transactionId, Logger logger)  {
    logger.info("User requested money back.");
  }

  // Other crosscutting code.
}

कोई एओपी को डिबगिंग टूल या उपयोगकर्ता-स्तरीय टूल के रूप में सोच सकता है। इस प्रकार कमांड उन स्थितियों के लिए आरक्षित होनी चाहिए जहां आप फ़ंक्शन को परिवर्तित कर नहीं सकते (उपयोगकर्ता स्तर)[6] या फ़ंक्शन को उत्पादन कोड (डीबगिंग) में परिवर्तित करना नहीं चाहते हैं।

बिंदु मॉडल से संयोजन

एस्पेक्ट ओरिएंटेड भाषा का कमांड-संबंधित घटक ज्वाइन पॉइंट मॉडल (जेपीएम) को परिभाषित करता है। जेपीएम तीन चीजों को परिभाषित करता है:

  1. जब कमांड चल सकती है। इन्हें जॉइन पॉइंट्स कहा जाता है क्योंकि ये रनिंग प्रोग्राम में पॉइंट्स होते हैं जहाँ अतिरिक्त व्यवहार को उपयोगी रूप से जोड़ा जा सकता है। ज्वाइन पॉइंट को उपयोगी होने के लिए सामान्य प्रोग्रामर द्वारा पता करने योग्य और समझने योग्य होना चाहिए। इस प्रकार के परिवर्तित करने में एस्पेक्ट स्थिर होने के लिए इसे असंगत फंक्शन परिवर्तनों में भी स्थिर होना चाहिए। कई एओपी कार्यान्वयन विधि निष्पादन और फ़ील्ड संदर्भों को जुड़ने वाले बिंदुओं के रूप में समर्थन करते हैं।
  2. बिंदुओं को जोड़ने (या परिमाणित) करने का तरीका, जिसे पॉइंटकट कहा जाता है। पॉइंटकट निर्धारित करते हैं कि दिया गया ज्वाइन पॉइंट मैच करता है या नहीं। अधिकांश उपयोगी पॉइंटकट लैंग्वेज बेस लैंग्वेज जैसे सिंटैक्स का उपयोग करती हैं (उदाहरण के लिए, एस्पेक्टजे जावा सिग्नेचर का उपयोग करता है) और नामकरण और संयोजन के माध्यम से पुन: उपयोग की अनुमति देता है।
  3. जुड़ने के बिंदु पर चलने के लिए कोड निर्दिष्ट करने का साधन हैं। एस्पेक्टजे इस कमांड को आस्पेक्ट-ओरिएंटेड प्रोग्रामिंग में कॉल करता है, और इसे ज्वाइन पॉइंट्स के पहले, बाद में और आसपास चला सकता है। कुछ कार्यान्वयन किसी अन्य वर्ग पर एस्पेक्ट में विधि को परिभाषित करने जैसी चीजों का भी समर्थन करते हैं।

जॉइन-पॉइंट मॉडल की तुलना जॉइन पॉइंट्स के आधार पर की जा सकती है, जॉइन पॉइंट्स कैसे निर्दिष्ट किए जाते हैं, इस प्रकार जॉइन पॉइंट्स पर अनुमत संचालन और संरचनात्मक संवर्द्धन जो व्यक्त किए जा सकते हैं।

एस्पेक्टजे का ज्वाइन-पॉइंट मॉडल

  • एस्पेक्टजे में जुड़ने वाले बिंदुओं में विधि या कन्स्ट्रक्टर कॉल या निष्पादन, कक्षा या ऑब्जेक्ट का प्रारंभ, फ़ील्ड पढ़ने और लिखने का उपयोग, अपवाद हैंडलर इत्यादि सम्मिलित हैं। इसमें लूप, सुपर कॉल, फेंक खंड, एकाधिक कथन इत्यादि सम्मिलित नहीं हैं।
  • पॉइंटकट 'आदिम पॉइंटकट डिज़ाइनर' (PCDs) के संयोजन द्वारा निर्दिष्ट किए जाते हैं।

    "किंडेड" पीसीडी एक विशेष प्रकार के जॉइन पॉइंट (जैसे, विधि निष्पादन) से मेल खाते हैं और इनपुट के रूप में जावा-जैसे हस्ताक्षर लेते हैं। ऐसा ही एक पॉइंटकट इस तरह दिखता है:

     execution(* set*(*))
    

    यदि विधि नाम से शुरू होता है, तो यह पॉइंटकट विधि-निष्पादन ज्वाइन पॉइंट से मेल खाता है"set" और किसी भी प्रकार का एक ही तर्क है।

    "गतिशील" पीसीडी रनटाइम प्रकारों की जांच करते हैं और वेरिएबल्स को बाइंड करते हैं। उदाहरण के लिए,

      this(Point)
    

    यह पॉइंटकट तब मेल खाता है जब वर्तमान में निष्पादित वस्तु वर्ग का एक उदाहरण है Point.ध्यान दें कि जावा के सामान्य प्रकार के लुकअप के माध्यम से कक्षा के अयोग्य नाम का उपयोग किया जा सकता है।

    "स्कोप" PCDs ज्वाइन पॉइंट के लेक्सिकल स्कोप को सीमित करते हैं। उदाहरण के लिए:

     within(com.company.*)
    

    यह पॉइंटकट किसी भी प्रकार के किसी भी जॉइन पॉइंट से मेल खाता है com.company पैकेज, * वाइल्डकार्ड का एक रूप है जिसका उपयोग एक हस्ताक्षर से कई चीजों का मिलान करने के लिए किया जा सकता है।

    पॉइंटकट की रचना की जा सकती है और पुन: उपयोग के लिए नामित किया जा सकता है। उदाहरण के लिए:

     pointcut set() : execution(* set*(*) ) && this(Point) && within(com.company.*);
    
    यदि विधि नाम से शुरू होता है, तो यह पॉइंटकट विधि-निष्पादन ज्वाइन पॉइंट से मेल खाता है "set" और this प्रकार का उदाहरण है Point में com.company पैकेज रहता हैं। इसे नाम का उपयोग करके संदर्भित किया जा सकता है "set()".
  • यह कमांड एक निश्चित कोड (एक विधि में कोड की तरह निर्दिष्ट) एक ज्वाइन पॉइंट (पॉइंटकट के साथ निर्दिष्ट) पर (पहले, बाद में, या आसपास) चलाने के लिए निर्दिष्ट करती है। जब पॉइंटकट ज्वाइन पॉइंट से मेल खाता है तो एओपी रनटाइम सलाह को स्वचालित रूप से आमंत्रित करता है। उदाहरण के लिए:
     after() : set() {
       Display.update();
     }
    
    यह प्रभावी रूप से निर्दिष्ट करता है: "if the set() pointcut matches the join point, run the code Display.update() after the join point completes."

अन्य संभावित ज्वाइन पॉइंट मॉडल

अन्य प्रकार के जेपीएम हैं। सभी कमांड भाषाओं को उनके जेपीएम के संदर्भ में परिभाषित किया जा सकता है। इस प्रकार उदाहरण के लिए, एकीकृत मॉडलिंग भाषा के लिए काल्पनिक एस्पेक्ट भाषा में निम्नलिखित जेपीएम हो सकते हैं:

  • ज्वाइन पॉइंट सभी मॉडल तत्व हैं।
  • पॉइंटकट कुछ बूलियन एक्सप्रेशन हैं जो मॉडल तत्वों को जोड़ते हैं।
  • इन बिंदुओं पर प्रभाव के साधन सभी मिलान किए गए जुड़ने वाले बिंदुओं का दृश्य है।

अंतर-प्रकार की घोषणाएं

अंतर-प्रकार की घोषणा मॉड्यूल की संरचना को प्रभावित करने वाली क्रॉसकटिंग आने वाली सम्स्याओं को व्यक्त करने का तरीका प्रदान करती है। खुली क्लासेस और विस्तार विधियों के रूप में भी जाना जाता है, यह प्रोग्रामर को स्थान पर सदस्यों या किसी अन्य वर्ग के पैरेंट की घोषणा करने में सक्षम बनाता है, सामान्यतः एस्पेक्ट से संबंधित सभी कोड को संयोजित करने के लिए किया जाता हैं। इस प्रकार उदाहरण के लिए, यदि प्रोग्रामर ने इसके अतिरिक्त आगंतुकों का उपयोग करके क्रॉसकटिंग डिस्प्ले-अपडेट समस्या को लागू किया, तो आगंतुक पैटर्न का उपयोग करते हुए अंतर-प्रकार की घोषणा एस्पेक्टजे में इस प्रकार दिखाई दे सकती है:

  aspect DisplayUpdate {
    void Point.acceptVisitor(Visitor v) {
      v.visit(this);
    }
    // other crosscutting code...
  }

यह कोड स्निपेट जोड़ता है, जिसमें acceptVisitor विधि को Point की क्लास के रूप में उपयोग करते हैं।

यह आवश्यकता है कि कोई भी संरचनात्मक परिवर्धन मूल वर्ग के साथ संगत हो, जिससे कि इस प्रकार वर्तमान वर्ग के ग्राहक तब तक कार्य करते रहें, जब तक कि एओपी कार्यान्वयन सभी ग्राहकों को हर समय नियंत्रित करने की अपेक्षा नहीं करते हैं।

कार्यान्वयन

अंतर्निहित भाषाओं और परिवेशों के आधार पर एओपी प्रोग्राम अन्य प्रोग्रामों को दो अलग-अलग तरीकों से प्रभावित कर सकते हैं:

  1. एक संयुक्त फंक्शन तैयार किया जाता है, जो मूल भाषा में मान्य होता है और सामान्य फंक्शन से अंतिम दुभाषिया तक अप्रभेद्य होता है
  2. एओपी सुविधाओं को समझने और लागू करने के लिए अंतिम दुभाषिया या पर्यावरण को अद्यतन किया गया है।

परिवर्तित करते वातावरण की कठिनाई का अर्थ है कि अधिकांश कार्यान्वयन प्रकार के फंक्शन परिवर्तन के माध्यम से संगत संयोजन फंक्शन तैयार करते हैं जिन्हें बुनाई के रूप में जाना जाता है। एस्पेक्ट प्रोग्रामर एस्पेक्ट ओरिएंटेड कोड पढ़ते है और एकीकृत ओरिएंटेशन के साथ उपयुक्त वस्तु-उन्मुख कोड उत्पन्न करता है। इस प्रकार एओपी भाषा को विभिन्न प्रकार की बुनाई विधियों के माध्यम से लागू किया जा सकता है, इसलिए किसी भाषा के शब्दार्थ को कभी भी इसके कार्यान्वयन के संदर्भ में नहीं समझा जाना चाहिए। इस संयोजन की किस विधि का उपयोग किया जाता है, केवल कार्यान्वयन की गति और इसकी उपयोग में लाए जाने वालेी में सरलता प्रभावित होती है।

सिस्टम प्रीप्रोसेसरों का उपयोग करके स्रोत-स्तर की बुनाई को लागू कर सकता है, जैसा कि C ++ मूल रूप से सी फ्रंट में लागू किया गया था, जिसके लिए प्रोग्राम स्रोत फ़ाइलों तक पहुंच की आवश्यकता होती है। चूंकि, जावा का अच्छी तरह से परिभाषित बाइनरी फॉर्म बायटेकोड बुनकरों को किसी भी जावा प्रोग्राम के साथ .class-file फॉर्म में कार्य करने में सक्षम बनाता है। बाइटकोड बनाने वालों को निर्माण प्रक्रिया के समय उपयोग में लाए जाने वाले किया जा सकता है या, यदि वर्ग लोडिंग के समय बुनाई मॉडल प्रति-वर्ग है। इस प्रकार एस्पेक्टजे ने 2001 में स्रोत-स्तर की बुनाई के साथ प्रारंभ की, 2002 में प्रति-श्रेणी बायटेकोड वीवर दिया, और 2005 में एस्पेक्ट वर्क्ज के एकीकरण के बाद उन्नत लोड-टाइम समर्थन की प्रस्तुति की हैं।

कोई भी समाधान जो प्रोग्राम को रनटाइम पर जोड़ता है उसे ऐसे विचार प्रदान करने होते हैं, जो इस प्रकार प्रोग्रामर के अलग-अलग मॉडल को बनाए रखने के लिए उन्हें ठीक से अलग करते हैं। एकाधिक स्रोत फ़ाइलों के लिए जावा का बायटेकोड समर्थन किसी भी डिबगर को स्रोत संपादक में ठीक से बुनी गई .class फ़ाइल के माध्यम से आगे बढ़ने में सक्षम बनाता है। चूंकि, कुछ तृतीय-पक्ष डिकंपाइलर बुने हुए कोड को संसाधित नहीं कर सकते हैं क्योंकि वे सभी समर्थित बायटेकोड रूपों के अतिरिक्त जावैक द्वारा निर्मित कोड की अपेक्षा करते हैं।

उपयोग में लाए जाने वालेी-समय की बुनाई और दृष्टिकोण प्रदान करती है।[7] यह मूल रूप से पोस्ट-प्रोसेसिंग का अर्थ है, अपितु उत्पन्न कोड को पैच करने के अतिरिक्त, यह बुनाई दृष्टिकोण वर्तमान वर्गों को उपवर्गित करता है जिससे कि संशोधनों को विधि-ओवरराइडिंग द्वारा प्रस्तुत किया जा सके। वर्तमान क्लासेस रनटाइम पर भी उपयोग नहीं होती हैं, और इस प्रकार विकास के समय सभी वर्तमान टूल्स जैसे डीबगर, प्रोफाइलर इत्यादि का उपयोग किया जा सकता है। इस प्रकार आईबीएम के वेबस्फेयर जैसे कई चल देना ई एप्लिकेशन सर्वरों के कार्यान्वयन में समान दृष्टिकोण पहले ही साबित हो चुका है।

शब्दावली

एस्पेक्ट ओरिएंटेड प्रोग्रामिंग में प्रयुक्त मानक शब्दावली में सम्मिलित हो सकते हैं:

फिल्म आदि में दृश्यों के संपादन संबंधी समस्याएँ
भले ही OO मॉडल में अधिकांश वर्ग एकल, विशिष्ट कार्य करेंगे, वे अधिकांशतः अन्य वर्गों के साथ सामान्य, द्वितीयक आवश्यकताओं को साझा करते हैं। उदाहरण के लिए, जब भी कोई थ्रेड किसी विधि में प्रवेश करता है या बाहर निकलता है, तो हम डेटा-एक्सेस परत के भीतर क्लासेस में और यूआई परत में क्लासेस में भी लॉगिंग जोड़ना चाह सकते हैं। इस प्रकार आगे की आने वाली इस प्रकार की सम्स्याएँ सुरक्षा से संबंधित हो सकती हैं जैसे एक्सेस कंट्रोल # कंप्यूटर सुरक्षा[8] या सूचना प्रवाह (सूचना सिद्धांत)[9] भले ही प्रत्येक वर्ग की बहुत अलग प्राथमिक कार्यक्षमता है, इस प्रकार द्वितीयक कार्यक्षमता करने के लिए आवश्यक कोड अधिकांशतः समान होता है।
कमांड
यह वह अतिरिक्त कोड है जिसे आप अपने वर्तमान मॉडल पर लागू करना चाहते हैं। हमारे उदाहरण में, यह लॉगिंग कोड है जिसे हम तब लागू करना चाहते हैं जब थ्रेड किसी विधि में प्रवेश करता है या बाहर निकलता है।

प्वाइंटकट:

यह एप्लीकेशन में निष्पादन के बिंदु को दिया गया शब्द है जिस पर क्रॉस-कटिंग समस्या को लागू करने की आवश्यकता है। हमारे उदाहरण में, जब थ्रेड किसी मेथड में प्रवेश करता है तो पॉइंटकट पहुँच जाता है, और जब थ्रेड मेथड से बाहर निकलता है तो और पॉइंटकट पहुँच जाता है।

एस्पेक्ट
पॉइंटकट और कमांड के संयोजन को एस्पेक्ट कहा जाता है। उपरोक्त उदाहरण में, हम पॉइंटकट को परिभाषित करके और सही कमांड देकर अपने एप्लिकेशन में लॉगिंग एस्पेक्ट जोड़ते हैं।

अन्य प्रोग्रामिंग ओरिएंटेशन की तुलना

वस्तु-उन्मुख प्रोग्रामिंग और कम्प्यूटेशनल प्रतिबिंब से एस्पेक्ट उपओग होते हैं। एओपी भाषाओं में कार्यक्षमता समान होती है, अपितु मेटाऑब्जेक्ट की तुलना में अधिक प्रतिबंधित होती है। इस प्रकार एस्पेक्ट प्रोग्रामिंग अवधारणाओं जैसे विषयों (प्रोग्रामिंग), मिश्रण, और प्रतिनिधिमंडल (प्रोग्रामिंग) से निकटता से संबंधित हैं। एस्पेक्ट ओरिएंटेड प्रोग्रामिंग ओरिएंटेशन का उपयोग करने के अन्य तरीकों में संरचना फ़िल्टर और हाइपर/जे दृष्टिकोण सम्मिलित हैं। इस प्रकार कम से कम 1970 के दशक के बाद से, डेवलपर्स इंटरसेप्शन और डिस्पैच-पैचिंग के रूपों का उपयोग कर रहे हैं जो एओपी के लिए कार्यान्वयन के कुछ तरीकों से मिलते जुलते हैं, अपितु इनमें कभी भी ऐसा शब्दार्थ नहीं था जो क्रॉसकटिंग विनिर्देशों को ही स्थान पर लिखा गया हो।

डिजाइनरों ने कोड के पृथक्करण को प्राप्त करने के वैकल्पिक तरीकों पर विचार किया है, जैसे कि C शार्प (प्रोग्रामिंग भाषा) या C# के आंशिक प्रकार, अपितु ऐसे दृष्टिकोणों में परिमाणीकरण तंत्र की कमी होती है जो घोषणात्मक कथन के साथ कोड के कई जुड़ने वाले बिंदुओं तक पहुँचने की अनुमति देता है।

चूंकि यह असंबंधित प्रतीत हो सकता है, परीक्षण में, मॉक या स्टब्स के उपयोग के लिए एओपी तकनीकों के उपयोग की आवश्यकता होती है, जैसे कमांड के आसपास, और आगे उपलब्ध होते हैं। यहां सहयोगी वस्तुएं परीक्षण के उद्देश्य के लिए क्रॉस कटिंग समस्या हैं। इस प्रकार विभिन्न मॉक ऑब्जेक्ट फ्रेमवर्क ये सुविधाएँ प्रदान करते हैं। इस प्रकार उदाहरण के लिए, प्रक्रिया शेष राशि प्राप्त करने के लिए सेवा का आह्वान करती है। प्रक्रिया के परीक्षण में, जहां से राशि आती है वह महत्वहीन है, केवल यह कि प्रक्रिया आवश्यकताओं के अनुसार शेष राशि का उपयोग करती है।

रीफैक्टरिंग की समस्याएँ

त्रुटियों को रोकने के लिए प्रोग्रामर को कोड पढ़ने और समझने में सक्षम होना चाहिए कि क्या हो रहा है।[10] उचित शिक्षा के साथ भी, स्थिर संरचना और फंक्शन के गतिशील प्रवाह दोनों को देखने के लिए उचित समर्थन के बिना क्रॉस-कटिंग आने वाली सम्स्याओं को समझना कठिन हो सकता है।[11] 2002 की प्रारंभ में, एस्पेक्टजे ने क्रॉस-कटिंग आने वाली सम्स्याओं की कल्पना का समर्थन करने के लिए आईडीई प्लग-इन प्रदान करना प्रारंभ किया। वे सुविधाएँ, साथ ही आस्पेक्ट कोड असिस्ट और कोड रीफैक्टरिंग अब सरल हैं।

एओपी की शक्ति को देखते हुए, यदि कोई प्रोग्रामर क्रॉसकटिंग को व्यक्त करने में तार्किक गलती करता है, तो यह व्यापक फंक्शन विफलता का कारण बन सकता है। इसके विपरीत, अन्य प्रोग्रामर प्रोग्राम में सम्मिलित होने वाले बिंदुओं को परिवर्तित कर सकता है - उदाहरण के लिए, नाम परिवर्तित करने या विधियों को स्थानांतरित करके - उन तरीकों से जो कि एस्पेक्ट लेखक ने अनुमान नहीं लगाया था, अप्रत्याशित परिणामों के साथ उपलब्ध रहती हैं। क्रॉसकटिंग आने वाली सम्स्याओं को संशोधित करने का लाभ प्रोग्रामर को पूरे सिस्टम को सरलता से प्रभावित करने में सक्षम बनाता है, नतीजतन, ऐसी समस्याएं किसी विफलता के लिए दो या दो से अधिक डेवलपर्स के बीच जिम्मेदारी पर संघर्ष के रूप में उपस्थित होती हैं। चूंकि इस प्रकार एओपी की उपस्थिति में इन समस्याओं का समाधान बहुत आसान हो सकता है, क्योंकि केवल एस्पेक्ट को परिवर्तित करने की आवश्यकता है, जबकि एओपी के बिना संबंधित समस्याएँ बहुत अधिक फैल सकती हैं।

आलोचना

एओपी के प्रभाव की सबसे मौलिक आलोचना यह है कि नियंत्रण प्रवाह अस्पष्ट है, और यह न केवल बहुत बदनाम GOTO से भी बदतर है, बल्कि वास्तव में जोक COME FROM बयान के समान है।[11] एप्लीकेशन की जानकारी न होने पर जो एओपी की कई परिभाषाओं के लिए मौलिक है, इस कारण इस प्रश्न में कोड का कोई संकेत नहीं मिलता है कि कमांड लागू की जाएगी, जिसे पॉइंटकट में निर्दिष्ट किया गया है, इसका अर्थ है कि इसे काॅल करने पर कमांड स्पष्ट रूप से इसके विपरीत कार्य नहीं करती हैं।[11][12] उदाहरण के लिए इस फंक्शन की तुलना करें:[11]

5 INPUT X
10 PRINT 'Result is :'
15 PRINT X
20 COME FROM 10
25      X = X * X
30 RETURN
समान शब्दार्थ के साथ एओपी एलिमेंट के साथ:
main() {
    input x
    print(result(x))
}
input result(int x) { return x }
around(int x): call(result(int)) && args(x) {
    int temp = proceed(x)
    return temp * temp
}

इस प्रकार पॉइंटकट रनटाइम स्थिति पर निर्भर हो सकता है और इस प्रकार स्थिर रूप से निर्धारक नहीं हो सकता है। इसे कम किया जा सकता है अपितु स्थिर विश्लेषण और आईडीई समर्थन द्वारा हल नहीं किया जा सकता है जो दिखाता है कि कौन सी कमांड संभावित रूप से मेल खाती है।

सामान्य आलोचना यह है कि एओपी मॉड्यूलरिटी और कोड की संरचना दोनों में सुधार करने का दावा करता है, अपितु कुछ इसका विरोध करते हैं कि यह इन लक्ष्यों को कम करता है और स्वतंत्र विकास और फंक्शनों की समझ को बाधित करता है।[13] विशेष रूप से, पॉइंटकट द्वारा मात्रा का ठहराव प्रतिरूपकता को तोड़ता है: सामान्यतः, एस्पेक्ट ओरिएंटेड फंक्शन के गतिशील निष्पादन के बारे में तर्क करने के लिए पूरे फंक्शन का ज्ञान होना चाहिए।[14] इसके अतिरिक्त, जबकि इसके लक्ष्यों की ओर क्रॉस-कटिंग आने वाली सम्स्याओं को संशोधित करके इसको अच्छी तरह से समझा जाता है, इसकी वास्तविक परिभाषा स्पष्ट नहीं है और स्पष्ट रूप से अन्य अच्छी तरह से स्थापित तकनीकों से अलग नहीं है।[13] इस प्रकार क्रॉस-कटिंग आने वाली इस प्रकार की सम्स्याएँ संभावित रूप से एक-दूसरे को क्रॉस-कट करती हैं, जिसके लिए कुछ समाधान तंत्र की आवश्यकता होती है, जैसे ऑर्डर देना इत्यादि।[13] इस प्रकार वास्तव में, एस्पेक्ट खुद पर लागू हो सकते हैं, जिससे असत्य होने जैसी समस्याएं हो सकती हैं।[15] इस तकनीकी आलोचनाओं में सम्मिलित है कि पॉइंटकट का परिमाणीकरण यह परिभाषित करना हैं कि कमांड कहाँ निष्पादित की जाती है। इस प्रकार फंक्शन में परिवर्तनों के प्रति अत्यंत संवेदनशील है, जिसे नाजुक पॉइंटकट समस्या के रूप में जाना जाता है।[13]पॉइंटकट के साथ समस्याओं को अट्रैक्टिव माना जाता है: यदि कोई पॉइंटकट के क्वांटिफिकेशन को स्पष्ट एनोटेशन से परिवर्तित कर देता है, तो इस प्रकार वह इसके अतिरिक्त विशेषता-उन्मुख प्रोग्रामिंग प्राप्त करता है, जो कि केवल स्पष्ट सबरूटीन कॉल है और स्कैटरिंग की समान समस्या से ग्रस्त है जिसे हल करने के लिए एओपी को डिज़ाइन किया गया था।[13]

कार्यान्वयन

निम्नलिखित प्रोग्रामिंग भाषाओं ने एओपी को भाषा के भीतर या बाहरी लाइब्रेरी के रूप में लागू किया है:

यह भी देखें

नोट्स और संदर्भ

  1. Kiczales, G.; Lamping, J.; Mendhekar, A.; Maeda, C.; Lopes, C.; Loingtier, J. M.; Irwin, J. (1997). पहलू आधारित प्रोग्रामिंग (PDF). ECOOP'97. Proceedings of the 11th European Conference on Object-Oriented Programming. LNCS. Vol. 1241. pp. 220–242. CiteSeerX 10.1.1.115.8660. doi:10.1007/BFb0053381. ISBN 3-540-63089-9. Archived (PDF) from the original on 2016-01-12.
  2. "Adaptive Object Oriented Programming: The Demeter Approach with Propagation Patterns" Karl Liebherr 1996 ISBN 0-534-94602-X presents a well-worked version of essentially the same thing (Lieberherr subsequently recognized this and reframed his approach).
  3. Don Box; Chris Sells (4 November 2002). Essential.NET: The common language runtime. Addison-Wesley Professional. p. 206. ISBN 978-0-201-73411-9. Retrieved 4 October 2011.
  4. Roman, Ed; Sriganesh, Rima Patel; Brose, Gerald (1 January 2005). मास्टरिंग एंटरप्राइज JavaBeans. John Wiley and Sons. p. 285. ISBN 978-0-7645-8492-3. Retrieved 4 October 2011.
  5. Note: The examples in this article appear in a syntax that resembles that of the Java language.
  6. "नू.ऑर्ग". www.नू.ऑर्ग. Archived from the original on 24 December 2017. Retrieved 5 May 2018. {{cite web}}: Check |url= value (help)
  7. "संग्रहीत प्रति" (PDF). Archived from the original (PDF) on 2005-10-08. Retrieved 2005-06-19.
  8. B. De Win, B. Vanhaute and B. De Decker. "Security through aspect-oriented programming". In Advances in Network and Distributed Systems Security (2002).
  9. T. Pasquier, J. Bacon and B. Shand. "FlowR: Aspect Oriented Programming for Information Flow Control in Ruby". In ACM Proceedings of the 13th international conference on Modularity (Aspect Oriented Software Development) (2014).
  10. Edsger Dijkstra, Notes on Structured Programming Archived 2006-10-12 at the Wayback Machine, pg. 1-2
  11. 11.0 11.1 11.2 11.3 Constantinides, Constantinos; Skotiniotis, Therapon; Störzer, Maximilian (September 2004). AOP को हानिकारक माना जाता है (PDF). European Interactive Workshop on Aspects in Software (EIWAS). Berlin, Germany. Archived (PDF) from the original on 23 March 2016. Retrieved 5 May 2018.
  12. C2:ComeFrom
  13. 13.0 13.1 13.2 13.3 13.4 Steimann, F. (2006). "पहलू-उन्मुख प्रोग्रामिंग की विरोधाभासी सफलता". ACM SIGPLAN Notices. 41 (10): 481–497. CiteSeerX 10.1.1.457.2210. doi:10.1145/1167515.1167514., (slides Archived 2016-03-04 at the Wayback Machine,slides 2 Archived 2015-09-23 at the Wayback Machine, abstract Archived 2015-09-24 at the Wayback Machine), Friedrich Steimann, Gary T. Leavens, OOPSLA 2006
  14. "पहलू-उन्मुख कार्यक्रमों के लिए अधिक मॉड्यूलर तर्क". Archived from the original on 12 August 2015. Retrieved 11 August 2015.
  15. "एओपी और झूठे की एंटीनोमी" (PDF). fernuni-hagen.de. Archived (PDF) from the original on 9 August 2017. Retrieved 5 May 2018.
  16. Numerous: Afterthought Archived 2016-03-15 at the Wayback Machine, LOOM.NET Archived 2008-08-27 at the Wayback Machine, Enterprise Library 3.0 Policy Injection Application Block Archived 2007-01-19 at the Wayback Machine, AspectDNG Archived 2004-09-29 at the Wayback Machine, DynamicProxy Archived 2015-12-05 at the Wayback Machine, Compose* Archived 2005-08-21 at Wikiwix, PostSharp Archived 2016-05-03 at the Wayback Machine, Seasar.NET Archived 2006-07-25 at the Wayback Machine, DotSpect (.SPECT) Archived 2006-03-31 at the Wayback Machine, Spring.NET Archived 2006-04-02 at the Wayback Machine (as part of its functionality), Wicca and Phx.Morph Archived 2006-12-07 at the Wayback Machine, SetPoint Archived 2008-10-07 at the Wayback Machine
  17. "Welcome to as3-commons-bytecode". as3commons.org. Archived from the original on 3 October 2014. Retrieved 5 May 2018.
  18. "Ada2012 Rationale" (PDF). adacore.com. Archived (PDF) from the original on 18 April 2016. Retrieved 5 May 2018.
  19. "समारोह हुक". autohotkey.com. Archived from the original on 17 January 2013. Retrieved 5 May 2018.
  20. Several: AspectC++, FeatureC++, AspectC Archived 2006-08-21 at the Wayback Machine, AspeCt-oriented C Archived 2008-11-20 at the Wayback Machine, Aspicere
  21. "रास्ते का पत्थर". vub.ac.be. Retrieved 5 May 2018.[permanent dead link]
  22. "पहलूकोको". neu.edu. Archived from the original on 26 October 2007. Retrieved 5 May 2018.
  23. "ColdSpring Framework: Welcome". 5 November 2005. Archived from the original on 5 November 2005. Retrieved 5 May 2018.{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  24. "Closer Project: AspectL". Archived from the original on 23 February 2011. Retrieved 11 August 2015.
  25. "इंफ्रा - डेल्फी के लिए एकीकृत फ्रेमवर्क - गूगल प्रोजेक्ट होस्टिंग". Archived from the original on 9 September 2015. Retrieved 11 August 2015.
  26. "meaop - MeSDK: MeObjects, MeRTTI, MeAOP - Delphi AOP(Aspect Oriented Programming), MeRemote, MeService... - Google Project Hosting". Archived from the original on 10 September 2015. Retrieved 11 August 2015.
  27. "Google प्रोजेक्ट होस्टिंग". Archived from the original on 25 December 2014. Retrieved 11 August 2015.
  28. "RemObjects सिरस". codegear.com. Archived from the original on 23 January 2012. Retrieved 5 May 2018.
  29. "Emacs सलाह कार्य". gnu.org. Archived from the original on 24 October 2011. Retrieved 5 May 2018.
  30. Monads allow program semantics to be altered by changing the type of the program without altering its code: De Meuter, Wolfgang (1997). "Monads As a theoretical basis for AOP". International Workshop on Aspect-Oriented Programming at ECOOP: 25. CiteSeerX 10.1.1.25.8262. Tabareau, Nicolas; Figueroa, Ismael; Tanter, Éric (March 2013). "A Typed Monadic Embedding of Aspects". Proceedings of the 12th Annual International Conference on Aspect-oriented Software Development. Aosd '13: 171–184. doi:10.1145/2451436.2451457. ISBN 9781450317665. S2CID 27256161. Type classes allow additional capabilities to be added to a type: Sulzmann, Martin; Wang, Meng (March 2007). "Aspect-oriented programming with type classes". Proceedings of the 6th Workshop on Foundations of Aspect-oriented Languages: 65–74. doi:10.1145/1233833.1233842. ISBN 978-1595936615. S2CID 3253858..
  31. Numerous others: CaesarJ Archived 2008-12-19 at the Wayback Machine, Compose* Archived 2005-08-21 at Wikiwix, Dynaop Archived 2007-07-24 at the Wayback Machine, JAC Archived 2004-06-19 at the Wayback Machine, Google Guice (as part of its functionality), Javassist Archived 2004-09-01 at the Wayback Machine, JAsCo (and AWED) Archived 2005-04-11 at the Wayback Machine, JAML Archived 2005-04-15 at the Wayback Machine, JBoss AOP Archived 2006-10-17 at the Wayback Machine, LogicAJ Archived 2006-05-04 at the Wayback Machine, Object Teams Archived 2005-08-31 at the Wayback Machine, PROSE Archived 2007-01-24 at the Wayback Machine, The AspectBench Compiler for AspectJ (abc) Archived 2014-12-16 at the Wayback Machine, Spring framework (as part of its functionality), Seasar, The JMangler Project Archived 2005-10-28 at the Wayback Machine, InjectJ Archived 2005-04-05 at the Wayback Machine, GluonJ Archived 2007-02-06 at the Wayback Machine, Steamloom Archived 2007-08-18 at the Wayback Machine
  32. Many: Advisable Archived 2008-07-04 at the Wayback Machine, Ajaxpect Archived 2016-07-09 at the Wayback Machine, jQuery AOP Plugin Archived 2008-01-13 at the Wayback Machine, Aspectes Archived 2006-05-08 at Wikiwix, AspectJS Archived 2008-12-16 at the Wayback Machine, Cerny.js Archived 2007-06-27 at the Wayback Machine, Dojo Toolkit Archived 2006-02-21 at the Wayback Machine, Humax Web Framework Archived 2008-12-09 at the Wayback Machine, Joose Archived 2015-03-18 at the Wayback Machine, Prototype - Prototype Function#wrap Archived 2009-05-05 at the Wayback Machine, YUI 3 (Y.Do) Archived 2011-01-25 at the Wayback Machine
  33. Using built-in support for categories (which allows the encapsulation of aspect code) and event-driven programming (which allows the definition of before and after event handlers).
  34. "पहलूलुआ". Archived from the original on 17 July 2015. Retrieved 11 August 2015.
  35. "मकाओ, पुनः (कविता) -इंजीनियरिंग बिल्ड सिस्टम". Archived from the original on 24 July 2012. Retrieved 11 August 2015.
  36. "मैकलैब". Archived from the original on 24 September 2015. Retrieved 11 August 2015.
  37. "AspectML - पहलू-उन्मुख कार्यात्मक प्रोग्रामिंग भाषा अनुसंधान". Archived from the original on 5 December 2010. Retrieved 11 August 2015.
  38. "nemerle/README.md at master · rsdn/nemerle". GitHub. Retrieved 22 March 2018.
  39. Adam Kennedy. "पहलू - पहलू-उन्मुख प्रोग्रामिंग (एओपी) पर्ल के लिए - metacpan.org". Archived from the original on 31 August 2013. Retrieved 11 August 2015.
  40. Several: PHP-AOP (AOP.io) Archived 2014-08-18 at Wikiwix, Go! AOP framework Archived 2013-03-01 at the Wayback Machine, PHPaspect Archived 2016-08-22 at the Wayback Machine, Seasar.PHP Archived 2005-12-26 at the Wayback Machine, PHP-AOP, Flow Archived 2018-01-04 at the Wayback Machine, AOP PECL Extension Archived 2017-04-11 at the Wayback Machine
  41. "bigzaphod.org जल्द ही आ रहा है". www.bigzaphod.org. Archived from the original on 20 April 2016. Retrieved 5 May 2018.
  42. Several: PEAK Archived 2005-04-09 at the Wayback Machine, Aspyct AOP, Lightweight Python AOP Archived 2004-10-09 at the Wayback Machine, Logilab's aspect module Archived 2005-03-09 at the Wayback Machine, Pythius Archived 2005-04-08 at the Wayback Machine, Spring Python's AOP module Archived 2016-03-04 at the Wayback Machine, Pytilities' AOP module Archived 2011-08-25 at the Wayback Machine, aspectlib Archived 2014-11-05 at the Wayback Machine
  43. "PLaneT Package Repository : PLaneT > dutchyn > aspectscheme.plt". Archived from the original on 5 September 2015. Retrieved 11 August 2015.
  44. "AspectR - रूबी में सरल पहलू-उन्मुख प्रोग्रामिंग". Archived from the original on 12 August 2015. Retrieved 11 August 2015.
  45. Dean Wampler. "घर". Archived from the original on 26 October 2007. Retrieved 11 August 2015.
  46. "gcao/aspector". GitHub. Archived from the original on 4 January 2015. Retrieved 11 August 2015.
  47. "पहलू". tu-ilmenau.de. Archived from the original on 6 January 2006. Retrieved 5 May 2018.
  48. "MetaclassTalk: Reflection and Meta-Programming in Smalltalk". Archived from the original on 29 July 2015. Retrieved 11 August 2015.
  49. "WEAVR". iit.edu. Archived from the original on 12 December 2008. Retrieved 5 May 2018.
  50. "AspectXML - एक पहलू-उन्मुख XML वीविंग इंजन (AXLE) - Google प्रोजेक्ट होस्टिंग". Archived from the original on 12 September 2015. Retrieved 11 August 2015.

अग्रिम पठन


बाहरी संबंध