2014-05-16 6 views
49

cross-cutting concern का अच्छा उदाहरण क्या है? wikipedia पृष्ठ पर चिकित्सा रिकॉर्ड उदाहरण मुझे अपूर्ण लगता है।क्रॉस कटिंग चिंता उदाहरण

विशेष रूप से इस उदाहरण से, लॉगिंग कोड कोड डुप्लिकेशन (स्कैटरिंग) क्यों ले जाएगा? (सरल कॉल के अलावा log("....") हर जगह, जो एक बड़े सौदे की तरह प्रतीत नहीं होता है)।

core concern और cross-cutting concern के बीच क्या अंतर है?

मेरा अंतिम लक्ष्य एओपी की बेहतर समझ प्राप्त करना है।

उत्तर

97

क्रॉसकटिंग कंसर्न को समझने से पहले, हमें चिंता समझना होगा।

एक चिंता एक शब्द जो सिस्टम की कार्यप्रणाली के आधार पर विभाजित का एक हिस्सा के लिए संदर्भित करता है। एकल और विशिष्ट कार्यक्षमता के रूप में कोर चिंताओं के लिए प्राथमिक आवश्यकताओं में जाना जाता है का प्रतिनिधित्व करने

  1. चिंताओं:

चिंताएं दो प्रकार हैं।
या
सिस्टम की प्राथमिक कार्यक्षमता मुख्य चिंताओं के रूप में जानी जाती है।
उदाहरण के लिए: व्यापार तर्क

  • चिंताओं माध्यमिक आवश्यकताओं के लिए कार्यक्षमताओं प्रतिनिधित्व के रूप में crosscutting चिंताओं या पूरे सिस्टम में चिंताओं में भेजा जाता है।
    या
    क्रॉसकटिंग चिंता एक चिंता है जो पूरे आवेदन में लागू होती है और यह पूरे एप्लिकेशन को प्रभावित करती है।
    उदाहरण के लिए: लॉगिंग, सुरक्षा और डेटा हस्तांतरण ऐसी चिंताओं हैं जो किसी एप्लिकेशन के लगभग हर मॉड्यूल में आवश्यक हैं, इसलिए वे क्रॉस-कटिंग चिंताओं हैं।
  • Courtesy

    enter image description here

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

    (Courtesy)

    +1

    चित्र यह सब कहता है। अच्छा! – RBT

    +0

    "क्रॉसकटिंग चिंता एक चिंता है जो पूरे आवेदन में लागू होती है" ➤ इस बारे में निश्चित नहीं है क्योंकि लेनदेन प्रबंधन आवेदन के दौरान 'लागू नहीं होता है लेकिन अभी भी एक क्रॉस-कटिंग चिंता है। और तस्वीर मुझे ईमानदार होने के लिए कुछ नहीं बताती है, यह केवल भ्रमित है .. –

    27

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

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

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

    एक मुख्य चिंता एक कारण है कि एप्लिकेशन मौजूद है, व्यवसाय तर्क है कि एप्लिकेशन स्वचालित हो जाता है। यदि आपके पास एक रसद अनुप्रयोग है जो शिपिंग माल ढुलाई करता है, यह पता लगाता है कि आप ट्रक पर कितना माल पैक कर सकते हैं या ट्रक के वितरण के लिए ट्रक के लिए सबसे अच्छा मार्ग क्या है, यह मुख्य चिंता हो सकती है। क्रॉस-कटिंग चिंताओं आमतौर पर कार्यान्वयन विवरण होते हैं जिन्हें व्यावसायिक तर्क से अलग रखा जाना चाहिए।

    +2

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

    +3

    @ jlars62: क्रॉस-काटने का मतलब है कि यह सुविधाओं के दाएं कोण पर जाता है। –

    +5

    @ jlars62: दाएं कोण पर मेरा मतलब है: परतों के ढेर के रूप में एक सुविधा के बारे में सोचें।एक क्रॉस-कटिंग चिंता केवल एक परत पर लागू हो सकती है, लेकिन यह सभी सुविधाओं के लिए आम है। –

    7

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

    अब मुझे लॉग आउटपुट जैसे "तुच्छ" चीजों के बारे में एक छोटी सी कहानी बताएं: बस कुछ हफ्ते पहले मैंने एक जटिल, लेकिन बहुत बड़ा कोड बेस (कोड की लगभग 250 के लाइनों) के लिए प्रतिक्रिया नहीं दी थी। कुछ सौ वर्गों में एक और लॉगिंग ढांचे का इस्तेमाल किया गया था, कुछ और सौ में। फिर System.out.println(*) की कई हजार लाइनें थीं जहां वास्तव में लॉग आउटपुट होना चाहिए था। तो मैं कोड बेस भर में बिखरे हुए कोड की हजारों लाइनों को ठीक करने के साथ समाप्त हुआ। सौभाग्य से मैं पूरी कार्रवाई को तेज करने के लिए IntelliJ IDEA (संरचनात्मक खोज & प्रतिस्थापन) में कुछ चालाक चाल का उपयोग कर सकता हूं, लेकिन लड़का आपको नहीं लगता कि यह छोटा था! निश्चित रूप से, दृढ़ता से संदर्भ-निर्भर डीबग लॉगिंग हमेशा एक विधि निकाय के भीतर होती है, लेकिन कई महत्वपूर्ण प्रकार के लॉगिंग जैसे कि ट्रेसिंग विधि कॉल (यहां तक ​​कि पदानुक्रमित रूप से अच्छी तरह से इंडेंट आउटपुट के साथ), दोनों हैंडल या अनचाहे अपवादों को लॉगिंग करना, उपयोगकर्ता ऑडिटिंग (लॉगिंग कॉल उपयोगकर्ता भूमिकाओं के आधार पर प्रतिबंधित विधियां) और आगे स्रोत कोड को प्रदूषित किए बिना पहलुओं में आसानी से कार्यान्वित किया जा सकता है।रोज़ाना एप्लिकेशन डेवलपर को इसके बारे में सोचना या कोड बेस पर बिखरे हुए लॉगर कॉल को देखने की आवश्यकता नहीं है। कोई भी पहलू को अद्यतित रखने के लिए ज़िम्मेदार है और लॉगिंग रणनीति या पूरे लॉगिंग फ्रेमवर्क को एक स्थान पर भी स्विच कर सकता है।

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

    +0

    जब कोई सलाह पहले उपयोगी होती है – eatSleepCode

    +0

    मैं नहीं देख सकता कि यह प्रश्न (टिप्पणी के रूप में छिपा हुआ) मेरे उत्तर से संबंधित है, इसलिए मैं इसका उत्तर यहां नहीं दे रहा हूं। और वैसे, क्या आपने कभी इस मजेदार आविष्कार के बारे में सुना है जिसे वेब सर्च इंजन कहा जाता है? Google और बिंग कुछ प्रमुख उदाहरण हैं। – kriegaex

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