लॉजिक-कम टेम्पलेट (जैसे मूंछें) का क्या फायदा है?


101

हाल ही में, मैं मूंछों में भाग गया जिसे लॉजिक-कम टेम्पलेट होने का दावा किया जाता है ।

हालाँकि, यह कोई व्याख्या नहीं है कि इसे लॉजिक-लेस तरीके से क्यों बनाया गया है। दूसरे शब्द में, तर्क-कम टेम्पलेट का क्या फायदा है?

जवाबों:


107

दूसरे शब्दों में, यह आपको पैर में खुद को गोली मारने से रोकता है। पुराने JSP दिनों में, JSP फ़ाइलों को जावा कोड के साथ छिड़का जाना बहुत आम बात थी, जो कि रिफ्लैक्टिंग को बहुत कठिन बना देती थी, क्योंकि आपके पास अपना कोड बिखरा हुआ था।

यदि आप डिज़ाइन के अनुसार टेम्प्लेट में लॉजिक को रोकते हैं (जैसे मूंछें करता है), तो आप लॉजिक को कहीं और लगाने के लिए बाध्य होंगे, इसलिए आपके टेम्प्लेट अप्रयुक्त हो जाएंगे।

एक और लाभ यह है कि आपको चिंताओं को अलग करने के संदर्भ में सोचने के लिए मजबूर किया जाता है: आपके नियंत्रक या तर्क कोड को यूआई में डेटा भेजने से पहले डेटा की मालिश करना होगा । यदि आप बाद में अपने टेम्प्लेट को दूसरे के लिए स्विच करते हैं (मान लीजिए कि आप एक अलग टेम्प्लेटिंग इंजन का उपयोग शुरू करते हैं), तो संक्रमण आसान होगा क्योंकि आपको केवल यूआई विवरण लागू करना होगा (क्योंकि टेम्पलेट पर कोई तर्क नहीं है, याद रखें)।


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

8
आपको अपने नियंत्रक में दृश्य के लिए डेटा तैयार नहीं करना चाहिए। नियंत्रक अनुप्रयोग प्रवाह को नियंत्रित करने के लिए है। इसके बजाय आपको जो करना चाहिए वह एक प्रस्तोता वर्ग बनाता है जो आपके मॉडल को एक दृश्य मॉडल में बदल देता है जिसे बाद में दृश्य द्वारा खपत किया जाता है। यूआई के लिए एक दृश्य मॉडल एक मॉडल है जो उस मॉडल से अलग है जो व्यावसायिक तर्क का हिस्सा है। मैं आपको रॉबर्ट "अंकल बॉब" मार्टिन द्वारा "क्लीन आर्किटेक्चर एंड डिज़ाइन" बात देखने की सलाह देता हूं: youtu.be/asLUTiJJqdE
ragol

1
यह कुछ प्रेजेंटेशन लॉजिक को कंट्रोलर में शामिल करता है, लेकिन यह विभिन्न प्रेजेंटेशन लेयर्स को म्यूट करने में मदद करता है। यदि आप चाहते हैं कि समान डेटा JSON, HTML, या XML के रूप में प्रस्तुत किया जाए, तो आपको HTML टेम्पलेट में डेटा को 100% मोड़ना नहीं चाहिए। यह JSON और XML को अपने स्वयं के घुमा प्रदर्शन तर्क के लिए छोड़ देगा। आप कंट्रोलर में डिस्प्ले लॉजिक के 80% को केंद्रीकृत कर रहे हैं, और अन्य 20% को लैम्ब्डा और फिल्टर में एम्बेड कर रहे हैं।
चुगड़ी

65

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

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

उदाहरण के लिए, मूंछों का उपयोग करके निम्नलिखित टेम्पलेट स्निपेट पर विचार करें :

{{name}}:
<ul>
  {{#items}}
    <li>{{.}}</li>
  {{/items}}
</ul>

मैं इसे समझ सकता हूं, लेकिन मैं निम्नलिखित ( अंडरस्कोर का उपयोग करके ) बहुत अधिक सरल और प्रत्यक्ष पाता हूं :

<%- name %>:
<ul>
<% _.each(items, function(i){ %>
  <li><%- i %></li>
<% }); %>
</ul>

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


135
मुझे आश्चर्य है कि आपको लगता है कि अंडरस्कोर टेम्पलेट सरल है .. यह मेरे लिए बहुत कम पठनीय लगता है। बस एक राय :-)
बेन क्लेटन

9
@ बेन-क्लेटन मैं इस बात से सहमत हूं कि पहला सिंटेक्स प्रीटियर और शायद अधिक पठनीय है। हालांकि, इसकी जटिलता जो मैं "सरल" कहने पर चला रहा हूं।
ब्रैड

1
कभी-कभी टेम्पररी स्टेटमेंट का उपयोग करना टेम्प्लेट में उपयुक्त होता है, चाहे आपके पास कोई भी तर्क हो। या क्या होगा यदि मैं किसी सरणी में आइटम की संख्या को आउटपुट करना चाहता हूं? मुझे नहीं पता कि मैं मूंछों का उपयोग कैसे कर सकता हूं, यह इस तरह की चीजों की कमी प्रतीत होता है।
पॉल शापिरो

5
@PaulShapiro आप टेम्पलेट के बाहर सरणी में आइटम की संख्या उत्पन्न करेंगे, और इसे एक अलग चर में संग्रहीत करेंगे।
सीन ओसेवा

4
@ ब्रैड, अंडरस्कोर टेम्पलेट ने XSS छेद पेश किया: nameऔर itemsइसमें जावास्क्रिप्ट शामिल हो सकता है।
मैथ्यू

28

मूंछें तर्क-कम है?

यह नहीं है:

{{#x}}
  foo
{{/x}}
{{^x}}
  bar
{{/x}}

इस के समान सुंदर?

if x
  "foo"
else
  "bar"
end

और नहीं है कि सुंदर के समान (पढ़ें: के लगभग एक परिभाषा) प्रस्तुति तर्क?


17
हां, यदि आप किसी वस्तु की सत्यता का मूल्यांकन कर रहे हैं, लेकिन कुछ अधिक जटिल करने की कोशिश संभव नहीं है ( if x > 0 && x < 10) ... तो, जबकि मूंछ का उपयोग तर्क के साथ या उसके बिना करना संभव है, यह आपके ऊपर है। आखिरकार, यह सिर्फ एक उपकरण है।
टॉम एशवर्थ

5
आप इसे गलत तरीके से देख रहे हैं। सिर्फ इसलिए कि आप एक भाषा में कुछ चीजें कर सकते हैं जो कि इसके सामान्य प्रतिमान के बिल्कुल समान नहीं हैं, इसका मतलब यह नहीं है कि भाषा उस प्रतिमान की नहीं है। आप जावा या हास्केल में अनिवार्य कोड लिख सकते हैं, फिर भी आप यह नहीं कहेंगे कि जावा एक ओओ भाषा नहीं है और न ही हास्केल एक कार्यात्मक भाषा नहीं है। यह देखें कि भाषा आपको आसानी से क्या करने देती है और यह आपको किस भाषा की ओर ले जाती है।
cjs

यदि आपकी जावा "कार्यात्मक-कम" के रूप में बेची जाती है या यदि हास्केल खुद को "ऑब्जेक्ट-ओरिएंटेड-कम" के रूप में बेचती है, तो @ CurtJ.Sampson आपकी समझ में आएगा। यह उत्तर प्रदर्शित कर रहा है कि "लॉजिक-लेस" सबसे अच्छा एक मिथ्या नाम है।
कोरी

1
मुझे लगता है कि आप मुझसे सहमत हैं कि जब हम एक भाषा को "कार्यात्मक" कहते हैं, तो हमारा मतलब है, "कार्यात्मक की ओर झुकाव।" असहमति यह प्रतीत होती है कि मैं "एक्स-लेस" को "एक्स से दूर" के रूप में परिभाषित करता हूं जबकि आप इसे "एक्स करने में पूरी तरह से असमर्थ" के रूप में परिभाषित करते हैं।
cjs

13

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

से मूंछें मैनुअल :

हम इसे "लॉजिक-लेस" कहते हैं क्योंकि अगर कोई बयान नहीं है, तो दूसरे खंड या लूप के लिए हैं। इसके बजाय केवल टैग हैं। कुछ टैग एक मूल्य के साथ बदले जाते हैं, कुछ कुछ नहीं, और कुछ अन्य मानों की एक श्रृंखला। यह दस्तावेज़ विभिन्न प्रकार के मूंछ टैगों की व्याख्या करता है।


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

1
सुनिश्चित करें, लेकिन शर्तों और पुनरावृत्ति के लिए ब्लॉक के बिना एक टेम्पलेट प्रणाली अपेक्षाकृत बेकार होगी। टेम्पलेट स्वयं निर्दिष्ट नहीं करता है कि ब्लॉक क्या है, या यह कैसे संभाला जाता है।
जेरेमी

12

सिक्के का दूसरा पहलू यह है कि व्यावसायिक तर्क को प्रस्तुति से बाहर रखने की एक बेताब कोशिश में, आप मॉडल में बहुत सारे प्रस्तुति तर्क रखते हैं। एक सामान्य उदाहरण यह हो सकता है कि आप एक तालिका में पंक्तियों को वैकल्पिक करने पर "विषम" और "यहां तक ​​कि" कक्षाएं लगाना चाहते हैं, जो कि दृश्य टेम्पलेट में एक साधारण मोडुलो ऑपरेटर के साथ किया जा सकता है। लेकिन अगर आपका व्यू टेम्प्लेट आपको ऐसा करने की अनुमति नहीं देता है, तो आपके मॉडल डेटा में आपको न केवल स्टोर करना होगा कि कौन सी पंक्ति विषम है या यहां तक ​​कि, लेकिन यह निर्भर करता है कि आपका टेम्पलेट इंजन कितना सीमित है, आपको अपने मॉडल को प्रदूषित करने की भी आवश्यकता हो सकती है। वास्तविक सीएसएस कक्षाओं के नाम के साथ। दृश्य मॉडल से अलग होने चाहिए, पूर्ण-विराम। लेकिन मॉडल भी देखें अज्ञेय होना चाहिए, और यह है कि इनमें से कई "नो-लॉजिक" टेम्पलेट इंजन आपको भूल जाते हैं। लॉजिक दोनों जगह जाता है,वास्तव में यह सही ढंग से तय करने के लिए करता है कि वह कहाँ जाता है। यह एक प्रस्तुति चिंता का विषय है, या एक व्यापार / डेटा चिंता? 100% प्राचीन विचार रखने के प्रयास में, प्रदूषण सिर्फ एक और कम दिखाई देने वाले लेकिन समान रूप से अनुपयुक्त जगह में लैंड करता है।

दूसरी दिशा में एक बढ़ता हुआ आंदोलन है, और उम्मीद है कि चीजें कहीं अधिक उचित मध्य-मैदान में केंद्रित होंगी।


6
वहाँ आप से असहमत होंगे। लॉजिक-कम टेम्प्लेट के लिए प्रेजेंटेशन लॉजिक मॉडल में नहीं जाता है, यह व्यू में जाता है, जहाँ यह होता है। दृश्य कच्चे मॉडल डेटा लेता है, और इसे प्रस्तुति के लिए तैयार करने के लिए आवश्यक (विषम / यहां तक ​​कि पंक्तियों, आदि की व्याख्या करके) मालिश करता है।
अक्जय

1
टेम्प्लेट से अधिक विचार क्यों नहीं हो सकते हैं और किसी टेम्प्लेट के लिए डेटा की मालिश करने के लिए कोड शामिल हैं?
लीजी

1
acjohnson55 - मैं आपके साथ इस बात से सहमत हूँ कि इसे कहाँ जाना चाहिए (दृश्य), लेकिन तर्क-वितर्क वाले टेम्पलेट बहुत कुछ रोकते हैं। @ लीगी - मुझे लगता है कि विचारों में बहुत अधिक तर्क के खिलाफ एक प्रतिक्रिया है, लेकिन विचारों में प्रस्तुति-विशिष्ट तर्क को रोकने के लिए चीजें दूसरी दिशा में बहुत दूर चली गई हैं।
मटका 3

4
मुझे पता है कि मुझे पार्टी के लिए देर हो रही है, लेकिन पंक्ति रंगों को वैकल्पिक करने के लिए CSS nth-item (विषम) का उपयोग किया जाना चाहिए।
डैनरेडक्स

1
मॉडल और संग्रह, या किसी अन्य डेटा से दृश्य द्वारा बनाई गई एक मध्यवर्ती प्रस्तुति वस्तु होने के साथ थ्रेर के कुछ भी गलत नहीं है। इस तरह, दृश्य प्रस्तुति डेटा बनाते हैं जो दृश्य को प्रस्तुत करने के लिए एक टेम्पलेट के साथ विलय होते हैं।
wprl

11

यह आपके टेम्प्लेट को क्लीनर बनाता है, और यह आपको तर्क को एक ऐसी जगह पर रखने के लिए मजबूर करता है, जहां इसे ठीक से परीक्षण किया जा सकता है।


2
क्या आप इसे अधिक विवरण के साथ समझा सकते हैं?
मॉर्गन चेंग

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

यदि तर्क एक फ़ंक्शन के रूप में है, तो इसका उपयोग माइक्रो-टेम्प्लेटिंग सिस्टम द्वारा किया जा सकता है जो एम्बेडेड तर्क और यूनिट-परीक्षण का समर्थन करता है। मुझे सबसे बुरा विचार हैंडलबार्स " हेल्पर्स " लगता है (देखें spin.atomicobject.com/2011/07/14/… "उन्नत उपयोग") - ये स्क्रिप्ट / के भीतर होने के कारण यूनिट-परीक्षण के लिए असंभव प्रतीत होगा / सादे पुरानी लिपि (/ टाइप / जावास्क्रिप्ट) टैग्स के बजाय टाइप / टेक्स्ट टैग्स
Dexygen

8

यह बातचीत ऐसा महसूस करती है जब मध्य युग के भिक्षु इस बात पर बहस करेंगे कि पिन के अंत में कितने स्वर्गदूत फिट हो सकते हैं। दूसरे शब्दों में इसकी शुरुआत धार्मिक, व्यर्थ और गलत तरीके से ध्यान केंद्रित करने के लिए होती है।

मिनी-रेंट एन्स्यूस (अनदेखा करने के लिए स्वतंत्र महसूस):

यदि आप पढ़ना जारी नहीं रखना चाहते हैं .. तो उपरोक्त विषय पर मेरी संक्षिप्त प्रतिक्रिया है: मैं तर्क-वितर्क से सहमत नहीं हूं। मैं इसे अतिवाद का एक प्रोग्रामिंग रूप मानता हूं। :-) :-)

अब मेरा शेख़ी जारी है: :-)

मुझे लगता है कि जब आप कई विचारों को चरम पर ले जाते हैं, तो परिणाम भयावह हो जाता है। और कभी-कभी (अर्थात यह विषय) मुद्दा यह है कि हम "गलत" विचार को चरम पर ले जाते हैं।

सभी लॉजिक को दृश्य से हटाना "लुडीक्रॉस" और गलत विचार है।

एक पल के लिए पीछे हटो।

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

हालाँकि ओवरराइडिंग का फोकस चिंताओं को अलग करने पर होना चाहिए। 100% लॉजिक-कम विचार नहीं। विचारों के भीतर का तर्क "मॉडल" को कैसे प्रस्तुत करना है, इसके साथ संबंधित होना चाहिए। जहां तक ​​मेरा सवाल है, विचारों में तर्क बिल्कुल ठीक है। आपके पास दृश्य-तर्क हो सकते हैं जो व्यवसाय-तर्क नहीं है।

हां, दिन में जब हमने JSP, PHP या ASP पेजों को कोड लॉजिक और व्यू लॉजिक से अलग या बिना अलग किए लिखा था, तो इन वेब-ऐप्स का रखरखाव एक बुरा सपना था। मेरा विश्वास करो मुझे पता है, मैंने बनाया और फिर इनमें से कुछ मठों को बनाए रखा। यह उस रखरखाव के चरण के दौरान था जिसे मैं वास्तव में (मेरे और मेरे सहयोगियों के तरीकों की त्रुटि) समझ गया था। :-) :-)

तो उच्च (उद्योग पंडितों) से सम्पादन बन गया, आपको अपने वेब-एप्स को सामने वाले नियंत्रक (जैसे कि हैंडलर या क्रियाओं के लिए भेजा जाना चाहिए) का उपयोग करके संरचना करना चाहिए [अपना वेब-ढांचा चुनें] और आपके विचारों में कोई कोड नहीं होना चाहिए । विचार गूंगे खाके बनने वाले थे।

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

एक परियोजना जिसमें मैं शामिल था, हमने लॉडिकस चरम पर तर्क-कम-विचार विचार का पालन करने की कोशिश की। हमारे पास एक घरेलू-विकसित टेम्पलेट इंजन था जो हमें HTML में मॉडल ऑब्जेक्ट्स को प्रस्तुत करने की अनुमति देगा। यह एक साधारण टोकन आधारित प्रणाली थी। यह एक बहुत ही सरल कारण के लिए भयानक था। कभी-कभी एक दृश्य में हमें तय करना होता है, क्या मुझे HTML का यह छोटा सा टुकड़ा प्रदर्शित करना चाहिए .. या नहीं .. यह निर्णय आमतौर पर मॉडल में कुछ मूल्य पर आधारित होता है। जब आपके पास देखने में कोई तर्क नहीं है, तो आप कैसे करते हैं? खैर आप नहीं कर सकते। इस बारे में हमारे वास्तुकार के साथ मेरे कुछ प्रमुख तर्क थे। हमारे विचारों को लिखने वाले सामने वाले एचटीएमएल लोग पूरी तरह से हंस्ट्रुंग थे जब उन्हें इस बात का सामना करना पड़ा और वे बहुत तनाव में थे क्योंकि वे अपने सामान्य उद्देश्यों को प्राप्त नहीं कर सकते थे। इसलिए मैंने हमारे टेम्प्लेटिंग इंजन के भीतर एक सरल IF-statement की अवधारणा पेश की। मैं आपको राहत और शांत होने का वर्णन नहीं कर सकता। हमारे टेम्प्लेट्स में एक सरल IF-Statement अवधारणा के साथ समस्या का समाधान किया गया था! अचानक हमारा टेम्प्लेटिंग इंजन अच्छा हो गया।

तो हम इस मूर्खतापूर्ण तनावपूर्ण स्थिति में कैसे आए? हमने गलत उद्देश्य पर ध्यान केंद्रित किया। हमने नियम का पालन किया, आपके विचारों में कोई तर्क नहीं होना चाहिए। वह गलत था। मुझे लगता है कि "नियम-से-अंगूठे" होना चाहिए, अपने विचारों में तर्क की मात्रा को कम से कम करें। क्योंकि अगर आप अनजाने में व्यावसायिक तर्क को दृश्य में रेंगने की अनुमति नहीं दे सकते - जो चिंताओं के पृथक्करण का उल्लंघन करता है।

मैं समझता हूं कि जब आप घोषित करते हैं कि "आपके पास विचारों में कोई तर्क नहीं होना चाहिए", तो यह जानना आसान हो जाता है कि आप "अच्छे" प्रोग्रामर कब बन रहे हैं। (यदि वह आपकी अच्छाई का माप है)। अब उपरोक्त नियम के साथ मध्यम जटिलता के एक वेब-एप्लिकेशन को लागू करने का प्रयास करें। यह इतनी आसानी से नहीं किया गया है।

मेरे लिए, विचारों में तर्क का नियम इतना स्पष्ट नहीं है और स्पष्ट रूप से यही वह जगह है जहाँ मैं चाहता हूँ।

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

मैं अपने शेख़ी के साथ कर रहा हूँ। :-)

चीयर्स,

डेविड


शानदार उत्तर, यह सभी अच्छी प्रोग्रामिंग प्रथाओं के बारे में है .. और वैसे भी, सर्वर और क्लाइंट में लॉजिक-कम टेम्पलेट्स का पुन: उपयोग नहीं कर रहा है, क्योंकि आपको दोनों में तर्क की नकल करनी होगी ..
mateusmaso

5

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

एक अन्य विकल्प सिर्फ एक टेम्प्लेटिंग सिंटैक्स ढूंढना है जो क्लाइंट और सर्वर दोनों पर समर्थित भाषा का उपयोग करता है, अर्थात सर्वर पर जावास्क्रिप्ट या तो नोड द्वारा उपयोग किया जाता है। या तो आप एक जेएस दुभाषिया और जुबां का उपयोग कर सकते हैं जैसे जुबैर के माध्यम से।

तब आप haml.js की तरह कुछ का उपयोग कर सकते हैं जो अब तक प्रदान किए गए किसी भी उदाहरण की तुलना में बहुत अधिक क्लीनर है और महान काम करता है।


मैं पूरी तरह से सहमत। कुछ पढ़ने के बाद, मैं इस नतीजे पर पहुंचा हूं कि क्लाइंट और सर्वर दोनों तरफ के जेएस में टेम्पलेट की क्षमता मेरी जरूरतों को विशिष्ट टेम्पलेटिंग भाषाओं के एक समूह से बेहतर रूप से पूरा करती है
क्रिस्टोफर

4

एक वाक्य में: लॉजिक-कम का मतलब है कि टेम्प्लेट इंजन अपने आप में कम जटिल है और इसलिए इसमें एक छोटा पदचिह्न है और अप्रत्याशित रूप से व्यवहार करने के लिए इसके कम तरीके हैं।


3

भले ही यह प्रश्न पुराना है और उत्तर दिया गया है, मैं अपने 2 which जोड़ना चाहूंगा (जो एक शेख़ी की तरह लग सकता है, लेकिन ऐसा नहीं है, यह सीमाओं के बारे में है और जब वे अस्वीकार्य हो जाते हैं)।

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

डेटा की "मालिश" (स्वीकृत उत्तर में शब्दों का उपयोग करने के लिए) एक वास्तविक समस्या बन सकती है - यहां तक ​​कि सरल रास्तों का भी समर्थन नहीं किया जाता है (कुछ जो हैंडलबार्स। जेएस पते)। यदि मेरे पास डेटा है और मुझे उस समय ट्वीक करने की आवश्यकता है, जब मैं कुछ प्रस्तुत करना चाहता हूं क्योंकि मेरा टेम्पलेट इंजन बहुत सीमित है, तो यह अंत में सहायक नहीं है। और यह मंच-स्वतंत्रता के उस हिस्से को हरा देता है जो मूंछें अपने लिए दावा करती हैं; मुझे हर जगह मालिश करने वाले तर्क की नकल करनी है।

उस ने कहा, कुछ हताशा के बाद और अन्य टेम्पलेट इंजनों को आजमाने के बाद हमने अपना (... अभी तक एक और ...) निर्माण किया, जो .NET रेजर टेम्प्लेट से प्रेरित वाक्य रचना का उपयोग करता है। यह सर्वर पर पार्स और संकलित है और एक सरल, स्व-निहित जेएस फ़ंक्शन (वास्तव में आवश्यकता के अनुसार मॉड्यूल) उत्पन्न करता है, जिसे टेम्पलेट को "निष्पादित" करने के लिए आमंत्रित किया जा सकता है, परिणाम के रूप में एक स्ट्रिंग लौटाता है। ब्रैड द्वारा दिया गया नमूना हमारे इंजन का उपयोग करते समय इस तरह दिखेगा (जो मुझे व्यक्तिगत रूप से मूंछ और अंडरस्कोर दोनों की तुलना में आसानी से बेहतर लगता है):

@name:
<ul>
@for (items) {
  <li>@.</li>
}
</ul>

मूंछों वाले धारावाहिकों में कॉल करने पर एक और तर्क-मुक्त सीमा ने हमें मारा। जबकि मस्टैच द्वारा पार्टिकल्स का समर्थन किया जाता है, पहले पास किए जाने वाले डेटा को कस्टमाइज़ करने की कोई संभावना नहीं है। इसलिए एक मॉड्यूलर टेम्पलेट बनाने में सक्षम होने और छोटे ब्लॉकों का पुन: उपयोग करने के लिए, मैं उनमें बार-बार कोड के साथ टेम्पलेट करना समाप्त करूंगा।

हमने XPath से प्रेरित एक क्वेरी भाषा लागू करके हल किया, जिसे हमने JPath कहा। मूल रूप से, हम बच्चों का उपयोग करने के लिए / डॉट्स का उपयोग करने के बजाय, और न केवल स्ट्रिंग, संख्या और बूलियन लीटर का समर्थन करते हैं, बल्कि वस्तुओं और सरणियों (सिर्फ JSON की तरह) का भी समर्थन करते हैं। भाषा साइड-इफ़ेक्ट-फ़्री है (जो टेम्प्लेटिंग के लिए बहुत ज़रूरी है) लेकिन नई साहित्यिक वस्तुएं बनाकर डेटा को "मालिश" करने की अनुमति देता है।

मान लें कि हम पंक्तियों पर क्रियाशील हेडर और लिंक के साथ "डेटा ग्रिड" तालिका प्रस्तुत करना चाहते हैं, और बाद में गतिशील रूप से jQuery का उपयोग करके पंक्तियों को जोड़ते हैं। यदि मुझे कोड की नकल नहीं करनी है तो पंक्तियों को आंशिक रूप से होना चाहिए। और यहीं से परेशानी शुरू होती है अगर कुछ अतिरिक्त जानकारी जैसे कि कॉलम को क्या प्रस्तुत किया जाएगा, दृश्यमॉडल का हिस्सा है, और प्रत्येक पंक्ति पर उन कार्यों के लिए बस यही है। हमारे टेम्प्लेट और क्वेरी इंजन का उपयोग करके कुछ वास्तविक कार्य कोड यहां दिए गए हैं:

टेबल टेम्प्लेट:

<table>
    <thead>
        <tr>
            @for (columns) {
                <th>@title</th>
            }
            @if (actions) {
                <th>Actions</th>
            }
        </tr>
    </thead>
    <tbody>
        @for (rows) {
            @partial Row({ row: ., actions: $.actions, columns: $.columns })
        }
    </tbody>
</table>

पंक्ति टेम्पलेट:

<tr id="@(row.id)">
    @for (var $col in columns) {
        <td>@row.*[name()=$col.property]</td>
    }
    @if (actions) {     
        <td>
        @for (actions) {
            <button class="btn @(id)" value="@(id)">@(name)...</button>
        }
        </td>
    }
</tr>

JS कोड से मंगलाचरण:

var html = table({
    columns: [
        { title: "Username", property: "username" },
        { title: "E-Mail", property: "email" }
    ],
    actions: [
        { id: "delete", name: "Delete" }
    ],
    rows: GetAjaxRows()
})

इसमें कोई व्यावसायिक तर्क नहीं है, फिर भी यह पुन: प्रयोज्य और विन्यास योग्य है, और यह साइड-इफ़ेक्ट फ्री भी है।


13
मैं ईमानदारी से इस जवाब की बात नहीं देखता, यह सवाल का जवाब बिल्कुल नहीं देता। आप कहते हैं कि वास्तव में यह वर्णन किए बिना सीमाएं हैं कि वे क्या हैं या कैसे होते हैं। अंत में आप अपने स्वयं के सिस्टम की चर्चा करते हैं जो किसी और के लिए उपलब्ध नहीं है, वास्तव में यह चूस सकता है और thedailywtf पर एक दिन समाप्त हो सकता है लेकिन हम कभी नहीं जान पाएंगे। स्रोत खोलें, इसे लिंक करें और हमें निर्णय लेने दें!
मैटलमर

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

मुझे इंजन की तरह आपके रेजर का विचार पसंद है ... क्या यह खुला स्रोत है?
क्रैकर

@ क्रैकर, नहीं, यह नहीं है (अभी तक) - इसके साथ "समस्या" यह है कि वर्तमान में टेम्पलेट ASP.NET MVC चलाने वाले सर्वर पर JS कोड के लिए संकलित किए जाते हैं, और इस प्रकार लक्ष्य दर्शक अन्य टेम्प्लेटिंग इंजन के साथ उतना बड़ा नहीं है । इसके अलावा, यह एक बड़ी लाइब्रेरी का हिस्सा है जिसे पहले हमें ओपन सोर्सिंग के लिए अलग से लेना होगा।
लुकेरो

1
@Esailija यह rowस्थिर नामों का उपयोग करने के बजाय गतिशील रूप से ऑब्जेक्ट से ली जाने वाली संपत्ति के नामों को निर्दिष्ट करने की अनुमति देता है । उदाहरण के लिए अगर $col.property == 'Something'यह सामग्री की उपज होगी row.Something
लुसारो

2

यहाँ चरित्र की गिनती के साथ, सूची प्रदान करने के 3 तरीके दिए गए हैं। सभी लेकिन पहला और सबसे छोटा तर्क-प्रधान अस्थायी भाषा में हैं ..

कॉफीस्क्रिप्ट ( प्रतिक्रियाशील कॉफी बिल्डर डीएसएल के साथ) - 37 वर्ण

"#{name}"
ul items.map (i) ->
  li i

नॉकआउट - 100 चार्ट

<span data-bind="value: name"/>
<ul data-bind="foreach: items">
   <li data-bind="value: i"/>
</ul>

हैंडलबार / मूंछ - 66 वर्ण

{{name}}:
<ul>
  {{#items}}
    <li>{{.}}</li>
  {{/items}}
</ul>

अंडरस्कोर - 87 वर्ण

<%- name %>:
<ul>
<% _.each(items, function(i){ %>
  <li><%- i %></li>
<% }); %>
</ul>

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

स्पष्ट रूप से मैं "व्यावसायिक तर्क" (व्यापक संगणना) को बाहर रखने के लिए आपत्ति नहीं करता। लेकिन मुझे लगता है कि प्रथम श्रेणी की भाषा के बजाय प्रदर्शन तर्क के लिए उन्हें एक छद्म भाषा देने से कीमत चुकानी पड़ती है। न केवल टाइप करने के लिए, बल्कि संदर्भ-स्विचिंग का एक जघन्य मिश्रण इसे पढ़ने की जरूरत है।

निष्कर्ष रूप में, मैं तर्क-वितर्क-युक्त टेम्पलेट्स को देखने में विफल रहता हूं, इसलिए मैं कहूंगा कि उनका लाभ मेरे लिए शून्य है, लेकिन मैं इस बात का सम्मान करता हूं कि समुदाय के कई लोग इसे अलग तरह से देखते हैं :)


@ ब्रैड, आप इस तुलना से क्या समझते हैं?
डीन रैडक्लिफ

2

लॉजिक-कम टेम्पलेट का उपयोग करने के मुख्य लाभ हैं:

  • मॉडल-दृश्य पृथक्करण को सख्ती से लागू करता है , विवरण के लिए यह पेपर देखें (अत्यधिक अनुशंसित)
  • समझने और उपयोग करने में बहुत आसान है , क्योंकि प्रोग्रामिंग लॉजिक (और ज्ञान!) की आवश्यकता नहीं है और वाक्यविन्यास न्यूनतम है
  • (विशेष रूप से मूंछें) अत्यधिक पोर्टेबल और भाषा स्वतंत्र, लगभग सभी प्रोग्रामिंग वातावरणों में संशोधन के बिना उपयोग किया जा सकता है

शानदार संक्षिप्त जवाब!
MrWatson

1

मैं ब्रैड से सहमत हूं: underscoreशैली को समझना आसान है। लेकिन मुझे स्वीकार करना होगा कि चीनी सभी को खुश नहीं कर सकती है। यदि _.eachकुछ भ्रामक है, तो आप पारंपरिक forलूप का उपयोग कर सकते हैं ।

  <% for(var i = 0; i < items.length; i++) { %>
    <%= items[i] %>
  <% } %>

यह हमेशा अच्छा होता है यदि आप मानक निर्माण जैसे कि forया पर वापस आ सकते हैं if। बस उपयोग करें <% if() %>या <% for() %>जबकि Mustacheकुछ के लिए उपयोग करें if-then-else(और अगर आप प्रलेखन नहीं पढ़ा तो भ्रमित):

{{#x}}
  foo
{{/x}}
{{^x}}
  bar
{{/x}}

टेम्पलेट इंजन बहुत अच्छा है जब आप आसानी से नेस्टेड टेम्पलेट प्राप्त कर सकते हैं ( underscoreशैली):

<script id="items-tmpl" type="text/template">
    <ul>
        <% for(var i = 0; i < obj.items.length; i++) { %>
            <%= innerTmpl(obj.items[i]) %>
        <% } %>
    </ul>
</script>

<script id="item-tmpl" type="text/template">
    <li>
        <%= name %>
    </li>
</script>

var tmplFn = function(outerTmpl, innerTmpl) {
    return function(obj) {
        return outerTmpl({obj: obj, innerTmpl: innerTmpl});
    };
};

var tmpl = tmplFn($('#items-tmpl').html(), $('#item-tmpl').html());
var context = { items: [{name:'A',{name:'B'}}] };
tmpl(context);

मूल रूप से आप अपने आंतरिक tmpl को अपने संदर्भ की संपत्ति के रूप में पास करते हैं। और उसी के अनुसार बुलाओ। मिठाई :)

वैसे, यदि आपकी रुचि का एकमात्र सामान टेम्पलेट इंजन है, तो स्टैंडअलोन टेम्पलेट कार्यान्वयन का उपयोग करें। यह केवल 900 अक्षरों का है जब खनन किया गया (4 लंबी लाइनें):

https://gist.github.com/marlun78/2701678

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.