डेटाबेस सामग्री पर निर्भर डोमेन मॉडल नियमों को मान्य करने के लिए कहां?


10

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

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

इस परिदृश्य में, आपकी राय में यह सत्यापित करने के लिए सबसे उपयुक्त स्थान क्या है कि प्रत्येक फ़ील्ड सही तरीके से भरा गया है? मेरे पास वर्तमान में दो मुख्य दृष्टिकोण हैं:

विकल्प # 1: डोमेन मॉडल में मान्य करें

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

पेशेवरों:

  • फील्ड्स के खिलाफ मजबूत सुरक्षा गलती से मूल्यों को सौंपा गया है जो मान्यता नियम का उल्लंघन करते हैं

विपक्ष:

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

  • इस डिज़ाइन में, फ़ील्ड मॉडल में आईवीडिएटर के माध्यम से डेटा एक्सेस लेयर / रिपॉजिटरी के लिए एक अप्रत्यक्ष लिंक है। डोमेन मॉडल के लिए सेवाओं / रिपॉजिटरी का इंजेक्शन आमतौर पर लगता है

विकल्प # 2: एक सेवा में मान्य

यह सुनिश्चित करने का प्रयास करें कि फ़ील्ड सेवा का मान सेट करने के सभी प्रयास उस सेवा से गुजरते हैं जो सत्यापन नियम सुनिश्चित करता है। यदि मान्यता नियम का उल्लंघन किया जाता है, तो मान्यकरण अपवाद को फेंक दें।

बेशक, डेटा एक्सेस लेयर फ़ील्ड ऑब्जेक्ट्स बनाते समय सेवा का उपयोग नहीं करेगा जो पहले डीबी में बनाए गए हैं।

पेशेवरों:

  • "अपने डोमेन मॉडल में सेवाओं / प्रस्तावों को इंजेक्ट न करें" का उल्लंघन न करें।

  • फ़ील्ड को जारी रखने पर वर्तमान मान्यता नियम को बनाए रखने की आवश्यकता नहीं है। सेवा क्षेत्र के लिए वर्तमान मान्यता नियम को देख सकती है; जब इतिहास के आंकड़ों को देखते हैं, तो फ़ील्ड का मान नहीं बदला जाएगा।

विपक्ष:

  • इस बात की कोई गारंटी नहीं है कि फील्ड वैल्यू सेट करने के लिए सर्विस का उपयोग करने वाले सभी तर्क वास्तव में ऐसा करते हैं। मैं इसे एक बड़ी कमी के रूप में देखता हूं; ऐसा लगता है कि कोई व्यक्ति "thisField.setValue (thatField.getValue ())" लिख रहा है और इसField के सत्यापन नियम का उल्लंघन किए बिना किसी का भी उल्लंघन हो सकता है। यह सुनिश्चित करने के लिए संभावित रूप से कम किया जा सकता है कि डेटा एक्सेस लेयर फ़ील्ड को बनाए रखने के लिए फ़ील्ड का मान सत्यापन नियम के साथ मेल खाता है।

मैं वर्तमान में विकल्प # 1 से अधिक विकल्प # 2 को पसंद करता हूं, मुख्य रूप से क्योंकि मैं इसे व्यावसायिक तर्क के रूप में देखता हूं और महसूस करता हूं कि विकल्प # 2 सिस्टम में खराब डेटा को पेश करने का अधिक जोखिम रखता है। आपको कौन सा विकल्प पसंद है, या क्या कोई अन्य डिज़ाइन है जो इस परिदृश्य को वर्णित दो विकल्पों से बेहतर है?

संपादित करें (मान्यताओं की जटिलता)

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

मैंने अभी के लिए विकल्प # 1 के साथ आगे बढ़ने का फैसला किया है, इस बात का ध्यान रखने की कोशिश की जाती है कि डोमेन मॉडल के लिए बहुत अधिक जिम्मेदारियों को नहीं सौंपा जाए। इसी तरह की स्थिति का सामना करने वाले भी संबंधित प्रश्नों की जांच कर सकते हैं कि स्तरित वास्तुकला और डेटा इनपुट सत्यापन में मान्यता और प्राधिकरण - कहां? कितना?


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

जवाबों:


4

मान्यताएँ कितनी जटिल हैं? अक्सर सत्यापन के लिए खेतों और या व्यावसायिक नियमों के संयोजन की आवश्यकता होती है जो खेतों का सही मूल्यांकन करते हैं।

सत्यापन जितना अधिक जटिल है, कठिन और कम प्रदर्शन करने वाला विकल्प # 2 है।

बेशक डेटा टीयर दृढ़ता समय पर सत्यापन सेवा शुरू कर सकता है। यह विषम स्थिति में मदद कर सकता है जहां नियमों में बदलाव के कारण डेटा अमान्य स्थिति में है।

टिप्पणी करने लायक अन्य वस्तु किसी प्रकार के क्यूए चक्र के बिना सत्यापन नियमों में बदलाव की क्षमता है। लेकिन यह एक अलग धागे के लिए एक विषय है।

उपरोक्त जानकारी को देखते हुए, विकल्प 1 आपको लगता है कि आप अनुशासन बनाए रखते हैं, मान्यता और दृढ़ता को अलग करते हुए सबसे अधिक लचीला है।


0

हो सकता है कि आपको एक लेयर याद आ रही हो। आपके आवेदन (अपेक्षित, वास्तुकला, आदि) के विवरण को जाने बिना मैं ग्राहक की तरह कुछ करूँगा (जो भी हो) -> आवेदन सेवा -> डोमेन मॉडल

एप्लिकेशन सेवा परत को व्यावसायिक तर्क वाले रिपॉजिटरी और डोमेन मॉडल के साथ बातचीत करने की अनुमति है। तो आप कुछ इस तरह हो सकते हैं:

FieldUpdateService >> updateField(fieldId, newValue)
  List<FieldRule> rules = this.rulesRepository.findRulesFor(fieldId)
  Field field = this.fieldRepository.find(fieldId)
  try 
    field.updateValue(rules,newValue)
    fieldRepository.save(field)
  catch 
    // manage error

यदि आपके पास फ़ील्ड और उसके फ़ील्डरूल के संबंध हैं और जावा में हाइबरनेट जैसे ORM का उपयोग करें, तो आप केवल यह करेंगे:

FieldUpdateService >> updateField(fieldId, newValue)
  Field field = this.fieldRepository.find(fieldId)
  try 
    field.updateValue(newValue)
    fieldRepository.save(field)
  catch 
    // manage error

Field >> updateValue(newValue)
  for rule in rules
     if !rule.isValid(newValue)
        throw ValueNotAllowedException
  this.value = newvalue

क्योंकि ORM क्वेरी आपके द्वारा मांगे जाने वाले ऑब्जेक्ट्स के ग्राफ को त्वरित करती है।

इस तथ्य के बारे में आपके संदेह के बारे में कि कोई कर सकता है

thisField.setValue (thatField.getValue ()) "और इस नियम के सत्यापन नियम का उल्लंघन किए बिना किसी का भी उल्लंघन हो सकता है

कोई यह भी लिख सकता है: FieldRule alwaysReturnTrueRule = new FieldRule {isValid (newValue) {वापसी सच; }} field.updateValue ("अनियंत्रितवैल्यू", हमेशा रीटर्नट्रेउल) यह एक अस्पष्ट उदाहरण है, लेकिन यह कहने के लिए कि क्या ट्राय करना है कि कुछ भी आपको कोड के बुरे उपयोग से बचाता है। शायद अच्छा प्रलेखन और आमने-सामने का सामना। मुझे लगता है कि कुछ भी आपको कोड के खराब उपयोग से बचाता है।

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