सेटर, सत्यापनकर्ता और निर्भरता इंजेक्शन

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

थिंग क्लास में, मैं निर्भरता इंजेक्शन के बारे में सोच रहा था और सोच रहा था कि यह कोड है या नहीं:

public function SetDateBegin($dateBegin) {
    $dateValidator = new MySpecificDateValidation();
    if ($dateValidator->isValid($dateBegin)) {
        $this->dateBegin = $dateBegin;
    } else {
        throw new Exception /*...*/;
    }
}

इस पर प्रतिक्रिया की जानी चाहिए:

public function SetDateBegin($dateBegin, MySpecificDateValidation $dateValidator) {
    if ($dateValidator->isValid($dateBegin)) {
        $this->dateBegin = $dateBegin;
    } else {
        throw new Exception /*...*/;
    }
}

या कुछ निर्भरता की तरह कुछ है जिसके साथ आप रह सकते हैं?

2
जोड़ा संपादित
विचारों: 1
लेकिन, दूसरी तरफ, यदि मेरे पास आधा दर्जन विभिन्न वैधता वाले दर्जन एट्रिब्यूट हैं, तो यह (सृजन पर गुजरने) कन्स्ट्रक्टर में अतिरिक्त वजन लाएगा, है ना?
जोड़ा लेखक Rodrigo Além Disso, स्रोत
हो सकता है कि मैंने इसे "हाइपरबॉल्ड" किया था, या मैंने जिस तरीके से वर्णन किया था उसमें भ्रम पैदा किया था ... मैं एक विधि में 12 पैरामीटर के बारे में बात नहीं कर रहा था जिसमें एक साथ 6 अलग-अलग वैधकर्ता थे, लेकिन एक वर्ग जिसमें 12 सेटर्स थे विभिन्न वैधताओं के लिए, सभी के लिए समान नहीं है। क्या यह इसे कम गंदा में बदल देता है? :)
जोड़ा लेखक Rodrigo Além Disso, स्रोत
@RodrigoAoCubo यदि आपकी कक्षा में कई निर्भरताएं हैं, तो इसे फिर से फैक्टरिंग की आवश्यकता है, यह बहुत अधिक कर रहा है! ऐसा कहकर, जहां आप अपनी निर्भरताओं में गुजरते हैं, आपके उपयोग के मामले पर निर्भर करता है।
जोड़ा लेखक vascowhite, स्रोत
लॉल, थोड़ा कम बुरा, लेकिन ज्यादा नहीं :)
जोड़ा लेखक vascowhite, स्रोत
संभवतः सृजन पर ऑब्जेक्ट में वैधताओं को पारित करने के लिए बेहतर है और प्रत्येक फ़ंक्शन में नहीं। यदि सेटडेट बीजिन को कभी नहीं कहा जाता है तो अतिरिक्त सामान से बचने के लिए आपके पास अनिवार्य कारण होने तक चारों ओर घूमने के लिए बहुत कम कोड होगा।
जोड़ा लेखक DampeS8N, स्रोत

1 उत्तर

आपका दूसरा विकल्प इकाई परीक्षण के लिए बहुत आसान होगा क्योंकि आप सत्यापनकर्ता को नकल करने और इंजेक्ट करने में सक्षम होंगे असली के बजाय मॉक ऑब्जेक्ट

यदि आप पहले विकल्प का परीक्षण करने का प्रयास करते हैं तो आप थिंग क्लास के साथ-साथ किसी भी चीज का परीक्षण करते हैं, जैसे कि वैधकर्ता। यदि एक यूनिट परीक्षण विफल रहता है, तो आपको सभी निर्भरताओं के माध्यम से विफलता को ट्रैक करना होगा।

निर्भरता इंजेक्शन का बिंदु आपको अपनी कक्षाओं को अपनी निर्भरताओं से अलग करने की अनुमति देना है ताकि आप प्रत्येक कक्षा का परीक्षण कर सकें अलगाव में।

तो, एक परीक्षण बिंदु से, आपको हमेशा सभी निर्भरताओं को इंजेक्ट करना चाहिए।

4
जोड़ा
ठीक है, मैं समझता हूं कि यह (यूनिट परीक्षण) मुख्य लाभ है। मुझे विश्वास है कि मैं अभी भी इस विचार में उपयोग करने और पुरानी बुरी आदतों को पीछे छोड़ने की कोशिश कर रहा हूं ...
जोड़ा लेखक Rodrigo Além Disso, स्रोत
@RodrigoAoCubo यूनिट परीक्षण मुख्य लाभ नहीं है, यह अनिवार्य रूप से एकमात्र लाभ है। बाकी सब कुछ और अधिक कुशलता से किया जा सकता है लेकिन केवल डीआई के माध्यम से आप उन सभी चीजों को सापेक्ष आसानी से कर सकते हैं और अभी भी आसानी से यूनिट परीक्षण कर सकते हैं।
जोड़ा लेखक DampeS8N, स्रोत