एक भ्रष्टाचार-रोधी परत क्या है, और इसका उपयोग कैसे किया जाता है?


151

मैं यह पता लगाने की कोशिश कर रहा हूं कि एंटी करप्शन की परत का वास्तव में क्या मतलब है। मुझे पता है कि यह विरासत कोड या खराब एपीआई के आसपास संक्रमण / काम करने का एक तरीका है। मुझे समझ में नहीं आता है कि यह कैसे काम करता है और क्या यह अवांछनीय परत से एक साफ जुदाई बनाता है।

मैंने कुछ खोज की है, लेकिन मुझे कोई सरल उदाहरण या स्पष्टीकरण नहीं मिल रहा है, इसलिए मैं किसी ऐसे व्यक्ति की तलाश कर रहा हूं जो इसे समझता है और इसे सरल उदाहरणों के साथ समझा सकता है। ऐसा उत्तर जो मेरे प्रश्न को संतुष्ट करेगा, सरल होना चाहिए (जरूरी नहीं), और कार्यान्वयन और उपयोग के समझने योग्य उदाहरण प्रदान करें।

इस प्रश्न को देखें , मेरे उपयोग के मामले के लिए।

जवाबों:


147

कल्पना कीजिए कि आपको किसी और के कोड का उपयोग करना होगा जिसे नीचे दिखाया गया है:

    class Messy {
        String concat(String param, String str) { /* ... */ }
        boolean contains(String param, String s) { /* ... */ }
        boolean isEmpty(String param) { /* ... */ }
        boolean matches(String param, String regex) { /* ... */ }
        boolean startsWith(String param, String prefix) { /* ... */ }
    }

अब आप कल्पना कीजिए कि आपका कोड जो इस पर निर्भर करता है वह निम्न जैसा दिखता है:

String process(String param) {
    Messy messy = new Messy();
    if (messy.contains(param, "whatever")) {
        return messy.concat(param, "-contains");
    }
    if (messy.isEmpty(param)) {
        return messy.concat(param, "-empty");
    }
    if (messy.matches(param, "[whatever]")) {
        return messy.concat(param, "-matches");
    }
    if (messy.startsWith(param, "whatever")) {
        return messy.concat(param, "-startsWith");
    }
    return messy.concat(param, "-whatever");
    // WTF do I really need to repeat bloody "param" 9 times above?
}

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

ठीक है, इसलिए आप भ्रष्टाचार विरोधी परत का निर्माण शुरू करते हैं।

  1. पहली बात यह सुनिश्चित करना है कि आपका "मुख्य कोड" Messyसीधे संदर्भित नहीं करता है । उदाहरण के लिए, आप निर्भरता प्रबंधन को इस तरह से व्यवस्थित करते हैं कि एक्सेस करने का प्रयास करने में Messyविफल रहता है।

  2. दूसरा, आप एक समर्पित "लेयर" मॉड्यूल बनाते हैं जो केवल एक ही एक्सेस है Messyऔर इसे आपके "मुख्य कोड" में इस तरह से एक्सपोज़ करता है जो आपके लिए बेहतर समझ में आता है।

परत कोड निम्नलिखित की तरह दिखेगा:

    class Reasonable { // anti-corruption layer
        String param;
        Messy messy = new Messy();
        Reasonable(String param) {
            this.param = param;
        }
        String concat(String str) { return messy.concat(param, str); }
        boolean contains(String s) { return messy.contains(param, s); }
        boolean isEmpty() { return messy.isEmpty(param); }
        boolean matches(String regex) { return messy.matches(param, regex); }
        boolean startsWith(String prefix) { return messy.startsWith(param, prefix); }
    }

नतीजतन, आपका "मुख्य कोड" इसके बजाय, इसके बारे में Messyउपयोग Reasonableकरने के साथ गड़बड़ नहीं करता है:

String process(String param) {
    Reasonable reasonable = new Reasonable(param);
    // single use of "param" above and voila, you're free
    if (reasonable.contains("whatever")) {
        return reasonable.concat("-contains");
    }
    if (reasonable.isEmpty()) {
        return reasonable.concat("-empty");
    }
    if (reasonable.matches("[whatever]")) {
        return reasonable.concat("-matches");
    }
    if (reasonable.startsWith("whatever")) {
        return reasonable.concat("-startsWith");
    }
    return reasonable.concat("-whatever");
}

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


उपरोक्त उदाहरण इस बात पर आधारित है कि C2 विकी पर एंटीकरप्शन लेयर को कैसे समझाया गया है:

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

नोट उदाहरण जानबूझकर संक्षिप्त रखने के लिए जानबूझकर सरल और घनीभूत किया जाता है।

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

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

दूसरे शब्दों में, सुनिश्चित करें कि आपका एपीआई वास्तव में एक छुपाता है पर एक सुधार है, सुनिश्चित करें कि आप भ्रष्टाचार की एक और परत का परिचय नहीं देते हैं।


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

आप इसे इस तरह से सोच सकते हैं: यदि आप सही ठहरा सकते हैं कि लाइब्रेरी डिजाइनर इसके Reasonableबजाय अपनी कार्यक्षमता को उजागर करना बेहतर Messyहोगा, तो इसका मतलब होगा कि आप एंटीकोर्पोरशन लेयर पर काम कर रहे हैं, अपना काम कर रहे हैं , अपनी डिज़ाइन की गलतियों को ठीक कर रहे हैं ।

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

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


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

1
@Knownasilya यह एक बहुत अच्छा प्रश्न है, इसका उत्तर देने के लिए विस्तार किया गया है कि
gnat

4
In other words, make sure that your API is indeed an improvement over one it hides, make sure that you don't just introduce another layer of corruption.वह पूरा खंड एक बोल्ड टैग के योग्य है।
Lilienthal

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

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

41

किसी अन्य स्रोत को उद्धृत करने के लिए:

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

एरिक इवांस, डोमेन ड्रिवेन डिज़ाइन, 16 वीं प्रिंटिंग, पृष्ठ 365

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

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


6
यह बहुत महत्वपूर्ण है! एक एसीएल का उपयोग केवल गन्दा कोड के साथ नहीं किया जाना है, बल्कि बंधे हुए संदर्भों के बीच संवाद करने के साधन के रूप में किया जाना है। यह एक संदर्भ से दूसरे में अनुवाद करता है, ताकि प्रत्येक संदर्भ में डेटा भाषा को दर्शाता है और जिस तरह से वह संदर्भ सोचता है और डेटा के बारे में बात करता है।
डिडियर ए।

29

अनुकूलक

जब आपके पास असंगत इंटरफेस होता है, जो एक समान तर्क करता है, तो एक को दूसरे में बदलने के लिए, ताकि आप एक के कार्यान्वयन का उपयोग उन चीजों के साथ कर सकें जो दूसरे की अपेक्षा करते हैं।

उदाहरण:

आपके पास एक ऑब्जेक्ट है जो कार चाहता है, लेकिन आपके पास केवल 4WheVVhhicle वर्ग है, इसलिए आप एक CarBuiltUsing4WheelVehicle बनाएं और अपनी कार के रूप में उपयोग करें।

मुखौटा

जब आपके पास एक जटिल / भ्रामक / विशाल एपीआई है और आप इसे सरल / स्पष्ट / छोटा बनाना चाहते हैं। आप जटिलता / भ्रम / एक्स्ट्रा को दूर करने के लिए एक मुखौटा बनाएँगे और केवल एक नए सरल / स्पष्ट / छोटे एपीआई को उजागर करेंगे।

उदाहरण:

आप एक पुस्तकालय का उपयोग कर रहे हैं जिसमें 100 विधियां हैं, और कुछ कार्य करने के लिए आपको आरंभिक चीजों से जुड़ने, जुड़ने, खोलने / बंद करने के लिए प्रारंभिक कार्य करने की जरूरत है, बस अंत में वही कर पाएंगे जो आप चाहते थे, और आप जो चाहते थे वह है 1 सुविधा सभी 50 पुस्तकालय कर सकते हैं, इसलिए आप एक ऐसा मुखौटा बनाते हैं जिसमें केवल उस सुविधा के लिए एक विधि हो, जिसकी आपको आवश्यकता है और जो आपके लिए सभी आरंभ, सफाई आदि का काम करती है।

भ्रष्टाचार विरोधी परत

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

उदाहरण:

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

तो आप एक एसीएल लेयर बनाएं जो आपके ग्राहक और दूसरे सिस्टम के कस्टमर के बीच अनुवाद करे। इस तरह, आपको कभी भी दूसरे सिस्टम के ग्राहक का उपयोग करने की ज़रूरत नहीं है, आपको बस एसीएल बताने की ज़रूरत है: "मुझे प्रोफाइल एक्स के साथ ग्राहक दें, और एसीएल अन्य सिस्टम को एक्स नाम का ग्राहक देने के लिए कहता है, और रिटर्न देता है। आप प्रोफाइल एक्स के साथ एक ग्राहक।

====================

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


12

यहाँ बहुत सारे उत्तर कहते हैं कि ACLs गन्दा कोड लपेटने के बारे में "न केवल" हैं। मैं आगे जाकर कहूंगा कि वे इसके बारे में बिल्कुल नहीं हैं, और यदि वे ऐसा करते हैं तो यह एक साइड बेनिफिट है।

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

गड़बड़ी पर ध्यान केंद्रित करना भ्रामक है और डीडीडी के बारे में क्या बात है, यह याद आती है। ACL वैचारिक बेमेल से निपटने के बारे में हैं, न कि खराब गुणवत्ता के।

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