यह 13 जून, 2007 को blog post I did का पुनर्मुद्रण है। मैं इस विधि का उपयोग काफी समय से कर रहा हूं और यह बहुत अच्छा काम करता है! YMMV।
उपयोगकर्ता परिभाषित कार्यों (यूडीएफ) को कौन पसंद नहीं करता है? यदि आपने कोई प्रोग्रामिंग किया है, तो संभावना है कि आपने उन्हें बड़े पैमाने पर उपयोग किया है। लोगों के साथ सबसे बड़ी समस्या यह है कि उन्हें अपने आवेदन में कैसे शामिल और व्यवस्थित करना है।
<!--- UDFs.cfc --->
<cfcomponent output="false">
<cffunction name="init" access="public” returntype="Any" output="false">
<cfreturn this>
</cffunction>
<cffunction name="myUDF1" access="public" returntype="Any" output="false">
</cffunction>
<cffunction name="myUDF2" access="public" returntype="Any" output="false">
</cffunction>
</cfcomponent>
एक बार जब आप:
मैंने पाया क्या कि ज्यादातर लोगों को करना एक Utils.cfc या UDFs.cfc बना सकते हैं और कटौती और उनके UDFs पेस्ट है कि वे घटक में उपयोग करने के लिए नीचे दिखाए चाहते है सभी यूडीएफ हैं कि आपका आवेदन आपके घटक में चिपकाए जाने का उपयोग करेगा, आपको यूडीएफ को आपके आवेदन में उपलब्ध कराने की आवश्यकता होगी। मैंने जो भी देखा है, वह घटक द्वारा एप्लिकेशन स्कोप में लोड हो रहा है। यदि आप Application.cfc उपयोग कर रहे हैं निम्नलिखित लाइन onApplicationStart()
में रखा जाता है या सिर्फ Application.cfm में जोड़कर आपको लगता है कि उपयोग कर रहे हैं:
<cfset application.functions = CreateObject("component", "udfs").init()>
जो भी एक का उपयोग कर रहे, Application.cfc या Application.cfm, परिणाम समान हैं; आपके सभी यूडीएफ आपके आवेदन के लिए उपलब्ध हैं और आप उन्हें पूरी तरह से उपयोग कर सकते हैं। केवल अंतर यह है कि आप किस वैरिएबल नाम का उपयोग करते हैं। मैं आवेदन का उपयोग करता हूं। क्रियाएं, कुछ एप्लिकेशन.टिल या application.udfs का उपयोग करें; कोई फर्क नहीं पड़ता, फिर से, परिणाम एक ही हैं।
वहाँ एक समस्या मैं हालांकि इस दृष्टिकोण के साथ है, यह बोझिल है है और UDFs घटक विशाल मिल जाएगा। ऐसी विशाल घटक फ़ाइल रखने में समस्या संपादन कर रही है, यह कोड की हजारों लाइनों के माध्यम से स्क्रॉल करने के बाद से एक दुःस्वप्न बन गया है, यह बहुत मजेदार नहीं है और मैंने देखा है कि सीएफईक्लीप्स बड़ी फाइलों पर नीचे गिरता है। निश्चित कोड पतन कुछ राहत प्रदान करता है लेकिन एक बेहतर तरीका होना चाहिए।
मैं क्या चाहता था बस प्रत्येक यूडीएफ मैं उपयोग कर रहा था और अपने आवेदन उन्हें स्वचालित रूप से लोड करने के लिए एक तरह से के लिए एक फ़ाइल के लिए किया गया था। इसके पीछे कारण यह था कि अगर मुझे myUDF1
संपादित करने की आवश्यकता है, तो मैं केवल myUDF1.cfm
फ़ाइल खोल सकता हूं और मुझे जो चाहिए उसे संपादित कर सकता हूं। मैं CFLib.org से यूडीएफ को पकड़ने में सक्षम होना चाहता था और कुछ भी संपादित किए बिना उन्हें अपने आवेदन में छोड़ देता हूं। अगर मुझे कभी भी अपने आवेदन से यूडीएफ को हटाने की ज़रूरत है, तो यह यूडीएफ फाइल को हटाने और मेरे आवेदन को फिर से शुरू करने जितना आसान होगा।
पूरा करने के लिए मैं चाहता था, मैं कोड के 11 लाइनों के लिए मेरी UDFs.cfc संशोधित:
<!--- UDFs.cfc --->
<cfcomponent output="false">
<cfset variables.udfdir = GetDirectoryFromPath(GetCurrentTemplatePath()) & "udfs">
<cfset variables.q = "">
<cffunction name="init" access="public" returntype="Any" output="false">
<cfreturn this>
</cffunction>
<cfdirectory action="list" directory="#variables.udfdir#" filter="*.cfm" name="variables.q">
<cfoutput query="variables.q">
<cfinclude template="udfs\#name#">
</cfoutput>
</cfcomponent>
तो क्या वास्तव में चल रहा है?
संक्षेप में, यहां क्या हो रहा है: मेरे पास एक ही निर्देशिका में udfs
नामक एक निर्देशिका है जो मेरे पास UDFs.cfc है। यह वह निर्देशिका है जिसे मैंने अपनी सभी यूडीएफ सीएफएम फाइलों को रखा है। UDFs.cfc क्या करता है जब यह कॉल किया जाता है तो इस निर्देशिका को स्कैन किया जाता है और स्वचालित रूप से प्रत्येक सीएफएम फ़ाइल को पाता है। इस प्रकार यह यूडीएफ फ़ोल्डर में स्वचालित रूप से किसी भी यूडीएफ को लोड करता है (आमतौर पर "मिश्रण" कहा जाता है)।
तो मेरा लक्ष्य तक पहुँच जाता है! मेरे पास प्रत्येक यूडीएफ की अपनी फाइल में है इसलिए मुझे इसे खोजने के लिए एक विशाल घटक फ़ाइल को स्क्रॉल करने की आवश्यकता नहीं है। अब मैं इसे आसानी से खोल और संपादित कर सकता हूं। निर्देशिका को देखकर, मुझे पता है कि मेरा आवेदन किस यूडीएफ का उपयोग कर रहा है। मैं निर्देशिका में ब्राउज़र से पाठ को केवल निर्देशिका में सहेजकर CFLib.org से स्वचालित रूप से एक यूडीएफ जोड़ सकता हूं। इसके अलावा यदि मुझे अब मेरे आवेदन में यूडीएफ का उपयोग करने की आवश्यकता नहीं है, तो मैं निर्देशिका से फ़ाइल को हटा देता हूं और इसे अगले एप्लिकेशन में मेरे एप्लिकेशन से निकाल दिया जाता है। यह सब मुख्य UDFs.cfc फ़ाइल को छूए बिना किया जाता है।
नीचे यूडीएफ CFM फ़ाइलों में से एक की तरह लग रहा है की एक उदाहरण है। फ़ाइल को fullLeft.cfm
कहा जाता है और यूडीएफ निर्देशिका में रहता है।
<!--- fullLeft --->
<cffunction name="fullLeft" access="public" displayname="fullLeft" returntype="string" output="false">
<cfargument name="str" type="string" required="true">
<cfargument name="count" type="numeric" required="true">
<cfif not refind("[[:space:]]", arguments.str) or (arguments.count gte len(arguments.str))>
<cfreturn Left(arguments.str, arguments.count)>
<cfelseif reFind("[[:space:]]",mid(arguments.str,arguments.count+1,1))>
<cfreturn left(arguments.str,arguments.count)>
<cfelse>
<cfif count-refind("[[:space:]]", reverse(mid(arguments.str,1,arguments.count)))>
<cfreturn Left(arguments.str, (arguments.count-refind("[[:space:]]", reverse(mid(str,1,arguments.count)))))>
<cfelse>
<cfreturn left(arguments.str,1)>
</cfif>
</cfif>
</cffunction>
बहुत अच्छा विचार, मुझे आपके दृष्टिकोण के साथ प्रयोग करना होगा। – kevink
मैं अच्छे परिणामों के साथ लंबे समय से ऐसा कर रहा हूं। –
मैंने कल इसे लागू किया और कहना है कि यह बहुत अच्छा काम करता है। मैंने निर्देशिका के माध्यम से लूपिंग करके अपने यूनिट परीक्षणों को सरल बनाने के दृष्टिकोण का भी उपयोग किया, इस प्रकार यह सुनिश्चित कर लें कि कोई भी कार्य याद नहीं किया जा सके। बहुत चालाक – kevink