अपवादों के साथ व्यावसायिक नियमों का प्रतिनिधित्व करना


16

मुझे पता है कि यह महंगा है लेकिन (IMO) मेरा मानना ​​है कि यह बहुत अच्छा अभ्यास है। मैं नियमों के बारे में बात कर रहा हूं जैसे कि, आप एक इनवैल्यू को नहीं बचा सकते हैं यदि आप एक बिक्री व्यक्ति नहीं हैं ... तो उस स्थिति में एक अपवाद यह कहते हुए फेंक देना कि 'आपके अधिकृत नहीं हैं' या ऐसे ...

एक और दृष्टिकोण यह एक स्थिति या कुछ के साथ वस्तुओं की तरह होगा

क्या कोई और दृष्टिकोण है? आप इसके बारे में कैसा महसूस करते हैं?

जवाबों:


15

यदि आप अपवादों के साथ व्यक्तिगत व्यावसायिक नियम जाँचों का प्रतिनिधित्व करते हैं, तो मुझे नहीं लगता कि यह बहुत अच्छा विचार है। कई बार आपको एक से अधिक विफल स्थिति की सूचना देनी होती है, और पहले वाले को रोकना नहीं है।

दूसरी ओर, मेरा मानना ​​है कि सभी नियमों की जाँच करना और फिर सारांश के साथ एक अपवाद फेंकना एक अच्छा अभ्यास है।


1
ठीक इसी तरह से मैं इसे अपने ऐप्स में संभालता हूं। मेरे जीवन को आसान बनाने के लिए FluentValidation का उपयोग करना, और ValidateAndThrow पद्धति से मेरा दिन बचता है।
मट्टियो मोस्का

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

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

@ Thorbjørn रेवन एंडरसन +1 "डोमेन विशिष्ट" महान इसके अलावा
जस्टिन ओह्स

1
@JamesPoulson यह JamesPoulsonExceptionउप-वर्ग के रूप में बनाने के लिए पर्याप्त हो सकता है RuntimeExceptionऔर फिर मूल अपवाद के रूप में प्रदान कर सकता है cause। आप तो बस if (exception instanceof JamesPoulsonException)... अंतर करने के लिए कह सकते हैं । getCause()मूल अपवाद तक पहुंचने के लिए विधि का उपयोग करें ।

9

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

व्यावसायिक नियमों को लागू करने के लिए अपवादों का उपयोग करना एक अच्छा डिज़ाइन नहीं है।


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

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

@ अदम - अच्छी तरह से कहा और बिल्कुल बिंदु पर।
वाल्टर

1
@ एडडम - चिंताओं के मुद्दों के अलगाव के साथ आप का पालन न करें। मैं UI में किसी को भी CustomerNameInLowercaseException को हैंडल करने की उम्मीद नहीं करता (कृपया, मुझे भी उम्मीद है कि अपवाद मौजूद नहीं है!)। आप बस एक सामान्य ValidationException को संभाल सकते हैं। इसके अलावा, मैं आपके साथ 100% हूं कि यूआई केवल जानकारी इकट्ठा करना चाहिए, और वह सब कुछ। मैंने जो पहले कहा था कि कोई फर्क नहीं पड़ता कि आप यूआई में क्या करते हैं, बीएल को यह नहीं मानना ​​चाहिए कि हर इनपुट ठीक है। यह सिर्फ कुछ रक्षात्मक प्रोग्रामिंग है।
फेड

@ फ़ेड: यह सुनिश्चित करने के लिए बिजनेस लेयर का काम है कि हर इनपुट ठीक है। यदि UI ऐसा कर रहा है तो वह व्यावसायिक तर्क को लागू कर रहा है। अब, अगर यह मामला है कि एक इनपुट फ़ील्ड अंक तक ही सीमित है और बीएल देखता अल्फा वर्ण, से सभी साधन फेंक एक अपवाद । जब भी कोई घटक किसी अन्य घटक से अवैध इनपुट प्राप्त करता है, तो अपवाद को फेंकना तर्कसंगत और सही है। इंटरफ़ेस टूट गया है, और सिस्टम टूट गया है। हालाँकि, इनपुट लॉजिक को निष्पादित करने की तुलना में इनपुट को मान्य करना बहुत अलग है। दो बहुत अलग चीजें।
एडम क्रॉसलैंड

5

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

यह उम्मीद की जाती है कि व्यावसायिक तर्क में, शर्तों को पूरा नहीं किया जाएगा; यह पहली जगह में होने का कारण है, और आप एक ही तंत्र पर पिगबैकबैक नहीं करना चाहते हैं जो अप्रत्याशित I / O विफलताओं को संभालता है, मेमोरी त्रुटियों और अशक्त संदर्भों से बाहर निकलता है। वे प्रणाली की विफलताएं हैं, लेकिन असमान व्यावसायिक परिस्थितियों का पता लगाना प्रणाली का सफल संचालन है।

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


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

2

व्यावसायिक नियमों को व्यक्त करना एक बात है, उन्हें लागू करना एक और बात है

उपयोगकर्ता अनुभव के बारे में सोचो; यदि उपयोगकर्ता एक विक्रेता नहीं है, यही कारण है कि उन्हें एक बटन है कि 'चालान बनाने' का कहना है देना बिल्कुल भी ?


1
सिर्फ इसलिए कि आप एक बटन नहीं देते हैं, इसका मतलब यह नहीं है कि वे आपको कुछ भी करने के लिए संदेश नहीं भेजेंगे। सोचिए कि अगर यह सब हो जाता तो सुरक्षा के नियम कितने आसान होते ..
jmoreno

यदि उपयोगकर्ता को X करने की अनुमति नहीं है, तो उन्हें "Do X" कहने वाला बटन न दें। सबसे अच्छी सुरक्षा अज्ञानता है - उपयोगकर्ता को उन चीजों के बारे में न बताएं जो वे नहीं कर सकते हैं;)
स्टीवन ए। लोवे

1

यह पूरी तरह से निर्भर करता है कि क्या किया जा रहा है।

पहला, आपको वास्तविक व्यवहार क्या चाहिए? यदि कोई व्यक्ति अपनी जानकारी दर्ज कर रहा है, तो एक अस्वीकृति और एक संवाद बॉक्स कह रहा है, अनिवार्य रूप से, "आप ऐसा नहीं कर सकते" शायद सही है। यदि यह डेटा प्रविष्टि व्यक्ति है, तो प्रपत्रों के ढेर से काम कर रहा है, एक संवाद बॉक्स शायद अच्छा भी है, और डेटा प्रविष्टि व्यक्ति एक विशेष ढेर में अमान्य रूपों को डाल सकता है। यदि आप बैच प्रोसेसिंग कर रहे हैं, तो आप चीजों को रोकना नहीं चाहते हैं, लेकिन इसे ध्वजांकित करें और अगले पर जाएं।

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

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


0

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

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

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

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

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