दिलचस्प पोस्ट
सामान्य प्रकार या पद्धति में पैरामीटर 'टी' के रूप में इसका उपयोग करने के लिए टाइप एक संदर्भ प्रकार होना चाहिए पहली बार विलंब के बिना सेट इंटरफ़ेस फ़ंक्शन निष्पादित करें मैं psql को गैर-परस्पर रूप से पासवर्ड कैसे निर्दिष्ट करूं? सैश प्रतिस्थापन के साथ बाश चर गिट उपनाम – एकाधिक आदेश और पैरामीटर vba: एक्सेल शीट में पाठ फ़ाइल आयात करना समूह द्वारा महीने और वर्ष में MySQL खराब जादू संख्या त्रुटि क्या है? ipython गलत अजगर संस्करण पढ़ता है बाइट ऑर्डर मार्क (बीओएम) के बिना पाठ फ़ाइलें लिखें? उद्देश्य-सी के साथ पोस्ट मल्टीपार्ट / फॉर्म-डेटा जेपीए (और इसी तरह की टेबल पंक्तियों में शामिल) में कई संबंध के साथ इकाई को कैसे निकालना है? अजीब प्रयास -अनुरोध-शेष-अंतराल वापसी के साथ व्यवहार किसी अन्य एप्लिकेशन के लिए एक कुंजी भेजने के लिए Sendkey फ़ंक्शन का उपयोग करके C # जब System.gc () कुछ भी करता है

क्यों इंटरफ़ेस परत / सार वर्ग हमारे परियोजना में आवश्यक है?

हम आम तौर पर हमारे परियोजनाओं में सार समारोह / इंटरफेस का उपयोग करते हैं यह वास्तव में क्यों जरूरी है? हम सिर्फ व्यावसायिक तर्क स्तर, डेटा एक्सेस परत और प्रस्तुति लेयर के लिए क्यों नहीं जा सकते?

प्रस्तुति परत में फ़ंक्शन:

abc(); 

व्यवसाय तर्क स्तर में फ़ंक्शन:

  public void abc() { //Preparing the list } 

डेटा एक्सेस परत में फ़ंक्शन:

 public abstract void abc(); 

डेटा एक्सेस SQLServer परत में फ़ंक्शन:

  public override void abc() { //Connection with database } 

प्रश्न है: डेटा एक्सेस परत की आवश्यकता क्यों है?

वेब के समाधान से एकत्रित समाधान "क्यों इंटरफ़ेस परत / सार वर्ग हमारे परियोजना में आवश्यक है?"

यह समझने का सबसे आसान तरीका, आईएमओ, DataLayer पर एक अमूर्त है।

आपने xml फाइल से डेटा प्राप्त करने के लिए एक फ़ंक्शन सेट कर ली है। लेकिन एक दिन आपके उत्पाद का आकार और xml डाटा स्टोरेज की तरह पर्याप्त नहीं है। तो आप कुछ एम्बेडेड डेटाबेस से गुजारें: sqlite लेकिन एक दिन आपको कुछ एंटरप्राइज़ संदर्भ में अपनी लाइब्रेरी का पुन: उपयोग करना होगा। तो अब आपको sqlserver , oracle , webservice तक पहुंच विकसित करने की आवश्यकता है …. इन सभी परिवर्तनों में आपको केवल उस कोड को बदलना होगा जो वास्तव में डेटा तक पहुंचते हैं, लेकिन वह कोड जो वास्तव में इसे भी खपता है और उस कोड के बारे में जो पहले से ही क्लाइंट में अपने पहले xml डेटा एक्सेस का उपयोग करते हैं और इसके साथ खुश हैं? कैसे बैकओपेटाबिलिटी?

यदि इन समस्याओं में से ज्यादातर हल नहीं करते हैं, तो निश्चित रूप से अमूर्त होने पर, निश्चित रूप से आपके आवेदन को और बदले में अधिक प्रतिरोधी बना देता है, जिससे कि हमारी दुनिया में कभी-कभी बहुत अधिक बार ऐसा हो।

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

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

क्यों इंटरफेस: क्या आपने कभी सी # में उपयोग किया है: का उपयोग करते हुए (फॉर्म f = नया फ़ॉर्म ()) {}

यहां आप देखेंगे कि आप केवल उन कक्षाओं का उपयोग कर सकते हैं जो आईडीआईस्पोज़ योग्य इंटरफ़ेस लागू करते हैं

दो चीजें जो एक-दूसरे को नहीं जानते हैं, केवल इंटरफेस के उपयोग से एक-दूसरे के साथ बातचीत कर सकते हैं। इंटरफ़ेस गारंटी है कि "कुछ" कार्यक्षमता निश्चित रूप से इस प्रकार के द्वारा कार्यान्वित की गई है।

क्यों परतें:

ताकि आप अलग-अलग डीएलएस कर सकें जो आपको अलग-अलग एप्लीकेशन में पुन: उपयोग करने की अनुमति देगा।

असल में सभी कोड पुन: उपयोग और प्रदर्शन लाभ के लिए हैं।

मुझे लगता है कि आप मुखौटा परत के बारे में बात कर रहे हैं

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

यह मुखौटा पैटर्न से प्रेरित है

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

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

एक डीएएल (उदाहरण के लिए सरलीकृत) में कार्यस्थल पर रिपॉज़िटरी पैटर्न इस का एक बढ़िया उदाहरण है:

 public interface IProductRepository { Product Get(int id); ... } public class SqlProductRepository : IProductRepository { public Product Get(int id) { ... } ... } public class MockProductRepository : IProductRepository { private IDictionary<int, Product> _products = new Dictionary<int, Product>() { { 1, new Product() { Name = "MyItem" } } }; public Product Get(int id) { return _products[id]; } ... } public class AwesomeBusinessLogic { private IProductRepository _repository; public AwesomeBusinessLogic(IProductRepository repository) { _repository = repository; } public Product GetOneProduct() { return _repository.GetProduct(1); } } 

हालांकि यह उदाहरण इंटरफेस का उपयोग करता है, वही आधार वर्गों के उपयोग पर लागू होता है। सुंदरता यह है कि अब मैं SqlProductRepository या MockProductRepository को AwesomeBusinessLogic में फ़ीड कर सकता हूं और मुझे AwesomeBusinessLogic बारे में कुछ भी बदलना नहीं है । यदि एक और मामला सामने आता है, तो सभी की जरूरत है IProductRepository का एक नया कार्यान्वयन और AwesomeBusinessLogic अभी भी इसे बिना बदलाव किए संभाल देगा क्योंकि यह केवल अंतरफलक के माध्यम से रिपॉजिटरी तक ही पहुंचता है

पिछली सभी उत्तर सार परतों की जरूरतों को समझा सकते हैं, लेकिन मैं अभी भी अपने कुछ विचारों को जोड़ना चाहता हूं

मान लीजिए कि हमारे प्रोजेक्ट में प्रत्येक स्तर पर हमारे पास एक सेवा का एक ही कार्यान्वयन है। उदाहरण के लिए, मेरे पास संपर्क डीएएल और संपर्क बीएलएल सेवा है, और हम ऐसा कुछ कर सकते हैं

 namespace Stackoverflow { public class ContactDbService { public Contact GetContactByID(Guid contactID) { //Fetch a contact from DB } } } 

बीएलएल सेवा से संपर्क करें:

 namespace Stackoverflow { public class ContactBLLService { private ContactDbService _dbService; public ContactBLLService() { _dbService = new ContactDbService(); } public bool CheckValidContact(Guid contactID) { var contact = _dbService.GetContactByID(contactID); return contact.Age > 50; } } } 

इंटरफेस / अमूर्त वर्गों को परिभाषित किए बिना।

अगर हम ऐसा करते हैं, तो कुछ स्पष्ट कमियां होती हैं

  1. संहिता संचार: कल्पना कीजिए कि यदि आपकी परियोजना में शामिल है, तो आपकी सेवाओं में कई अलग-अलग विधियां हो सकती हैं, एक रखरखाव (आपके अलावा) आपके सेवाओं को कैसे जान सकता है? अमान्यकास्टऑपरेशन की तरह एक छोटी सी बग को ठीक करने के लिए उन्हें अपनी पूरी सेवा को पढ़ना होगा? इंटरफ़ेस को देखकर, लोगों को सेवा की क्षमताओं का तात्कालिक ज्ञान मिलेगा (कम से कम)।
  2. इकाई का परीक्षण

    आप नकली / नकली सेवा का प्रयोग करके अपने तर्क की जांच कर सकते हैं ताकि बग्स को अग्रिम रूप से पता लगा सके और साथ ही प्रतिगमन कीड़े बाद में होने से रोक सकें।

  3. बदलने के लिए आसान:

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

अमूर्त वर्ग या इंटरफ़ेस वास्तव में एक अलग परत नहीं है – यह आपके व्यावसायिक तर्क स्तर का हिस्सा होना चाहिए और यह इंटरफ़ेस को परिभाषित करता है कि वास्तविक डेटा एक्सेस परत (उदाहरण के लिए एसक्यूएल डाटा भंडार) को डेटा एक्सेस सेवा प्रदान करने के लिए लागू करने की आवश्यकता है आपकी व्यावसायिक परत

इस इंटरफ़ेस के बिना आपकी व्यावसायिक परत एसक्यूएल परत पर सीधे निर्भर होगी, जबकि अंतरफलक इस निर्भरता को हटा देगा: आप सारिणी या इंटरफ़ेस को व्यावसायिक तर्क स्तर में डाल दिया है। फिर एसक्यूएल परत (एक अलग विधानसभा, उदाहरण के लिए) अमूर्त वर्ग / इंटरफ़ेस लागू करता है इस तरह एसक्यूएल परत व्यवसाय स्तर पर निर्भर है, अन्य तरह से नहीं।

नतीजा एक स्वतंत्र व्यापार परत वाला एक लचीला ऐप है जो कई डेटा खजाने के साथ काम कर सकता है – इसकी ज़रूरत एक परत है जो इंटरफेस को व्यावसायिक स्तर परिभाषित करता है। और यह वास्तव में केवल डेटा खजाने के बारे में नहीं है – आपकी व्यावसायिक परत संदर्भ (एएसपीएन बनाम कंसोल ऐप बनाम सर्विस आदि) पर निर्भर नहीं होनी चाहिए, यह यूजर इंटरफेस क्लास, मॉड्यूल इंटरफ़ेसिंग पर निर्भर नहीं होना चाहिए आपके व्यवसाय ऐप आदि के साथ

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