डोमेन बनाम डेटा दृढ़ता परत में स्वच्छ वास्तुकला सत्यापन?


13

मैं साफ-सफाई पर अध्ययन कर रहा हूं और इसके परिणामस्वरूप मैं बहुत ही नाटकीय ढंग से पुनर्विचार कर रहा हूं कि मैं सॉफ्टवेयर कैसे डिजाइन और लिखता हूं।

हालाँकि, मैं अभी भी कुश्ती कर रहा हूँ, लेकिन व्यावसायिक नियमों के लिए है, जैसे "किसी वस्तु को बचाने के अपडेट्स पर, पहले उन सभी मदों की सूची जिन्हें मुझे देखने / संपादित करने आदि की अनुमति है, पुष्टि करें कि यह आइटम सूची में है" और यह कि आइटम श्रेणी वर्तमान में उपयोग से बंद नहीं है, (और अन्य नियम आदि)) ".. क्योंकि यह एक (जटिल लेकिन atypical नहीं) व्यावसायिक नियम है, और इसलिए इसे व्यापार तर्क में पुश करने के बजाय एप्लिकेशन डोमेन में संभाला जाना चाहिए। db / दृढ़ता परत।

हालांकि यह मुझे लगता है कि कुशलतापूर्वक इन स्थितियों की जांच करने के लिए यह अक्सर एक अच्छी तरह से तैयार की गई db क्वेरी के साथ सबसे अच्छा संभाला जा रहा है, बजाय सभी डेटा को एप्लिकेशन डोमेन में लोड करने के ...

समय से पहले अनुकूलन के बिना, इस प्रश्न से निपटने के लिए एक अनुशंसित दृष्टिकोण या कुछ चाचा बॉब लेख क्या है? या वह "डोमेन में मान्य जब तक यह एक समस्या बन जाता है" कहेगा ??

मैं वास्तव में उपयोग के मामलों के अलावा किसी भी अन्य चीज़ों के लिए कोई अच्छा उदाहरण / नमूने खोजने के लिए संघर्ष कर रहा हूं।

अपडेट करें:

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

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

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

क्या मुझे उन नियमों को एक विशिष्ट प्रकार के मान्य-वस्तु प्रकार में स्पिन करना चाहिए ताकि प्रत्येक usecase-interactor (FluentValidator परियोजना से प्रेरित हो लेकिन अधिक व्यावसायिक तर्क और डेटा एक्सेस शामिल हो) के साथ, क्या मुझे कुछ हद तक गेटवे की तरह सत्यापन का इलाज करना चाहिए, क्या मुझे चाहिए उन मान्यताओं को गेटवे में डालें (जो मुझे लगता है कि गलत है), आदि आदि।

संदर्भ के लिए, मैं इस तरह के कई लेखों को बंद कर रहा हूं , लेकिन मटिया सत्यापन पर ज्यादा चर्चा नहीं करता है।

लेकिन मुझे लगता है कि मेरे प्रश्न का संक्षिप्त उत्तर उस उत्तर की तरह है जिसे मैंने स्वीकार किया है: "यह कभी आसान नहीं होता है, और यह निर्भर करता है"।


2
अक्सर "सही" होने और "व्यावहारिक" होने के बीच अंतर होता है। पसंद को देखते हुए, आप किसे पसंद करते हैं?
रॉबर्ट हार्वे

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

जवाबों:


31

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

  • यूआई लेयर को क्लाइंट पेज / फॉर्म पर सत्यापन के कुछ रूपों को करना होगा ताकि उपयोगकर्ता को रियलटाइम फीडबैक प्रदान किया जा सके। अन्यथा उपयोगकर्ता नेटवर्क पर लेनदेन पोस्ट करते समय प्रतिक्रिया के लिए प्रतीक्षा करने में बहुत समय व्यतीत करता है।

  • चूँकि ग्राहक अक्सर एक अविश्वसनीय मशीन पर चलता है (जैसे लगभग सभी वेब अनुप्रयोगों में), इन सत्यापन रूटीन को फिर से सर्वर साइड पर निष्पादित किया जाना चाहिए जहां कोड पर भरोसा किया जाता है।

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

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

  • यूआई परत को उपयोगकर्ता के दर्ज किए गए डेटा को एक प्रारूप में परिवर्तित करने के लिए सत्यापन के कुछ रूपों को करना होगा जिसे व्यवसाय की परत समझ सकती है; उदाहरण के लिए, इसे स्ट्रिंग "6/26/2017" को उचित समय क्षेत्र में डेटटाइम ऑब्जेक्ट में बदलना होगा।

  • व्यापार परत को सत्यापन के अधिकांश रूपों को करना चाहिए क्योंकि, हे, वे व्यापार परत में हैं, सिद्धांत रूप में।

  • डेटाबेस परत पर सत्यापन के कुछ रूप अधिक कुशल हैं, खासकर जब संदर्भात्मक अखंडता जांच की आवश्यकता होती है (जैसे यह सुनिश्चित करने के लिए कि राज्य कोड 50 वैध राज्यों की सूची में है)।

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

  • सत्यापन के कुछ रूपों को केवल तृतीय पक्ष सेवाओं द्वारा निष्पादित किया जा सकता है, उदाहरण के लिए जब यह मान्य हो कि डाक कोड और शहर का नाम एक साथ चलते हैं।

  • पूरे सिस्टम में, कोड की खामियों की उपस्थिति में उचित विफलता मोड सुनिश्चित करने के लिए, कई परतों में नल चेक और डेटा रूपांतरण चेक हो सकते हैं।

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

यदि आप अपने आप को मारने की कोशिश कर रहे हैं, तो यह पता लगाने की कोशिश करें कि आपका सत्यापन कोड कहां जाता है, तो सलाह दी जाती है - एक व्यावहारिक समाधान में भी एक मामूली जटिल समस्या के लिए, सत्यापन कोड कई स्थानों पर समाप्त हो जाएगा।


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

2

सत्यापन व्यवसाय की परत का हिस्सा है।

मुद्दा यह है: DAO में व्यावसायिक तर्क DAO की अवधारणा को अमान्य कर देगा। यदि आप किसी अन्य usecase से व्यवसाय संचालन कहते हैं, तो किसी भी उच्च परत में सत्यापन करने के लिए अनावश्यक सत्यापन होगा।

हो सकता है कि आप UI में कुछ सुरक्षा का मूल्यांकन करें। लेकिन यह वैकल्पिक है क्योंकि सुरक्षित डोमेन ऑब्जेक्ट महत्वपूर्ण काम करेंगे। यूआई में उन घटकों को दृश्यमान या अदृश्य बना देगा जो उपयोगकर्ता द्वारा लॉग की गई अनुमतियों के आधार पर अदृश्य हैं। लेकिन यह केवल उपयोगकर्ता अनुभव का हिस्सा है। आप उपयोगकर्ता को सुरक्षा अपवादों में नहीं चलने देना चाहते हैं हर बार वह एक ऐसी कार्रवाई को करने की कोशिश करता है जिसे वह करने की अनुमति नहीं है।


2

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

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


0

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

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