2011-05-23 11 views
23

यहां इस पोस्ट के लिए बनाई गई एक सामान्य काल्पनिक उदाहरण है। 6 कक्षाओंनिर्भरता नरक - कैसे गहरा घोंसला वाली वस्तुओं के लिए निर्भरता पास करता है?

पर विचार करें
TableFactory, TableData, TableCRUD, TableSchema, DBConnect, Logger. 

TableFactory बाहरी वर्ग है, मान लें कि यह एक डीबी तालिका के लिए एक TableData वस्तु धारण करते हैं।

इस TableFactory में, TableSchema या DBConnect या logger पर कोई कॉल नहीं है। मैं आंतरिक क्षेत्र की एक उदाहरण का लक्ष्य रख रहा हूं जो बाहरी दायरे में आवश्यक नहीं है।

TableData एक आंतरिक fetches है और डेटा पर काम करता है, इसलिए इसे TableCrud, DBConnect और Logger की आवश्यकता है।

TableCrud में TableSchema और DBConnect और Logger की आवश्यकता है।

DbConnect इसके अलावा, चीज़ों को मजेदार बनाने के लिए, लॉगर की आवश्यकता होती है। मेरा उदाहरण अब 3 गुंजाइश गहरा है।

मेरा प्रश्न बहुत आसान है, यदि आपके पास ऑब्जेक्ट 3 (या अधिक) स्कॉप्स हैं जो बाहरी दायरे पर ऑब्जेक्ट्स द्वारा नहीं बुलाए जाते हैं, तो इंटरफ़ेस अलगाव को तोड़ने के बिना कोई ऑब्जेक्ट बाहरी से आंतरिक दायरे में कैसे भेजता है सिद्धांत -> टेबलफैक्टरी को आंतरिक वस्तुओं द्वारा आवश्यक डीबीसी कनेक्ट या लॉगर से निपटना नहीं चाहिए।

यदि कोई मूल ओओपी सिद्धांतों का सम्मान करता है और आसान परीक्षण योग्यता का लक्ष्य रखता है -> आपके पास बाहरी वस्तुओं को 5 वस्तुओं के इंजेक्शन की आवश्यकता होती है, और उसके बाद गेटटर विधियां होती हैं जो श्रृंखला को आगे बढ़ाने के लिए आवश्यक वस्तुओं को पार करती हैं। और आंतरिक स्कॉप्ड ऑब्जेक्ट्स को बदले में उनके भीतर 3-स्कोप-गहरी ऑब्जेक्ट्स की निर्भरताओं के इंजेक्शन की आवश्यकता होती है, जिनके लिए गेटर्स भी होते हैं। यह बाहरी स्कोप्ड ऑब्जेक्ट्स के लिए बनाता है जो कई निर्भरताओं की आवश्यकता होती है, और प्राप्तकर्ताओं को बस उन्हें पास करने के लिए।

क्या इस ऑब्जेक्ट-पासिंग पद्धति का कोई विकल्प है, जिस तरह से मुझे कुछ याद आया? कृपया बाँटें! किसी भी लिंक/टिप्पणियों की सराहना की।

उत्तर

45

यह एक आम गलतफहमी है कि ऑब्जेक्ट ग्राफ़ के माध्यम से निर्भरताओं को पारित करने की आवश्यकता है। उदाहरण Misko Hevery Clean Code: Don't look for things में देता है एक घर है कि एक दरवाजा जरूरत है संक्षेप में,, does not दरवाजा में ताला के बारे में पता करने की जरूरत:

class HouseBuilder 
{ 
    public function buildHouse() 
    { 
     $lock = new Lock; 
     $door = new Door($lock); 
     $house = new House($door); 

     return $house; 
    } 
} 

आप देख सकते हैं, सभा तथ्य दरवाजा इस बात का पूरी तरह से अनजान है इसमें एक ताला की आवश्यकता है। सभी आवश्यक निर्भरताओं को बनाने के लिए हाउसबिल्डर की ज़िम्मेदारी है और उन्हें आवश्यकतानुसार एक साथ ढेर करना है। अंदर से बाहर।

नतीजतन, आपके परिदृश्य में आपको यह पहचानना होगा कि किस निर्भरता पर निर्भर होना चाहिए (सीएफ Law of Demeter)। आपके बिल्डर को तब सभी सहयोगियों को बनाना होगा और सुनिश्चित करना होगा कि निर्भरता उचित वस्तुओं में इंजेक्शन दी गई हो।

इसके अलावा How to Think About the “new” Operator with Respect to Unit Testing

+6

+1 इसे जिस तरह से रखा गया है, अच्छा और साफ है! – Christian

+1

गॉर्डन -> आप रॉक! ;) धन्यवाद दोस्त और यदि आप कभी मॉन्ट्रियल आते हैं, तो मैं आपको हर बार एक बियर देना चाहता हूं! आपको किसी भी तरह कर्म की जरूरत नहीं है। – stefgosselin

+0

@stef आपका स्वागत है। यकीन नहीं है कि अगर मैं अगले वर्ष कन्फू में भाग लेगा लेकिन अगर मैं करता हूं, तो मैं खुशी से आपके साथ एक बियर रखूंगा;) – Gordon

1

देख आप एक ही सवाल पर ठोकर रहे हैं, तो हार्वे के लेख है कि बैल नेत्र

http://misko.hevery.com/2008/10/21/dependency-injection-myth-reference-passing/

मामले में लेख भविष्य में गायब हो जाती है यहां अंश

है हिट की जाँच

"प्रत्येक ऑब्जेक्ट केवल उन ऑब्जेक्ट्स के बारे में जानता है जो सीधे इसके साथ इंटरैक्ट करते हैं। ऑब्जेक्ट संदर्भ का कोई गुजरना नहीं है, ताकि उन्हें सही स्थान पर ले जाया जा सके जहां वे एन हैं eeded। "

तो निर्भरता को पार करने के साथ एक गहरी नेस्टेड ऑब्जेक्ट ग्राफ़ बनाने के बजाय, क्या करने की आवश्यकता है, क्षैतिज जाएं और कहीं और निर्भरता प्रबंधित करें।

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