Tiga contoh tidak jelas menggunakan mesin template di backend

Di satu sisi, subjeknya memang persegi. Di sisi lain, itu bulat. Tetapi di sisi ketiga, dengan segitiga yang seharusnya, objek keluar melengkung dan miring.


- Apakah Alyoshenka pergi ke ruang pertemuan? - Lenochkina terjebak di wajah tertarik pintu.
- Alyoshenka tidak menghadiri pertemuan. Aleshenka menulis artikel.
- Tentang kubus?
- Kubus apa lagi? - Aku menurunkan mataku, di tanganku dan kebenaran adalah kubus yang sial. Itu bola. Itu adalah belah ketupat.
- Bukan tentang kubus! Dan bukan tentang bola. Tentang templat.
"Aku akan mengatakan itu pada mereka!" Pola, ah. - Helen sudah berlari di koridor.


"Tentang templat. Bahkan sekitar tiga templat berbeda." Lebih tepatnya, sekitar tiga alasan untuk menggunakan templat dalam kode server. Dan tidak satu pun dari alasan ini adalah tentang HTML.


Dalam contoh, saya menggunakan sintaksis Moustache , karena sintaks laconic dan keberadaan implementasi untuk segala sesuatu yang bergerak. Kumis praktis tidak memungkinkan kebebasan apa pun, tidak seperti, misalnya, .Net Razor, yang memungkinkan Anda membuat kode di dalam templat, dengan demikian memberikan contoh buruk bagi pengembang yang lemah.


Contoh kode akan menggunakan python. Implementasi Mustache untuk Python disebut pystache .


Jadi, tiga alasan untuk membiarkan pola masuk hidupmu kode Anda.


Artefak teks


Jika Anda memiliki sistem di dalamnya ada beberapa data - misalnya, data dalam basis data relasional atau data yang diperoleh melalui panggilan API, kadang-kadang Anda perlu membuat artefak berdasarkan data ini.


Artefak dapat berupa, misalnya, JSON atau file teks biasa, lampiran, respons HTTP. Hal utama - artefak pada dasarnya adalah hasil dari penerapan fungsi dari beberapa bagian data yang relatif kompak di sistem Anda. Dan artefak memiliki sintaksnya sendiri.


Artefak dapat berupa pernyataan bank dalam format teks untuk diunggah ke sistem lawas. Artefak dapat berupa pembongkaran cek elektronik dalam bentuk file .json, yang akan dikirim sebagai lampiran ke klien melalui pos.


Dalam semua kasus ini, Anda akan sangat menyederhanakan hidup Anda dengan menggunakan templat artefak.


Apa itu mesin template? Ini adalah perpustakaan yang akan mengambil model objek (konteks), mengambil templat, menerapkan satu sama lain - dan memberikan hasilnya. Model objek dan template disiapkan oleh programmer. Hasil akhir disiapkan oleh mesin templat.


Contoh: cobalah membuat pesan teks tentang pesanan.


Pertama, siapkan model objek:


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 

Kode ini murni tiruan. Dalam kode nyata, mungkin ada permintaan basis data, semacam logika untuk menghitung nilai (misalnya, kami menghitung nilai total.amount berdasarkan item pesanan).


Perhatikan beberapa hal:


  • Ini BUKAN model objek pesanan, itu sesuatu yang lebih sederhana, disiapkan untuk digunakan dalam templat. Nilai-nilai "sumRub" dan "total.amount" dalam model bisnis nyata tidak boleh tekstual, nilai "koma" dari array baris dalam model objek tidak termasuk, itu hanya diperlukan untuk menyederhanakan rendering (pystache tidak dapat memahami dirinya sendiri bahwa item daftar adalah yang terakhir dan setelah itu tidak perlu koma.
  • Jenis lapangan "jumlah" adalah teks dan teks ini diformat untuk keluaran dalam templat. Jika mesin template Anda mendukung pemformat (seperti "... {someValue | asMoney}"), maka memformat secara langsung dalam model tidak perlu.
  • Teks dalam template harus terlihat sedikit berbeda untuk klien dari Uryupinsk (manajer berlari pada saat terakhir dan diminta untuk menambahkan - bisnis benar-benar bertanya, mereka tiba-tiba meluncurkan kampanye pemasaran untuk kota). Oleh karena itu, kami menambahkan nilai boolean "posInUrupinsk" ke model dan menggunakannya dalam templat.
  • Lebih baik tidak menggunakan model lagi dari templat, kecuali untuk merender templat lainnya

Teks template kumis terlihat seperti ini:


 {{#posInUrupinsk}}    !        100   . {{/posInUrupinsk}} {{^posInUrupinsk}}    : {{/posInUrupinsk}} {{#lines}} #{{no}} ... {{itemtext}}: {{sumRub}} {{#comma}};{{/comma}}{{^comma}}.{{/comma}} {{/lines}} : {{total.amount}} --------------------------- N : {{documentId}}  {{checkDate}} 

Kita melihat dalam template bahwa header dokumen untuk pesanan di Uryupinsk berbeda dari kota-kota lain. Kita juga melihat bahwa pada akhir baris terakhir dengan posisi komoditas ada titik, dan di semua posisi awal ada titik koma. Atribut "koma" dan metode "add_comma" di generator model bertanggung jawab untuk ini.


Kode yang menerapkan konteks ke templat sepele:


 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) 

Hasil:


    !        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 

Kiat lain: jika tugas memungkinkan, simpan model itu sendiri dengan templat yang diberikan (misalnya, dalam format JSON). Ini akan membantu dengan debugging dan pemecahan masalah.




Printer mencicit tiga kali, mengeluarkan model baru. Sisi segitiga sekarang adalah segitiga yang sempurna. Dua sisi lainnya persegi. Jaringan saraf menjalani hidupnya sendiri dan menolak untuk memberikan model model primitif dalam segala hal.


"Aku akan memberi Helen kubus." Saya pikir. Biarkan itu bersukacita.


Pembuatan Kode


Anda mungkin perlu membuat JavaScript saat runtime dari dalam backend. Mengapa Untuk membuat laporan sisi-peramban, misalnya. Atau dapatkan skrip dalam F # dari dalam program Go. Atau kode Kotlin dari dalam ReactJS (saya tidak bisa membayangkan mengapa ini mungkin diperlukan, tetapi tiba-tiba Anda memiliki kecenderungan tertentu).


Dalam hal pembuatan kode, lebih baik menulis dulu dengan tangan Anda kode yang dihasilkan (apa yang ingin kami hasilkan) dan baru kemudian memecahnya menjadi templat dan model. Pendekatan ini akan menyelamatkan kita dari kerinduan kompleksitas model yang berlebihan. Tidak ada kata terlambat untuk merumitkan model, tetapi yang terbaik adalah memulainya dengan yang sederhana.


 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")); 

Di sini kita melihat bahwa kita memiliki satu bagan dari bagan baris N bagan pada halaman, yang masing-masing memiliki sumber data, judul, dan daftar indikator sendiri. 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"}, ] } ] } 

Nah, templatnya:


 {{#charts}} var report = CreateChart({ title: "{{title}}" }, type: "lineChart", sourceUrl: "{{sourceUrl}}" ); {{#series}} report.addLine({ dataIndex:{{dataIndex}}, title: "{{title}}", color: "{{color}}" }); {{/series}} report.render($("{{divId}}")); {{/charts}} 

Harap dicatat: pendekatan "langsung" ini untuk standardisasi memerlukan upaya terpisah untuk menyaring nilai dalam model. jika tanda koma atau tanda kutip "Hello Kitty \" "menyelinap di seri [0] .title, sintaks dari file yang dihasilkan akan berantakan. Oleh karena itu, tulis fungsi penyaringan dan gunakan ketika membuat model. Gunakan pemformat jika mesin template dapat melakukan ini.




Mati ketiga terbang melalui pintu dan bangkit dengan ketukan. Itu juga tidak baik. Menarik. tetapi bisakah Anda menggulingkan kubus sehingga tergelincir di bawah pintu dan mencapai ujung koridor? Apakah mungkin untuk karet cetak 3D? Atau lebih baik membuatnya diisi dengan icosahedron kecil yang diisi udara? ...


Pertanyaan SQL


Pembaca pemilih akan mengatakan bahwa ini juga pembuatan kode, terjemahan konsep dari satu bahasa pemrograman ke yang lain. Untuk itu kami akan menjawab pemilih pemilih yang bekerja dengan SQL atau dengan bahasa query database lainnya adalah area pemrograman yang sedikit terpisah dan tidak jelas bagi semua orang bahwa jika skrip js dapat dihasilkan oleh templat, maka SQL juga dimungkinkan. Karena itu, kami akan mengeluarkan permintaan dalam kasus terpisah.


Dan agar pembaca yang pilih-pilih tidak bosan, kami akan meninggalkan dalam artikel hanya beberapa contoh pertanyaan. Anda sendiri dapat mengetahui model dan templat mana yang lebih cocok di sini. Dalam contoh di github Anda dapat melihat apa yang saya lakukan.


 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; 

Templat (termasuk untuk SQL) dan contoh kode dapat ditemukan di github .

Source: https://habr.com/ru/post/id454418/


All Articles