2009-07-14 15 views
13

के लिए उपयोग करने के लिए मैं इन मान्यताओं के आधार पर कुछ सत्यापन कोड लिखने की प्रक्रिया में हूँ:OO डिजाइन पैटर्न मान्यता

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

इस को हल करने के OO किस संयोजन डिजाइन पैटर्न सबसे अच्छा कर रहे हैं? एक कारखाना एक विशिष्ट वैधता प्राप्त करने का एक अच्छा तरीका हो सकता है, लेकिन उनके बेहतर दृष्टिकोण हैं?

उत्तर

8

एक आकार सभी फिट नहीं है! इसे सरल बनाओ!

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

ले जाएँ और:

 
for validator in all_validators: 
    validator.validate(model)

2

मुझे लगता है कि मैं अभी ही बात कर रहा हूँ।
यहां लागू पैटर्न फ़िल्टर पैटर्न और फ़िल्टर श्रृंखला है।

प्रत्येक फ़िल्टर एक "रास्ता" (जैसा कि आप उन्हें कॉल करते हैं) के खिलाफ मान्य करता है।
वाक्यविन्यास के लिए पहला, डीबी लुकअप आदि के लिए दूसरा (आपकी दूसरी बुलेट से)।

0

मुझे यह वही समस्या थी और मुझे विज़िटर पैटर्न डेटा ऑब्जेक्ट से सत्यापन तर्क को डीकॉप्लिंग करने में वास्तव में प्रभावी होने के लिए मिला। आपको स्वीकार करने (विज़िटर) विधियों के साथ अपने डेटा क्लास पदानुक्रम को मापने की आवश्यकता होगी, लेकिन यदि आप सबकुछ सरल बना रहे हैं जो पर्याप्त है। यहां तक ​​कि यदि आप विज़िटर समर्थन के बिना किसी तृतीय-पक्ष पदानुक्रम का उपयोग कर रहे हैं, तो आप रैपर बना सकते हैं जो स्वीकार्य ट्रैवर्सल पेड़ प्रदान करते हैं और यह कक्षा के अंदर विधि रखने के बहुत करीब है।

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

+4

** वास्तविक ** उत्साह रखरखाव डेवलपर से छिपाने की कोशिश कर रहा है, जबकि वह आपको राइफल के साथ शहर के चारों ओर पीछा कर रहा है :) और वास्तविक, वास्तविक "मजेदार" हिस्सा तब होता है जब आप रखरखाव लड़के होते हैं और कोई भी नहीं है पीछा करें लेकिन खुद ... प्रतीक्षा करें, यह वास्तव में मजेदार नहीं है ... (वहां गया, ऐसा किया)। –

0

यदि आप किसी भी तरह का जीयूआई काम कर रहे हैं, तो आपको JGoodies प्रमाणीकरण: http://www.jgoodies.com/downloads/libraries.html (यहां कुछ लेख यहां: www.jgoodies.com/articles/) पर एक नज़र डालना चाहिए।

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

अधिक डिज़ाइन से सावधान रहें। एक दृश्य को मान्य करने के

new UserValidator().validate(user) 

या: कुछ सरल की तरह के साथ शुरुआत करें

new UserPanelValidator().validate(userPanel) 

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

संबंधित मुद्दे