पठनीयता, रखरखाव, और साबित वस्तु उन्मुख मानदंड के पालन बल्कि 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 पर सीएफ को हुक करने के बाद, मैंने स्मृति को ईकेजी मॉनिटर की तरह देखा है।
अच्छा नहीं है।
कमाल। आपकी प्रतिक्रिया में अविश्वसनीय विस्तार के लिए धन्यवाद। – Antares
एक और नोट पर, क्या अन्य दस्तावेज इस बात का विवरण दे रहे हैं कि मैं अपने मालिक को मनाने में मदद के लिए पढ़ सकता हूं? – Antares