पहलू-उन्मुख प्रोग्रामिंग क्या है?


231

मैं ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग को समझता हूं, और लंबे समय से OO प्रोग्राम लिख रहा हूं। लोग पहलू-उन्मुख प्रोग्रामिंग के बारे में बात करते हैं, लेकिन मैंने वास्तव में कभी नहीं सीखा कि यह क्या है या इसका उपयोग कैसे करना है। मूल प्रतिमान क्या है?

यह सवाल संबंधित है, लेकिन यह बिल्कुल नहीं पूछता है:

आस्पेक्ट-ओरिएंटेड प्रोग्रामिंग बनाम ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग


5
IMAO, प्रश्न में दिए गए लिंक में स्पष्ट और पूरी तरह से उत्तर है जो यहां स्वीकृत है। इस प्रश्न को पढ़ने वाले लोग इसे पहले पढ़ सकते हैं।
डेविड चेन

जवाबों:


198

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

function mainProgram()
{ 
   var x =  foo();
   doSomethingWith(x);
   return x;
}

aspect logging
{ 
    before (mainProgram is called):
    { 
       log.Write("entering mainProgram");
    }

    after (mainProgram is called):
    { 
       log.Write(  "exiting mainProgram with return value of "
                  + mainProgram.returnValue);
    }
 } 

aspect verification
{ 
    before (doSomethingWith is called):
    { 
       if (doSomethingWith.arguments[0] == null) 
       { 
          throw NullArgumentException();
       }

       if (!doSomethingWith.caller.isAuthenticated)
       { 
          throw Securityexception();
       }
    }
 }

और फिर कोड को संकलित करने के लिए एक पहलू-बुनकर का उपयोग किया जाता है:

function mainProgram()
{ 
   log.Write("entering mainProgram");

   var x = foo();   

   if (x == null) throw NullArgumentException();
   if (!mainProgramIsAuthenticated()) throw Securityexception();
   doSomethingWith(x);   

   log.Write("exiting mainProgram with return value of "+ x);
   return x;
} 

14
क्या इसके लिए आपको भाषा के समर्थन की जरूरत है? आपका उदाहरण किस भाषा में है?
सोफी

8
यह स्यूडोकोड है लेकिन सबसे प्रसिद्ध उदाहरण AspectJ है, जो जावा का एक एओपी संशोधन है, जो इसी तरह की तकनीक का उपयोग करता है जिसे कटपॉइंट कहा जाता है।
मार्क सिडेड

71
वूडू। और मुझे लगा कि OOP ओवरकिल था।
आइडेन बेल

17
मार्क, क्या यह एक विधि के प्रवेश और निकास बिंदुओं को सजाने जैसा है?
फिलिप डुपनोविक

3
@AidenBell अगर दूरी पर अनदेखी कार्रवाई को वूडू माना जा सकता है, तो हाँ, यह वूडू है। मूस मेट्रोपोगामिंग के तहत, पहले, बाद में, आंतरिक, वृद्धि जैसे विधि संशोधक बिल्कुल वैसा ही करते हैं। यह कार्यक्रम के निष्पादन प्रवाह को अस्पष्ट करता है। ट्रेस करना लगभग असंभव हो सकता है, खासकर जब वे सिस्टम के पहलुओं के संस्करण से प्राप्त करते हैं, जिसे वह भूमिका कहते हैं । यह सब के साथ एक जटिल जटिलता की रचना कर सकता है।
23

13

दुर्भाग्य से, AOP को वास्तव में एक सामान्य मध्य-बड़े आकार के संगठन में उपयोगी बनाना आश्चर्यजनक रूप से कठिन प्रतीत होता है। (संपादक समर्थन, नियंत्रण की भावना, यह तथ्य कि आप कोड-सड़ांध की ओर जाने वाली महत्वपूर्ण चीजों से शुरू करते हैं, लोग अपने परिवार के घर जा रहे हैं, आदि)

मैंने अपनी आशाओं को समग्र उन्मुख प्रोग्रामिंग के लिए रखा , जो कि अधिक से अधिक यथार्थवादी है। यह कई लोकप्रिय विचारों से जुड़ता है और आपको वास्तव में कुछ अच्छा देता है।

ऊपर एक नज़र और आने वाले कार्यान्वयन को यहाँ देखें: qi4j.org/

पुनश्च। वास्तव में, मुझे लगता है कि AOP के साथ सुंदरियों में से एक इसकी एड़ी भी है: इसकी गैर-घुसपैठ, लोगों को इसे अनदेखा करने की अनुमति देता है यदि वे कर सकते हैं, तो इसे ज्यादातर संगठनों में एक माध्यमिक चिंता के रूप में माना जाएगा।


8

पूर्णता (आइंस्टीन) के लिए एक नकल से नकल:

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

एक अधिक ठोस उदाहरण ऑपरेटिंग सिस्टम है जो किसी फ़ाइल तक पहुंच नियंत्रण प्रदान करता है। एक सॉफ्टवेयर प्रोग्राम को एक्सेस प्रतिबंधों की जांच करने की आवश्यकता नहीं है क्योंकि अंतर्निहित सिस्टम इसके लिए काम करता है।

यदि आपको लगता है कि आपको मेरे अनुभव में एओपी की आवश्यकता है, तो आपको वास्तव में अपने सिस्टम के भीतर उचित मेटा-डेटा प्रबंधन में अधिक समय और प्रयास करने की आवश्यकता है ताकि अच्छी तरह से सोची-समझी संरचनात्मक / सिस्टम डिज़ाइन पर ध्यान केंद्रित किया जा सके।


7

वसंत से कार्रवाई में नकल की

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


6

पूर्णता के लिए एक डुप्लिकेट से नकल (बजर):

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


5

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

यहाँ एक उदाहरण है। नेट। यह सैफ मेथड कॉल के बाद विधि कॉल को इंटरसेप्ट करने और कोड निष्पादित करने के लिए प्रॉक्सी कक्षाओं का उपयोग करता है।

AutoFac और DynamicProxy का उपयोग करते हुए .NET Core और C # में Aspect Oriented Programming (AOP)


4

एओपी का एक उदाहरण है, यह एक उदाहरण के रूप में वसंत एओपी का उपयोग करता था। उदाहरण समझने में काफी आसान है।

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

संदर्भ: http://www.mkyong.com/spring/spring-aop-examples-advice/


कंप्यूटिंग में, पहलू-उन्मुख प्रोग्रामिंग (एओपी) एक प्रोग्रामिंग प्रतिमान है जिसका उद्देश्य क्रॉस-कटिंग चिंताओं को अलग करने की अनुमति देकर मॉड्यूलरिटी को बढ़ाना है।
RF

3

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.