2012-02-16 7 views
11

तो, यह देखते हुए कि मैं इस घटक का एक उदाहरण है:मैं उस संदर्भ को कैसे निर्धारित करूं जिसमें एक कोल्डफ्यूजन ऑब्जेक्ट रहता है?

foo.cfc

<cfcomponent> 
    <cffunction name="locateMe"> 
    <cfreturn "I don't know where I live!"> 
    </cffunction> 
</cfcomponent> 

और, इस दूसरे घटक fooParent.cfc:

<cfcomponent> 
    <cfset this.foo = createObject("component", "foo")> 
</cfcomponent> 

मान लीजिए कि मैं उदाहरण बना चलो "foo" के कुछ अलग-अलग तरीकों से:

<cfset myStruct = {}> 
<cfset myStruct.foo = createObject("component", "foo")> 

<cfset myFoo = createObject("component", "foo")> 

<cfset myFooParent = createObject("component", "fooParent")> 

<cfoutput> 
#myStruct.foo.locateMe()#<br> 
#myFoo.locateMe()#<br> 
#myFooParent.foo.locateMe()#<br> 
</cfoutput> 

जैसा कि अपेक्षित था, वें है आउटपुट:

I don't know where I live! 
I don't know where I live! 
I don't know where I live! 

क्या मैं जानना चाहता हूँ है, मैं संभवतः foo.cfc कि मुझे कुछ (कुछ भी!) किस संदर्भ में उसे लागू किया जा रहा है के बारे में बताएगा भीतर क्या कर सकते हैं? चूंकि सब कुछ आखिरकार (कम से कम) किसी प्रकार का दायरा रहता है, और सभी स्कॉप्स एक प्रकार का ऑब्जेक्ट होता है, जो मैं कह रहा हूं वह है कि मुझे किसी दिए गए तत्काल ऑब्जेक्ट के भीतर से युक्त ऑब्जेक्ट को निर्धारित करने के लिए वास्तव में कुछ तरीका पसंद आएगा। अंत में, foo.cfc निर्माण इतना है कि कुछ इस तरह मेरी उत्पादन हो सकता है, इसके बाद के संस्करण मेरी नमूना टुकड़ा से की किसी तरह:

I live within a "class coldfusion.runtime.Struct" instance! 
I live within a "class coldfusion.runtime.VariableScope" instance! 
I live within a "component cfjunk.fooParent" instance! 

कहाँ उन मूल्यों से प्रत्येक getMetaData गुजर वास्तविक युक्त से परिणाम का निरीक्षण द्वारा निर्धारित किया जा सकता है वस्तु संदर्भ।

अद्यतन टिप्पणी में मीका ने सुझाव दिया है, मैं यह करने के लिए "जावा" टैग जोड़ दिया है, के बाद से मुझे लगता है वह यह है कि समाधान आत्मनिरीक्षण के लिए जावा का उपयोग कर में झूठ सकता है में सही हो सकता है।

अद्यतन

बजाय क्या, एक विशुद्ध रूप से शैक्षणिक चर्चा हो मुझे स्पष्टीकरण दें कि मैं इस की जरूरत है यह बताने के लिए प्रकट होता है के रूप में इस छोड़ दें।

मैं CFWheels उपयोग कर रहा हूँ ORM तो जैसे अपने डेटा के लिए संदर्भ वापस पाने के लिए भी शामिल है के साथ:

var user = model("User").findOne(where="id=123", include="AuthSource", returnAs="object"); 

यह मैं करने के लिए एक उद्देश्य यह है कि मैं बहुत तरह संदर्भित कर सकते हैं वापस आ जाएगी:

user.id // property of the "User" model 
user.reset() // method on the "User" model 
user.AuthSource.id // property of the "AuthSource" model 
user.AuthSource.authenticate(password) // method on the "AuthSource" model 

अब, मेरे "AuthSource.authenticate" विधि के भीतर, मैं "उपयोगकर्ता" ऑब्जेक्ट के बारे में जानना चाहता हूं जिसमें मैं निहित हूं। अन्यथा, मैं इस तरह फ़ंक्शन को कॉल करने के लिए खत्म हो जाएगा, बजाय:

user.AuthSource.authenticate(user, password) // note the redundancy in the use of "user" 

मैं तथ्य यह है कि मैं उपयोगकर्ता वस्तु के माध्यम से AuthSource मॉडल पर विधि फोन कर रहा हूँ और वास्तव में पढ़ा पर भरोसा करने में सक्षम होना चाहिए उस वस्तु से उस विधि से।

+0

शानदार सवाल। मुझे आश्चर्य है कि क्या जावा के पास इस तरह की चीज को निर्धारित करने के लिए कुछ आत्मनिरीक्षण कार्य हो सकते हैं। शायद आप एक जावा टैग जोड़कर अपना प्रश्न बढ़ा सकते हैं। – Micah

+0

इस सवाल पर यादृच्छिक डाउनवोट क्यों? कितना अजीब .... –

उत्तर

4

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

तो अपने बच्चे को कक्षा कुछ इस तरह के रूप में परिभाषित किया जाएगा:

<cfcomponent> 
    <cffunction name="init"> 
    <cfargument name="parentParam" required="yes" type="object"> 
    <cfset this.parent = parentParam > 
     <cfreturn this> 
    </cffuncton> 
    <cffunction name="locateMe"> 
    <cfreturn "I belong to #this.parent.className# !"> 
    </cffunction> 
<cffunction name="doOtherStuff"> 
    <cfreturn "I do stuff with my parent: #this.parent.className# !"> 
    </cffunction> 
</cfcomponent> 

और फिर जब आप इसका इस्तेमाल ...

<cfset myParent.child = createObject("component", "Object").init(myParent) /> 
#myparent.locateMe()# 
#myparent.doOtherStuff()# 

parentParam नामक एक निर्माता विधि में एक आवश्यक पैरामीटर होगा "init", तो बच्चे के पास हमेशा अपने माता-पिता का संदर्भ होता है। फिर आपके सभी तरीके इस तत्व के साथ सामान करने के लिए उपयोग कर सकते हैं। मेरे कोड उदाहरण में, मैं # this.parent.className # करता हूं लेकिन कोल्डफ्यूजन ऑब्जेक्ट्स के बारे में कोई जानकारी नहीं है। शायद आप एक ही चीज करने के लिए कुछ प्रकार के प्रतिबिंब या मेटा प्रोग्रामिंग का उपयोग कर सकते हैं।

कृपया ध्यान दें: से मैं क्या इकट्ठा होते हैं, coldfusion में बनाया निर्माताओं के लिए समर्थन नहीं है, इसलिए मैं आपको दिखा रहा हूँ इस साइट से एक समुदाय के मानक सबसे अच्छा अभ्यास है:

http://www.iknowkungfoo.com/blog/index.cfm/2007/8/22/Object-Oriented-Coldfusion--1--Intro-to-Objectcfc

मैं क्षमा करें आप रास्ते से colfusion कर रहे हैं ...;)

+0

हां, मैन्युअल रूप से युक्त ऑब्जेक्ट के संदर्भ का ट्रैक रखना मेरा पहला विचार था। मैं उम्मीद कर रहा था कि इसके अलावा कोई समाधान हो सकता है। मैं थोड़ा इंतजार करूंगा और देख सकता हूं कि कोई और अलग दृष्टिकोण के साथ झुकता है या नहीं। धन्यवाद, और सीएफ वास्तव में इतना बुरा नहीं है! –

+0

इस दृष्टिकोण का एक दुर्भाग्यपूर्ण परिणाम यह है कि आपकी वस्तु का सीएफडीम्प अनंत लूप बन जाता है। :( –

+0

आह जो समझ में आता है, क्योंकि प्रत्येक ऑब्जेक्ट का संदर्भ दूसरे पर होता है। – fregas

0

मैंने पिछले सभी को हटा दिया है क्योंकि यह सहायक नहीं लग रहा था। आपकी बाद की टिप्पणियों के बाद निम्नलिखित एक सुझाव है कि मेरा मानना ​​है कि आप जो करना चाहते हैं उसकी रेखाओं को और अधिक नीचे कर सकते हैं।

// Object 
<cfcomponent displayname="Object"> 
    <cffunction name="init"> 
     <cfargument name="username" type="string"> 
     <cfscript> 
      variables.username = arguments.username; 
      variables.authSource = CreateObject('component','AuthSource').init(); 
     </cfscript> 
     <cfreturn this> 
    </cffunction> 
    <cffunction name="authenticate"> 
     <cfargument name="password" type="string"> 
     <cfreturn variables.authSource.authenticate(variables.username,arguments.password)> 
    </cffunction> 
</cfcomponent> 

<cfcomponent displayname="AuthSource"> 
    <cffunction name="init"> 
     <cfreturn this> 
    </cffunction> 
    <cffunction name="authenticate"> 
     <cfargument name="username" type="string"> 
     <cfargument name="password" type="string"> 

      .... DO STUFF ... 

     <cfreturn ...> 
    </cffunction> 
</cfcomponent> 

<cfscript> 
    objUser = CreateObject('component','Object').init('SomeUserName'); 
    // Authenticate 
    objUser.authenticate('SomePassword'); 
</cfscript> 

इस तरह, AuthSource माता पिता वस्तु के बारे में पता करने के लिए, फिर भी एक ही समय में किसी को प्रमाणीकरण पर फिर से उपयोगकर्ता नाम में पारित करने के लिए की जरूरत नहीं है की जरूरत नहीं है। ऑब्जेक्ट (पैरेंट ऑब्जेक्ट) में प्रमाणीकरण के लिए एक रैपर विधि है जो उपयोगकर्ता नाम में जोड़ती है।

क्या यह कोई और सहायता है?

+0

मैं प्रतिक्रिया की सराहना करता हूं, लेकिन मूल रूप से आपका जवाब है "आप जो भी पूछ रहे हैं उसे करने का प्रयास करना अच्छा नहीं है"। आप सही हो सकते हैं, लेकिन यह वास्तव में सवाल का जवाब नहीं है।मैं अपने असली उदाहरण को कैसे बदल सकता हूं - मुझे पता है कि मैं इसे काम करने के लिए इसे बदल सकता हूं, लेकिन वास्तव में यह वास्तव में क्या नहीं है। शायद यह अभी भी एक अकादमिक सवाल का एक सा है। –

+0

मैं आपके द्वारा किए जाने वाले कार्यों के लिए एक उपयोग देख सकता हूं - मैं उस परियोजना में इसका उपयोग कर सकता हूं जिसका मैं वर्तमान में काम कर रहा हूं। जिस तरह से मैंने इसके आसपास काम किया, वह मूल वस्तु को बच्चे को पास करना है, हालांकि यह उल्लेख किया गया है कि परिपत्र संदर्भ प्रस्तुत करता है जो सीरियलाइजिंग करते समय समस्याग्रस्त होते हैं और माता-पिता ऑब्जेक्ट संदर्भों को परिभाषित और परिभाषित करने के तरीकों की आवश्यकता होती है। उदाहरण के लिए ऊपर दिए गए उदाहरण को अपडेट कर सकते हैं, हालांकि यह @fregas –

+0

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

0

मुझे पता है कि यह अभी प्रासंगिक नहीं है लेकिन सीएफ (ज़ीउस) के अगले संस्करण में यह http://blogs.adobe.com/coldfusion/2011/12/19/coldfusion-zeus-potr-callstack/ करने का कार्य है।

+0

असल में, कॉल स्टैक जो मैं पूछ रहा हूं उससे अलग है। मेरे उदाहरण में, foo.locateMe() को तीनों में से प्रत्येक कॉल कॉल ऑब्जेक्ट में उसी स्थान से उत्पन्न होती है, सभी अलग-अलग ऑब्जेक्ट्स में निहित होने के बावजूद। ऐसा इसलिए है क्योंकि कॉल स्टैक मेमोरी में ऑब्जेक्ट्स के संगठन की बजाय निष्पादन पथ (फ़ंक्शन कॉल की श्रृंखला) को संदर्भित करता है। –

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

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