2012-01-20 22 views
9

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

अंततः मेरे पास एक लाइव उदाहरण है और मालिक को दिखाया गया है। यह जो मैंने माना है वह सामान्य तरीका है (मेरे गुगलिंग से)। सेवा परत> गेटवे & डीएओ> बीन्स, कुछ कारखानों के साथ वस्तु निर्माण में मदद करने के लिए। यह अच्छी तरह से काम करता है और वही करता है जो मैं इसे पूरा करना चाहता था। वह इससे प्रभावित है और इस बात से सहमत है कि हमें अपने कोड को उखाड़ फेंकने और बेहतर व्यवस्थित करने की आवश्यकता है, लेकिन ऑब्जेक्ट ओरिएंटेड एपीआई कॉल की इस विधि को एक ही चीज़ को पूरा करने के लिए cfincludes की एक बड़ी सूची में उपयोग करने का लाभ नहीं दिखता है। संक्षेप में, जिस तरह से उन्होंने cfincludes को समझाया, वैसे ही यह एक विधि कॉल के समान काम करेगा।

उसने इस दृष्टिकोण के रूप में मेरे दृष्टिकोण के फायदे के लिए कहा है और मेरे जीवन के लिए मुझे एक वस्तु के भीतर समान डेटा को समूहीकृत करने के अलावा वास्तव में कोई स्पष्ट लाभ नहीं मिल सकता है। क्या कोई और चीज है या शायद सीएफएनओसी दृष्टिकोण के साथ जाना फायदेमंद होगा?

उत्तर

25

पठनीयता, रखरखाव, और साबित वस्तु उन्मुख मानदंड के पालन बल्कि cfincludes की एक भीड़ है, जिस पर शौकिया है की तुलना में, सीएफसी/वस्तुओं के एक सच्चे सेवा परत का उपयोग कर एक ColdFusion आवेदन के निर्माण के सर्वाधिक महत्वपूर्ण पहलुओं होगा सबसे अच्छा, और कचरा संग्रह दुःस्वप्न अपने सबसे खराब पर कारण बन सकता है।

पठनीयता

मान लीजिए कि आप एक cfinclude _queries.cfm कहा जाता है, जो आपके आवेदन के लिए सभी कॉल शामिल करते हैं।

<cfinclude template="_queries.cfm" /> 

<cfoutput query="employeeQry"> 

employeeQry कहाँ से आया: फिर, अपने कर्मचारी पेज के शीर्ष पर, बस तुम से पहले उत्पादन सभी कर्मचारियों, आप ऐसा करते हैं? क्या यह उस टेम्पलेट में से एक प्रश्न है? यह क्या करता है? क्या मुझे उस टेम्पलेट को शामिल करने की ज़रूरत है जब मैं केवल कर्मचारियों को ही चाहता हूं? यदि साइट में सभी प्रश्न हैं तो क्या होगा ... क्या उन्हें सभी को प्रत्येक बार शामिल करने की आवश्यकता है?

क्यों नहीं कुछ और भी अधिक पठनीय, इस तरह:

<cfset employeeQry = request.model.queries.getEmployees() /> 

<cfoutput query="employeeQry"> 

आह, वहाँ हम चले। एक नज़र में, आपके सिस्टम की बारीकियों के बारे में कुछ भी जानने के बिना, मैं तुरंत पहचान कर सकते हैं:

  • कहाँ employeeQry चर
  • सीएफसी क्या कैश्ड मैं से
  • कि मैं कर रहा हूँ क्वेरी बोल रहा हूँ से आया एक और केवल एक प्रश्न को बुला रहा है, और प्रश्नों की एक सरणी सहित द्रव्यमान नहीं, जिनमें से कोई भी पृष्ठ के लिए आवश्यक नहीं है।

सेवा परत (सीएफसी) में व्यावसायिक तर्क को सक्रिय करना आपके कोड की पठनीयता को बढ़ाता है, जो अगले विषय में आने पर अंतर लाने जा रहा है।

रखरखाव

आपको लगता है कि आप के आरोप में कर रहे हैं एक नए सीएफ एप्लिकेशन पर भी नियंत्रण प्राप्त है, और इसके बाद के संस्करण <cfinclude template="_queries.cfm"> टेम्पलेट को खोजने के लिए कर्मचारी पेज को खोलने के।

कि अंदर, मूल निर्माता एक टिप्पणी के प्रभाव से कुछ कह छोड़ देता है: "चलो सभी प्रश्नों को नहीं चला, चलो बस एक पैरामीटर के आधार पर एक विशिष्ट क्वेरी चलाने", और फिर आप कुछ इस तरह देखें:

<cfswitch case="#param#"> 
    <cfcase value="employee"> 
    <cfinclude template="_employeeQry.cfm"> 
    </cfcase> 
    <cfcase value="employees"> 
    <cfinclude template="_employeesQry.cfm"> 
    </cfcase> 
    <cfcase value="employeesByDept"> 
    <cfinclude template="_employeesByDept.cfm"> 
    </cfcase> 
</cfswitch> 

... ताकि आप इसे देखो और लगता है, ठीक है ... मैं, employeesByDept क्वेरी संशोधित करने की जरूरत है ताकि आप उस टेम्पलेट खुला दरार और पाते हैं:

<!--- employees by department ---> 
<cfif args.order_by is "ASC"> 
    <cfinclude template="_employeeQryByDeptOnASCOrder.cfm"> 
<cfelse> 
    <cfinclude template="_employeeQryByDeptOnDESCOrder.cfm"> 
</cfif> 

... और इस से बिंदु, आप चेहरे पर खुद को शूट करना चाहते हैं।

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

समाधान सरल है!

एक एकल सीएफसी जो आपके कर्मचारियों के लिए प्रश्न पूछने के व्यावसायिक तर्क को समाहित करता है।

<cfcomponent> 

    <cffunction name="getEmployees" returntype="query"> 

    <cfquery name="tmp"> 
    select employeeID, name, age 
    from employees 
    </cfquery> 

    <cfreturn tmp /> 
    </cffunction> 

    <cffunction name="getEmployeesByDept" returntype="query"> 
    <cfargument name="deptID"> 
    <cfargument name="order_by" required="false" default="ASC"> 

    <cfquery name="tmp"> 
    select employeeID, name, age 
    from employees e 
    inner join empToDept etd on (e.employeeID = etd.employeeID) 
    where etd.deptID = #arguments.deptID# 
    order by name #iif(arguments.order_by is 'asc',de('asc'),de('desc'))# 
    </cfquery> 

    <cfreturn tmp /> 

    </cffunction> 

</cfcomponent> 

अब, आप सभी जानकारी आप जब अपने कर्मचारी डेटाबेस क्वेरी करने का उत्पादन करना चाहते हैं के लिए संदर्भ का एक बिंदु है, और parameterize कर सकते हैं, यह सब एक ही बार में समायोजित/के भीतर शामिल भी शामिल है के पहाड़ों के माध्यम से खुदाई करने के लिए बिना भीतर शामिल है ... जो बोझिल है, और सीधे रखना मुश्किल है (यहां तक ​​कि पर्याप्त स्रोत नियंत्रण के साथ)।

यह सुंदर ढंग से आप एक ही पंक्ति लिखने के लिए अनुमति देता है:

<cfset empQry = request.model.queries.getEmployees() /> 

या

<cfset empQry = request.model.queries.getEmployeesByDept(14,'DESC') /> 

और अपनी नौकरी कोड कि बहुत आसान को बनाए रखने में आता है।

सिद्ध वस्तु उन्मुख मानदंड का अनुपालन

अपने मालिक की घोषणा की है कि एक जावा रॉकस्टार टीम में शामिल किया गया है। आप उनके साथ बैठने के लिए बहुत उत्सुक और उत्साहित हैं क्योंकि आप मुख्य रूप से पिछले कुछ सालों से सीएफ़ में फंस गए हैं, और उन्हें अपनी कुछ चीजें दिखाने का अवसर चाहते हैं, और संभवतः उनके साथ भी सीख सकते हैं।

"तो, एप्लिकेशन को डेटा तक पहुंच कैसे प्राप्त होती है?" वह तुमसे पूछता है

"ओह, हमारे पास कई प्रश्न हैं जो हम विभिन्न पृष्ठों पर कॉल करते हैं, और पैरामीटर के आधार पर, हम विभिन्न प्रकार की जानकारी खींचेंगे।"

"नाइस", वह कहता है, "तो ... आपके पास डेटा ऑब्जेक्ट मॉडल के लिए एक सेवा परत है, यह बहुत अच्छा है।"

वास्तव में नहीं, आपको लगता है।यह सिर्फ भीतर शामिल शामिल है ... लेकिन वह जा रहा रखता है,

"यही कारण है, उत्कृष्ट है, क्योंकि नई बातें हम जोड़ रहे होंगे में से एक एक ठेकेदार वस्तु है, जो मूल रूप से कर्मचारी के एक सबसेट है, वह जा रहे हैं कार्यक्षमता के कुछ अलग-अलग बिट्स हैं, लेकिन कुल मिलाकर एक कर्मचारी की तरह कार्य करेगा। हम आगे बढ़ेंगे और कर्मचारी को उपclass करेंगे, और उन प्रश्नों में से कुछ को ओवरराइड करेंगे ... "

... और अब आप खो गए हैं । क्योंकि इसमें कोई सबक्लासिंग शामिल नहीं है। इसमें शामिल होने में कोई विरासत नहीं है। किसी एक डोमेन या व्यापार वस्तु का कोई ज्ञान नहीं है, या यह अन्य वस्तुओं के साथ कैसे बातचीत की जानी चाहिए।

एक सीएफ शामिल एक शीर्षलेख या एक पाद लेख जैसे सामान्य तत्वों का पुन: उपयोग करने की सुविधा है। वे एक व्यापार वस्तु की जटिलताओं को प्रतिबिंबित करने के लिए एक तंत्र नहीं हैं।

जब आप डिजाइन/निर्माण/सीएफसी वस्तुओं है कि आपके आवेदन, आप एक आम भाषा के बात कर रहे की संस्थाओं को प्रतिबिंबित के रूप में लागू: OO। इसका मतलब है कि यह आपको एक सिद्ध संरचना के आधार पर एक प्रणाली को डिजाइन करने की क्षमता प्रदान नहीं करता है, यह अन्य प्रौद्योगिकियों में प्रोग्रामर को "ओओ-नेस" की उस भाषा को बढ़ाता है। जावा प्रोग्रामर, सी ++/सी # प्रोग्रामर इत्यादि ... ऑब्जेक्ट-ओरिएंटेड विकास का उचित ज्ञान रखने वाला कोई भी व्यक्ति आपकी भाषा बोल रहा है और आपके और आपके सिस्टम के साथ काम करने में सक्षम होगा।

इस अंतिम नोट पर ध्यान दें: प्रत्येक एप्लिकेशन को ऑब्जेक्ट उन्मुख होने की आवश्यकता नहीं है। यदि आपका बॉस चाहता है कि आप कर्मचारी तालिका के त्वरित एक्सएमएल डंप को चाबुक करें और इसे वेबसाइट पर थप्पड़ मार दें - हाँ, आप शायद उसके लिए एक संपूर्ण ओओ मॉडल से आगे निकल सकते हैं। लेकिन यदि आप जमीन से आवेदन बना रहे हैं, और यह कर्मचारियों, उपयोगकर्ताओं, विभागों, प्रश्नों, भूमिकाओं, नियमों, टिकटों को संक्षेप में पेश करने जा रहा है ... संक्षेप में: डोमेन में संस्थाएं, यह समय सीमाओं को अलग करने का समय होगा कोड का पुन: उपयोग करने के लिए आपके प्राथमिक उपकरण के रूप में।

ओह, और पीएस: कचरा संग्रह के बारे में शीर्ष पर छोड़ा गया वह छोटा नोट - कोई मजाक नहीं है। मैंने सीएफ अनुप्रयोगों को गलत तरीके से बनाया है, ताकि अनुप्रयोग.cfc स्वयं को cfincludes पर कॉल करता है, और JVM that can monitor realtime creation/destruction of objects in the GC पर सीएफ को हुक करने के बाद, मैंने स्मृति को ईकेजी मॉनिटर की तरह देखा है।

अच्छा नहीं है।

+0

कमाल। आपकी प्रतिक्रिया में अविश्वसनीय विस्तार के लिए धन्यवाद। – Antares

+0

एक और नोट पर, क्या अन्य दस्तावेज इस बात का विवरण दे रहे हैं कि मैं अपने मालिक को मनाने में मदद के लिए पढ़ सकता हूं? – Antares

1

शॉन की प्रतिक्रिया निश्चित रूप से मुख्य बिंदुओं को शामिल करती है। उन महत्वपूर्ण बिंदुओं को सारांशित करने के लिए जो आपके मालिक समझेंगे .. सीएफसी दृष्टिकोण उन्हें रखरखाव के मामले में ट्रैक के नीचे बहुत पैसा बचाएगा, और अपने डेवलपर्स को बहुत खुश रखेगा क्योंकि उनका काम इतना आसान होगा, और कुशल/प्रेरित डेवलपर्स की प्रतिधारण दर मानक के रूप में स्पेगेटी कोड के साथ रहने के मुकाबले बहुत अधिक होगी।

+1

यह शॉन के जवाब पर टिप्पणी के रूप में बेहतर होगा। मैं तुम्हें कम करने वाला नहीं हूं, लेकिन एक सुझाव। –

1

मैं पूरी तरह से शॉन की प्रतिक्रिया से सहमत हूं ... और यदि आप अपना कोड एक उच्च स्तर पर ले जाना चाहते हैं, तो ढांचे का उपयोग करें! फिर यह वास्तव में आपको और अन्य डेवलपर्स को बहुत समय बचाएगा, क्योंकि हर कोई अपने मानकों का पालन करेगा।

मेरी व्यक्तिगत वरीयता कोल्डबॉक्स है, लेकिन लोकप्रिय एमवीसी/ओओ ढांचे में से कोई भी करेगा - कोल्डबॉक्स, मैक-द्वितीय, मॉडल-गोंद, एफडब्ल्यू/1। मैंने सीएफव्हील्स के बारे में भी अच्छी बातें सुनी हैं लेकिन इसका इस्तेमाल नहीं किया है।

+0

मैंने फ्रेमवर्क के बारे में कई चीजें सुनी हैं और हमारे पास मैक-द्वितीय के शीर्ष पर एक चैट एप्लिकेशन बिल्ड है लेकिन यह कुछ और बन गया है, उम्मीद है कि हम कभी विफल नहीं होंगे क्योंकि हर कोई इसे डीबग करने से नफरत करता है। मुझे डर है कि ढांचे का उपयोग करने से कुछ जटिलता बढ़ जाएगी जो काफी सरल होनी चाहिए लेकिन यह उनकी सीमित समझ हो सकती है। – Antares