2008-11-28 14 views
43

क्या कोई भी पहलू उन्मुख प्रोग्रामिंग (एओपी) का उदाहरण पोस्ट कर सकता है जो लॉगिंग नहीं है?पहलू उन्मुख प्रोग्रामिंग उदाहरण

मैंने कई संसाधनों को देखा है लेकिन सभी उदाहरण छोटे लॉगिंग हैं। इसके लिए क्या उपयोगी है?

उत्तर

33

उदाहरण जो उधार था में से एक सीधे इस Aspect Oriented Programming: Radical Research in Modularity, Youtube video से एक प्रदर्शन के लिए चित्रकारी था। उदाहरण में आपके पास एक ड्राइंग प्रोग्राम है, जिसमें अंक, आकार, आदि शामिल हैं और जब उन ऑब्जेक्ट्स में परिवर्तन होते हैं तो आपको डिस्प्ले को स्वयं अपडेट करने के लिए बताने की आवश्यकता होती है। इसे एक पहलू में संभालने के बिना आप अपने आप को थोड़ा दोहराते हैं।

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

अधिक पहलू उन्मुख प्रोग्रामिंग के बारे में जानकारी इन स्रोतों से पाया जा सकता है:

+0

एओपी त्रुटि-प्रवण है क्योंकि परिवर्तनों का कोई स्थानीयकरण नहीं है। यह एनोटेशन घोषणा (उर्फ अदृश्य एनोटेशन) के बिना मूल रूप से एनोटेशन है। Https://pp.info.uni-karlsruhe.de/uploads/publikationen/constantinides04eiwas.pdf – Pacerier

+2

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

+0

@ क्रेगेगाएक्स, जब एओपी की बिल्कुल अवधारणा आई है। – Ali786

3

सुरक्षा - जांचें कि उपयोगकर्ताओं को कुछ विधियों को निष्पादित करने से पहले उचित अनुमतियां हैं।

2

सार्वजनिक आविष्कार जांच। चूंकि PostSharp 1.5 पहलू विरासत के साथ आ जाएगा, यहां तक ​​कि इंटरफेस के माध्यम से, यह कई नए अवसर प्रदान करेगा।

11

सुरक्षा

  • इंजेक्षन कोड अनुमतियों और ब्लॉक asp.net webcontrols के लिए

Friendlier त्रुटि msgs का उपयोग की जाँच करता है कि/webparts

  • इंजेक्षन कोड है कि अपवाद पकड़ता और स्टैकट्रेस जब लिखते हैं डीबग-संकलित या मैत्रीपूर्ण संदेश जब त्रुटि-संकलित (यहां सामान की तरह: Transparent generic exception handling for asp.net/MOSS2007 (with code))

प्रदर्शन

  • इंजेक्षन कोड कि पर्फ़ काउंटर सेट अपनी ऐप्स को धीमी है
6

मान्यता के एक सिंहावलोकन प्राप्त करने के लिए:

[NotNull] 
public string Property1 { get; set; } 

[Length(Min = 10, Max = 20)] 
public string Property2 { get; set; } 

[Regex(Expression = @"[abc]{2}")] 
public string Property3 { get; set; } 
+1

डी पहलू कहां है? लेकिन आप इस "एनोटेशन" को पढ़ने के लिए कुछ सलाह का उपयोग कर सकते हैं जो कि पॉइंटकूट द्वारा प्रदान किए गए जॉइनपॉइंट से आते हैं: * * सेव (..) इस प्रकार आप सत्यापित करने और आगे बढ़ने के लिए पहले सलाह का उपयोग कर सकते हैं या कुछ फेंक सकते हैं अमान्य स्थिति के बारे में असफल स्थितियां। – paulosuzart

+0

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

+0

@Paco, यह वास्तव में एओपी नहीं है; यह एओपी की तुलना में एनोटेटेड प्रोग्रामिंग का अधिक है। एओपी में, हमें कॉलिंग साइट पर * कुछ * निर्दिष्ट करने की अनुमति नहीं है। एओपी में भी '[NotNull] 'के अस्तित्व की अनुमति नहीं है। – Pacerier

3

का उपयोग कर आप जावा में एकाधिक वंशानुक्रम नहीं हो सकता है जावा में एक बेहतर तरीके से लागू किया जा सकता है। हालांकि एओपी का उपयोग करके आप कई विरासत "सीमित" कर सकते हैं। कुछ उदाहरण देखने के लिए इसे Google पर आज़माएं।

मैं भी Eyvid से सहमत हूं। हनीमैन और किक्सलेस पेपर डिजाइन पैटर्न पर मूल बातें सीखने और कुछ महान एओपी उदाहरण प्राप्त करने के लिए बहुत अच्छा है।

2

My photo album तीन बातों के लिए AspectJ उपयोग करता है:

  1. Implementing the observer "pattern" as a reusable piece of code.
  2. Destroying a session for a specific type of call.
  3. Setting dirty flags on DTOs when mutation occurs.

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

4

एक और क्लासिक उदाहरण (लॉगिंग की तरह) कैशिंग है। लेकिन अन्य उदाहरण अधिक दिलचस्प हैं।

6

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

आम तौर पर पूर्ववत उपयोग करने के लिए मैं इस

void foo() 
    { 
     int id = lib.create_undo_context(); 
     try 
     { 
      lib.performsomeaction(); 
      lib.performsomeaction(); 
      lib.performsomeaction(); 

     } 
     finally 
     { 
      lib.destroy_undo_context(id); 
     } 
    } 
PostSharp साथ

मैं एक विशेषता [पूर्ववत] कहा जाता है परिभाषित की तरह कुछ लिखते थे कि पूर्ववत संदर्भ जब विधि शुरू होता है बनाता है और उसे नष्ट कर जब विधि बाहर निकलता है (भले ही एक अपवाद फेंक दिया जाता है) - तो कोड इस

[Undo] 
    void foo() 
    { 
     lib.performsomeaction(); 
     lib.performsomeaction(); 
     lib.performsomeaction(); 
    } 

तरह लग रहा है यह एक छोटे से अधिक लागू करने के लिए इस की तुलना में मैं दिखा रहा है क्योंकि मैं यह सुनिश्चित कर दिया है सब पूर्ववत कि संदर्भों भी मामलों में जहां पूर्ववत वहाँ नेस्टेड रहते हैं में साफ हो जाने जटिल है संदर्भ - लेकिन आप विचार प्राप्त करें।

1

लेनदेन प्रबंधन।

मेरे मन के लिए, आप वस्तुओं एक सौदे का हिस्सा हो सकता है कि बारे में पता है कि वे एक सौदे में हैं होने के लिए नहीं करना चाहती। एओपी का उपयोग करके, आप लेन-देन में ऑब्जेक्ट्स के बिना आवश्यक लेन-देन में वस्तुओं को लिख सकते हैं, इस तथ्य से अवगत होना चाहिए कि वे लेनदेन में हैं या एओपी ढांचे के अस्तित्व के भी हैं।

2

मैंने कीवर्ड खोज इंजन को लागू करने के लिए पहलू उन्मुख प्रोग्रामिंग का उपयोग किया है। यह एक प्रयोग की तरह था, लेकिन यह दिखाता है कि लॉगिंग और ट्रेसिंग के अलावा अन्य उद्देश्यों के लिए एओपी का उपयोग कैसे किया जा सकता है।

मूल रूप से

:
(i) इंजन के उपयोगकर्ता KeywordSearchable के रूप में उसकी/उसके कक्षाएं, निशान
(ii) इंजन निर्माण पर नज़र रखने के इन KeywordSearchable उदाहरणों में से & विनाश,
(iii) इंजन अर्क शुरू होता है इन कीवर्ड खोज योग्य वस्तुओं के कीवर्ड,
(iv) ऑब्जेक्ट्स और कीवर्ड को देखते हुए, एल्गोरिदम खोज का ख्याल रखता है।

इस पर अधिक जानकारी http://montrealistic.blogspot.com/2011/08/aspect-oriented-implementation-of.html में पाया जा सकता।

4

निर्भरता इंजेक्शन

सच पूछिये तो, निर्भरता इंजेक्शन एक crosscutting चिंता से ज्यादा कुछ नहीं है।

public class Car:IDisposable 
{ 
    [Inject] 
    public IGearBox Gearbox { get; set; } 
    ... 
} 

[इंजेक्षन] विशेषता भी एक बाहरी ढांचे के लिए किसी भी निर्भरता के बिना एक पहलू के रूप में तैयार कर सकते हैं: निर्भरता इंजेक्शन चौखटे का एक बहुत इस तरह की एक विशेषता-आधारित प्रोग्रामिंग शैली का उपयोग करें।

2

AOP के उदाहरण:

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

मान लें कि आप अपने डोमेन मॉडल के तरीकों के अंदर संदेश लॉग इन करना चाहते:

उदाहरण: लॉगिंग AOP के बिना:

namespace Examples\Forum\Domain\Model; 

class Forum { 

    /** 
    * @Flow\Inject 
    * @var \Examples\Forum\Logger\ApplicationLoggerInterface 
    */ 
    protected $applicationLogger; 

    /** 
    * Delete a forum post and log operation 
    * 
    * @param \Examples\Forum\Domain\Model\Post $post 
    * @return void 
    */ 
    public function deletePost(Post $post) { 
      $this->applicationLogger->log('Removing post ' . $post->getTitle(), LOG_INFO); 
      $this->posts->remove($post); 
    } 

} 

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

एओपी के साथ, आपके मॉडल के अंदर कोड लॉगिंग के बारे में कुछ भी नहीं जानता। यह सिर्फ व्यापार तर्क पर ध्यान केंद्रित करेगा।

संबंधित मुद्दे