2009-10-03 17 views
18

क्या कोई मौजूदा आधुनिक-दिन प्रोग्रामिंग भाषाएं हैं जो स्पष्ट रूप से भाषा सुविधा के रूप में निर्भरता इंजेक्शन रखते हैं, और यदि हां, तो क्या इस तरह के प्रोग्रामिंग भाषाएं उनके ठोस कार्यान्वयन से प्रोग्राम निर्भरताओं को अलग करने के लिए उनके वाक्यविन्यास का उपयोग करती हैं?भाषा फ़ीचर के रूप में निर्भरता इंजेक्शन?

(कृपया ध्यान दें: मैं एक डीआई/आईओसी ढांचे की तलाश नहीं कर रहा हूं - मैं वास्तव में एक प्रोग्रामिंग भाषा की तलाश में हूं जो वास्तव में इस सुविधा को भाषा में बनाया गया है)।

उत्तर

10

आपको भाषा सुविधा के रूप में निर्भरता इंजेक्शन नहीं मिलेगा, क्योंकि इसे आम तौर पर डिज़ाइन पैटर्न के रूप में देखा जाता है। डिज़ाइन पैटर्न अनुपलब्ध भाषा सुविधाओं के लिए कामकाज के रूप में उभरते हैं - उदाहरण के लिए यदि आपके पास भाषा श्रेणी के रूप में प्रथम श्रेणी के प्रकार हैं तो आपको फ़ैक्टरी पैटर्न की आवश्यकता नहीं है (Norvig's presentation का पी 12 देखें), यदि आपके पास भाषा सुविधा के रूप में बहु-विधियां हैं तो आप ' डबल प्रेषण पैटर्न की जरूरत नहीं है।

भाषा सुविधा जिसके लिए डी डिज़ाइन पैटर्न है "पैरामीट्रिक मॉड्यूल" है। discussion of modules बनाम डीआईएलएड ब्रैचा की भाषा से संबंधित डीआई Newspeak

+3

और "डिजाइन पैटर्न में प्रोग्रामिंग भाषाओं में कमजोर संकेत हैं" पर चर्चा भी देखें - http://www.oreillynet.com/onlamp/blog/2006/10/design_patterns_are_signs_of_w.html – avandeursen

+0

कुछ भाषाएं * एक * सेवा प्रदान करती हैं एक लैंगेज सुविधा के रूप में लोकेटर। उदाहरण के लिए, अजगर। – Arafangion

+0

@Arafangion का मतलब है कि आप आयात विवरण http://docs.python.org/reference/index.html, या भाषा में कुछ और (लाइब्रेरी के विपरीत)? मॉड्यूल के लिए एक खोज पथ होने से सेवा स्थान से काफी कम है, और निर्भरता इंजेक्शन सेवा स्थान के बराबर नहीं है। –

4

मुझे झटका लगने का मतलब नहीं है, लेकिन हर ओओ भाषा निर्भरता इंजेक्शन का समर्थन करती है। कोई विशेष वाक्यविन्यास की आवश्यकता नहीं है। बस अपनी ऑब्जेक्ट को अपनी निर्भरताओं के साथ बनाएं (या बाद में अपनी निर्भरताओं को सेट करें)।

आप वास्तव में कार्यक्रम के शीर्ष के पास कहीं भी अपनी सभी निर्भरताओं को तार सकते हैं - आवश्यक नहीं main(), लेकिन शीर्ष के करीब।

+2

मैं एक प्रोग्रामिंग भाषा की तलाश नहीं कर रहा हूं जो आपको निर्भरता इंजेक्शन लागू करने देता है, मैं वास्तव में ऐसी भाषा की तलाश में हूं ऐस "मैं एक आईफू बनाना चाहता हूं" और फिर संकलक/रनटाइम तय करता है कि संकलन समय पर कंक्रीट कक्षाओं को निर्दिष्ट किए बिना क्या बनाया जाता है। – plaureano

+0

आह, मुझे लगता है कि आप ऑटोवॉयरिंग या ऑटो सेवा खोज के लिए भाषा समर्थन की तलाश में हैं। मेरी गलती। –

3

Noop माना जाता है कि यह है, लेकिन मैंने भाषा विनिर्देश नहीं देखा है (मेरा धैर्य मुझे मिलने से पहले बाहर चला गया)।

+1

नोप के लिए इंजेक्शन प्रस्ताव पर चर्चा की गई है http://code.google.com/p/noop/wiki/Features और http://code.google.com/p/noop/wiki/ProposalForNewableVsInjectable नोप के लिए प्रस्ताव इंजेक्शन समर्थन इंजेक्शन के लिए Google के गुइस ढांचे पर आधारित होगा। http://code.google.com/p/google-guice/ – avandeursen

+0

ऐसा लगता है कि नोप एक मृत भाषा है। थोड़ी देर के लिए नोप भाषा मंच में कोई गतिविधि नहीं हुई है। – plaureano

2

कोई कह सकता है कि स्कैला लक्षणों और स्वयं-प्रकार की टिप्पणियों की सहायता से बॉक्स से निर्भरता इंजेक्शन का समर्थन करता है। एक केक पैटर्न पर एक नज़र डालें:

http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/

असल में, इस दृष्टिकोण की घोषणा की निर्भरता (आत्म-प्रकार का उपयोग करके) के साथ लक्षण का उपयोग करता है संकलक उन्हें एक साथ तारों की काम करते हैं करने के लिए।

इस घोषणा रजिस्ट्री है:

object ComponentRegistry extends 
    UserServiceComponent with 
    UserRepositoryComponent 
{ 
    val userRepository = new UserRepository 
    val userService = new UserService 
} 

... उपयोगकर्ता भंडार दर्ज की:

trait UserRepositoryComponent { 
    val userRepository: UserRepository 

    class UserRepository { 
    ... 
    } 
} 

... और उपयोगकर्ता सेवा घटक है कि भंडार पर निर्भर करता है:

trait UserServiceComponent { 
    this: UserRepositoryComponent => 

    val userService: UserService 

    class UserService { 
    ... 
    } 
} 
+0

+1 से परिचित नहीं हूं। अवेज़ो टॉक देखें, [डेड-सरल निर्भरता इंजेक्शन] (http://www.youtube.com/watch?v=ZasXwtTRkio) रूनर सुपर-स्मार्ट है, और यह भी उल्लसित है: "नियंत्रण में उलटा, जो वास्तव में है 'तर्क लेना' कहने का एक उपहासपूर्ण तरीका – CrazyPyro

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