एक ओर, विषय वास्तव में वर्ग था। दूसरी ओर, यह गोल था। लेकिन तीसरी तरफ, जिसके साथ त्रिकोण होना चाहिए, वस्तु घुमावदार और तिरछी निकली।
- क्या एलोसेन्का मीटिंग रूम में जाता है? - लेनोकोकिना ने इच्छुक चेहरे के दरवाजे में अटक गया।
- एलोसेन्का बैठक में भाग नहीं ले रहे हैं। अलसेनका एक लेख लिखता है।
- क्यूब्स के बारे में?
- क्या अन्य क्यूब्स? - मैंने अपनी आँखें नीची कर लीं, मेरे हाथों में और सच एक दुर्भाग्यपूर्ण घन था। वह एक गेंद है। वह एक मकबरा है।
- क्यूब्स के बारे में नहीं! और गेंदों के बारे में नहीं। टेम्पलेट्स के बारे में।
"मैं उन्हें बताऊंगा कि!" पैटर्न, आह। - हेलेन पहले से ही गलियारे से नीचे चल रही थी।
"टेम्पलेट्स के बारे में। यहां तक कि तीन अलग-अलग टेम्पलेट्स के बारे में।" अधिक सटीक रूप से, सर्वर कोड में टेम्प्लेट का उपयोग करने के तीन कारणों के बारे में। और इनमें से कोई भी कारण HTML के बारे में नहीं होगा।
उदाहरणों में, मैंने लैकेनिक सिंटैक्स और चलने वाली हर चीज के लिए कार्यान्वयन की उपस्थिति के कारण मूंछ सिंटैक्स का उपयोग किया। मूंछें व्यावहारिक रूप से खुद को किसी भी स्वतंत्रता की अनुमति नहीं देती हैं, इसके विपरीत, उदाहरण के लिए, .Net रेजर, जो आपको टेम्पलेट के अंदर कोड करने की अनुमति देता है, जिससे कमजोर डेवलपर्स के लिए एक बुरा उदाहरण स्थापित होता है।
कोड उदाहरण अजगर में होंगे। पायथन के लिए मूंछों के कार्यान्वयन को पिस्ता कहा जाता है।
तो, पैटर्न में तीन कारण बताए आपका जीवन आपका कोड
पाठ कलाकृतियों
यदि आपके पास एक प्रणाली है जिसके अंदर कुछ डेटा मौजूद है - उदाहरण के लिए, एक संबंधपरक डेटाबेस में डेटा या एपीआई कॉल के माध्यम से प्राप्त डेटा, कभी-कभी आपको इस डेटा के आधार पर कलाकृतियों को बनाने की आवश्यकता होती है।
विरूपण साक्ष्य हो सकता है, उदाहरण के लिए, JSON या सादा पाठ फ़ाइल, अनुलग्नक, HTTP प्रतिक्रिया। मुख्य बात - एक विरूपण साक्ष्य अनिवार्य रूप से आपके सिस्टम में डेटा के कुछ अपेक्षाकृत कॉम्पैक्ट भाग से एक फ़ंक्शन को लागू करने का परिणाम है। और विरूपण साक्ष्य का अपना सिंटैक्स है।
विरासत प्रणाली को अपलोड करने के लिए आर्टवर्क पाठ प्रारूप में एक बैंक स्टेटमेंट हो सकता है। कलाकृतियों में एक .json फ़ाइल के रूप में एक इलेक्ट्रॉनिक चेक की उतराई हो सकती है, जिसे मेल द्वारा क्लाइंट के लिए अनुलग्नक के रूप में भेजा जाएगा।
इन सभी मामलों में, आप विरूपण साक्ष्य टेम्पलेट्स का उपयोग करके अपने जीवन को सरल बनाएंगे।
टेम्पलेट इंजन क्या है? यह एक पुस्तकालय है जो एक ऑब्जेक्ट मॉडल (संदर्भ) लेगा, एक टेम्पलेट लेगा, एक दूसरे को लागू करेगा - और परिणाम देगा। ऑब्जेक्ट मॉडल और टेम्पलेट प्रोग्रामर द्वारा तैयार किए जाते हैं। अंतिम परिणाम टेम्पलेट इंजन द्वारा तैयार किया जाता है।
उदाहरण: आदेश के बारे में एक पाठ संदेश बनाने का प्रयास करें।
सबसे पहले, ऑब्जेक्ट मॉडल तैयार करें:
def add_comma(list): for a in list[:-1]: a["comma"] = True def get_model(): res = { "documentId": 3323223, "checkDate": "01.02.2019 22:20", "posId": 34399, "posAddr": "Urupinsk, 1 Maya 1", "lines": [ { "no": 1, "itemtext": "Hello Kitty", "amount": 3, "sumRub": "55.20" }, { "no": 2, "itemtext": "Paper pokemons", "amount": 1, "sumRub": "1230.00" }, { "no": 2, "itemtext": "Book of Mustache", "amount": 1, "sumRub": "1000.00" } ], "total": { "amount": "3285.20" } } add_comma(res["lines"]) res["posInUrupinsk"] = res["posId"] > 34000 return res
कोड विशुद्ध रूप से डमी है। वास्तविक कोड में, डेटाबेस क्वेरी हो सकती है, मूल्यों की गणना के लिए कुछ प्रकार के तर्क (उदाहरण के लिए, हम ऑर्डर आइटम के आधार पर कुल.माउंट के मूल्य की गणना करते हैं)।
कुछ बातों पर ध्यान दें:
- यह ऑर्डर का ऑब्जेक्ट मॉडल नहीं है, यह कुछ सरल है, टेम्पलेट में उपयोग के लिए तैयार किया गया है। वास्तविक व्यवसाय मॉडल में "समरब" और "टोटल.माउंट" का मान पाठ्य नहीं होना चाहिए, ऑब्जेक्ट मॉडल में लाइनों के सरणी का "अल्पविराम" मान नहीं है, यह केवल रेंडरिंग को सरल बनाने की आवश्यकता है (pystache खुद को यह नहीं बता सकता है कि सूची आइटम अंतिम है और इसके बाद अल्पविराम लगाने की आवश्यकता नहीं है।
- फ़ील्ड प्रकार "राशि" पाठ है और यह पाठ टेम्पलेट में आउटपुट के लिए स्वरूपित है। यदि आपका टेम्प्लेट इंजन फॉरमेटर्स (कुछ ऐसा "... {someValue | asMoney}") का समर्थन करता है, तो सीधे मॉडल में फॉर्मेट करना आवश्यक नहीं है।
- टेम्प्लेट में पाठ Uryupinsk के ग्राहकों के लिए थोड़ा अलग दिखना चाहिए (प्रबंधक अंतिम क्षण में भाग गया और जोड़ने के लिए कहा - व्यवसाय ने वास्तव में पूछा, उन्होंने अचानक शहर के लिए एक विपणन अभियान शुरू किया)। इसलिए, हमने मॉडल में बूलियन मूल्य "posInUrupinsk" को जोड़ा और इसका उपयोग टेम्पलेट में किया।
- अन्य टेम्प्लेट को रेंडर करने के अलावा, टेम्प्लेट से दोबारा मॉडल का उपयोग न करना बेहतर है
मूंछ टेम्पलेट का पाठ इस तरह दिखता है:
{{#posInUrupinsk}} ! 100 . {{/posInUrupinsk}} {{^posInUrupinsk}} : {{/posInUrupinsk}} {{#lines}} #{{no}} ... {{itemtext}}: {{sumRub}} {{#comma}};{{/comma}}{{^comma}}.{{/comma}} {{/lines}} : {{total.amount}} --------------------------- N : {{documentId}} {{checkDate}}
हम टेम्पलेट में देखते हैं कि Uryupinsk में ऑर्डर के लिए दस्तावेज़ हेडर अन्य शहरों से अलग है। हम यह भी देखते हैं कि कमोडिटी की स्थिति के साथ अंतिम पंक्ति के अंत में एक बिंदु है, और सभी शुरुआती स्थितियों में एक अर्धविराम है। मॉडल जनरेटर में "अल्पविराम" विशेषता और "add_comma" विधि इसके लिए जिम्मेदार हैं।
टेम्पलेट पर संदर्भ लागू करने वाला कोड तुच्छ है:
model = get_model() with open(os.path.join("templates", "check.txt.mustache"), 'r') as f: template = f.read() check_text = pystache.render(template, model) print(check_text)
परिणाम:
! 100 . #1 ... Hello Kitty: 55.20 ; #2 ... Paper pokemons: 1230.00 ; #2 ... Book of Mustache: 1000.00 . : 3285.20 --------------------------- N : 3323223 01.02.2019 22:20
एक और टिप: यदि कार्य इसे अनुमति देता है, तो मॉडल को प्रदान किए गए टेम्पलेट (उदाहरण के लिए, JSON प्रारूप में) के साथ सहेजें। यह डिबगिंग और समस्या निवारण में मदद करेगा।
नए मॉडल को जारी करते हुए, प्रिंटर ने तीन बार चीख़ी। त्रिकोणीय पक्ष अब एक आदर्श त्रिकोण था। अन्य दो पक्ष चौकोर थे। तंत्रिका नेटवर्क ने अपना जीवन व्यतीत किया और सभी प्रकार से एक मॉडल मॉडल आदिम देने से इनकार कर दिया।
"मैं हेलेन को एक घन दूंगा।" मैंने सोचा। इसे आनन्दित होने दें।
कोड जनरेशन
आपको बैकएंड के अंदर से रनटाइम में जावास्क्रिप्ट बनाने की आवश्यकता हो सकती है। क्यों? उदाहरण के लिए, ब्राउज़र-साइड रिपोर्ट बनाने के लिए। या जाओ कार्यक्रम के भीतर से एफ # में एक स्क्रिप्ट प्राप्त करें। या ReactJS के भीतर से कोटलिन कोड (मैं कल्पना नहीं कर सकता कि यह क्यों आवश्यक हो सकता है, लेकिन अचानक आपके पास ऐसे विशिष्ट झुकाव हैं)।
कोड पीढ़ी के मामले में, पहले परिणामी कोड (जिसे हम उत्पन्न करना चाहते हैं) को अपने हाथों से लिखना बेहतर है, और उसके बाद ही इसे टेम्पलेट और मॉडल में तोड़ दें। यह दृष्टिकोण हमें इससे बचाएगा उदासी मॉडल की अत्यधिक जटिलता। एक मॉडल को जटिल करने में कभी देर नहीं होती है, लेकिन एक साधारण से शुरू करना सबसे अच्छा है।
var report = CreateChart({ title: " - " }, type: "lineChart", sourceUrl: "/reports/data/0" ); report.addLine({ dataIndex:0, title: "", color: "green" }); report.addLine({ dataIndex:1, title: "", color: "red" }); report.render($("#reportPlaceholder1")); var report = CreateChart({ title: " - " }, type: "lineChart", sourceUrl: "/reports/data/1"); report.addLine({ dataIndex:0, title: "Hello Kitty", color: "#000" }); report.addLine({ dataIndex:1, title: "PokemonGo", color: "#222" }); report.addLine({ dataIndex:2, title: "Mustache", color: "#333" }); report.render($("#reportPlaceholder2"));
यहां हम देखते हैं कि हमारे पास पृष्ठ पर एक से एन लाइनचर्ट चार्ट हैं, जिनमें से प्रत्येक का अपना डेटा स्रोत, शीर्षक और संकेतकों की सूची है। modelka:
def get_model(): return { "charts": [ { "divId": "#reportPlaceholder1", "title": " - ", "sourceUrl": "/reports/data/0", "series": [ {"dataIndex": 0, "title": "", "color": "green"}, {"dataIndex": 1, "title": "", "color": "red"}, ] }, { "divId": "#reportPlaceholder2", "title": " - ", "sourceUrl": "/reports/data/1", "series": [ {"dataIndex": 0, "title": "Hello Kitty", "color": "#000"}, {"dataIndex": 1, "title": "PokemonGo", "color": "#111"}, {"dataIndex": 2, "title": "Mustache", "color": "#222"}, ] } ] }
खैर, टेम्पलेट:
{{#charts}} var report = CreateChart({ title: "{{title}}" }, type: "lineChart", sourceUrl: "{{sourceUrl}}" ); {{#series}} report.addLine({ dataIndex:{{dataIndex}}, title: "{{title}}", color: "{{color}}" }); {{/series}} report.render($("{{divId}}")); {{/charts}}
कृपया ध्यान दें: मानकीकरण के लिए इस "हेड-ऑन" दृष्टिकोण को मॉडल में स्क्रीन मूल्यों के लिए एक अलग प्रयास की आवश्यकता है। यदि श्रृंखला में [0]। तोल हम एक अल्पविराम या उद्धरण चिह्न प्राप्त करते हैं - "हैलो किट्टी \" "- परिणामस्वरूप फ़ाइल का सिंटैक्स अलग हो जाएगा। इसलिए, स्क्रीनिंग फ़ंक्शन लिखें और मॉडल बनाते समय उनका उपयोग करें। यदि टेम्पलेट इंजन जानता है कि फॉर्मेटर्स का उपयोग करें।
तीसरी मौत दरवाजे के माध्यम से उड़ गई और एक दस्तक के साथ उछल गई। यह भी अच्छा नहीं है यह तो इंटरेस्टिंग है। लेकिन क्या आप घन को रोल कर सकते हैं ताकि यह दरवाजे के नीचे फिसल जाए और गलियारे के अंत तक पहुंच जाए? क्या यह 3 डी-प्रिंट रबर के लिए संभव है? या इसे हवा से भरे ऐसे छोटे इकोसैड्रोन से भरना बेहतर है? ...
एसक्यूएल प्रश्न
पिकी पाठक कहेंगे कि यह कोड पीढ़ी भी है, एक प्रोग्रामिंग भाषा से दूसरे में अवधारणाओं का अनुवाद। जिसके लिए हम picky रीडर का जवाब देंगे कि SQL के साथ या किसी अन्य डेटाबेस क्वेरी लैंग्वेज के साथ काम करना थोड़ा अलग प्रोग्रामिंग क्षेत्र है और यह हर किसी के लिए स्पष्ट नहीं है कि अगर js स्क्रिप्ट टेम्प्लेट द्वारा उत्पन्न की जा सकती है, तो SQL भी संभव है। इसलिए, हम एक अलग मामले में अनुरोध जारी करेंगे।
और ताकि picky रीडर ऊब न जाए, हम लेख में केवल कुछ प्रश्नों के उदाहरणों को छोड़ देंगे। आप स्वयं पता लगा सकते हैं कि कौन सा मॉडल और कौन सा टेम्पलेट यहां बेहतर अनुकूल हैं जीथब पर उदाहरणों में आप देख सकते हैं कि मैंने क्या किया।
SELECT * FROM hosts WHERE firmware_id=1 AND bmc_login='admin' ORDER BY ip DESC; SELECT * FROM hosts ORDER BY name LIMIT 3; SELECT host_type_id, COUNT(*) FROM hosts GROUP BY host_type_id;
जीथब पर टेम्पलेट (एसक्यूएल के लिए) और कोड उदाहरण पाए जा सकते हैं।