Por um lado, o assunto era de fato quadrado. Por outro lado, era redondo. Mas no terceiro lado, com o qual o triângulo deveria estar, o objeto saiu curvado e oblíquo.
- Alyoshenka vai para a sala de reuniões? - Lenochkina preso na porta interessada.
- Alyoshenka não está participando da reunião. Aleshenka escreve um artigo.
- Sobre os cubos?
- Que outros cubos? - Baixei os olhos, nas mãos e a verdade era um cubo infeliz. Isso é uma bola. Isso é um losango.
- Não é sobre cubos! E não sobre bolas. Sobre modelos.
"Vou dizer isso a eles!" Padrão, ah. Helen já estava correndo pelo corredor.
"Sobre modelos. Mesmo cerca de três modelos diferentes." Mais precisamente, cerca de três razões para usar modelos no código do servidor. E nenhum desses motivos será sobre HTML.
Nos exemplos, usei a sintaxe do bigode , devido à sintaxe lacônica e à presença de implementações para tudo o que se move. O bigode praticamente não se liberta, ao contrário, por exemplo, do .Net Razor, que permite codificar dentro de um modelo, definindo assim um mau exemplo para desenvolvedores fracos.
Exemplos de código estarão em python. A implementação do Mustache for Python é chamada de pystache .
Então, três razões para deixar padrões entrar sua vida seu código
Artefatos de texto
Se você possui um sistema no qual existem alguns dados - por exemplo, dados em um banco de dados relacional ou dados obtidos por meio de chamadas de API, às vezes você precisa criar artefatos com base nesses dados.
O artefato pode ser, por exemplo, JSON ou arquivo de texto sem formatação, anexo, resposta HTTP. A principal coisa - um artefato é essencialmente o resultado da aplicação de uma função de uma parte relativamente compacta dos dados em seu sistema. E o artefato tem sua própria sintaxe.
O artefato pode ser um extrato bancário em formato de texto para upload no sistema legado. O artefato pode ser o descarregamento de uma verificação eletrônica na forma de um arquivo .json, que será enviado como anexo ao cliente por correio.
Em todos esses casos, você simplificará bastante sua vida usando modelos de artefato.
O que é um mecanismo de modelo? Esta é uma biblioteca que pega um modelo de objeto (contexto), pega um modelo, aplica um ao outro - e fornece o resultado. O modelo e o modelo do objeto são preparados pelo programador. O resultado final é preparado pelo mecanismo do modelo.
Exemplo: tente criar uma mensagem de texto sobre o pedido.
Primeiro, prepare o modelo de objeto:
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
O código é puramente falso. No código real, pode haver uma consulta ao banco de dados, algum tipo de lógica para calcular valores (por exemplo, calculamos o valor de total.amount com base nos itens do pedido).
Preste atenção em algumas coisas:
- Este NÃO é um modelo de objeto da ordem, é algo mais simples, preparado para uso no modelo. Os valores "sumRub" e "total.amount" no modelo de negócios real não devem ser textuais, o valor "vírgula" da matriz de linhas no modelo de objeto não pertence, é necessário apenas simplificar a renderização (o pystache não consegue entender por si mesmo que o item da lista é o último e depois disso não há necessidade de colocar uma vírgula.
- O tipo de campo "quantidade" é o texto e este texto está formatado para saída no modelo. Se o seu mecanismo de modelo suportar formatadores (algo como "... {someValue | asMoney}"), a formatação diretamente no modelo não será necessária.
- O texto no modelo deve parecer um pouco diferente para os clientes de Uryupinsk (o gerente subiu no último momento e pediu para adicionar - o negócio realmente perguntou, eles lançaram de repente uma campanha de marketing para a cidade). Portanto, adicionamos o valor booleano "posInUrupinsk" ao modelo e o usamos no modelo.
- É melhor não usar o modelo novamente a partir do modelo, exceto para renderizar outros modelos
O texto do modelo do bigode fica assim:
{{#posInUrupinsk}} ! 100 . {{/posInUrupinsk}} {{^posInUrupinsk}} : {{/posInUrupinsk}} {{#lines}} #{{no}} ... {{itemtext}}: {{sumRub}} {{#comma}};{{/comma}}{{^comma}}.{{/comma}} {{/lines}} : {{total.amount}} --------------------------- N : {{documentId}} {{checkDate}}
Vemos no modelo que o cabeçalho do documento para pedidos em Uryupinsk é diferente de outras cidades. Também vemos que no final da última linha com a posição da mercadoria há um ponto e em todas as posições iniciais há um ponto e vírgula. O atributo "vírgula" e o método "add_comma" no gerador de modelos são responsáveis por isso.
O código que aplica o contexto ao modelo é trivial:
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)
Resultado:
! 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
Outra dica: se a tarefa permitir, salve o próprio modelo com o modelo renderizado (por exemplo, no formato JSON). Isso ajudará na depuração e solução de problemas.
A impressora chiou três vezes, emitindo um novo modelo. O lado triangular era agora um triângulo perfeito. Os outros dois lados eram quadrados. A rede neural viveu sua própria vida e se recusou a fornecer um modelo de modelo primitivo em todos os aspectos.
"Vou dar um cubo para Helen." Eu pensei. Deixe-se alegrar.
Geração de código
Pode ser necessário criar JavaScript em tempo de execução a partir do back-end. Porque Para criar relatórios do lado do navegador, por exemplo. Ou obtenha um script em F # dentro de um programa Go. Ou o código Kotlin do ReactJS (não consigo imaginar por que isso pode ser necessário, mas de repente você tem inclinações específicas).
No caso da geração de código, é melhor primeiro escrever com as mãos o código resultante (o que queremos gerar) e somente depois dividi-lo em um modelo e modelo. Essa abordagem nos salvará saudade complexidade excessiva do modelo. Nunca é tarde para complicar um modelo, mas é melhor começar com um modelo simples.
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"));
Aqui vemos que temos de um a N gráficos de linhas na página, cada um com sua própria fonte de dados, título e lista de indicadores. 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"}, ] } ] }
Bem, o modelo:
{{#charts}} var report = CreateChart({ title: "{{title}}" }, type: "lineChart", sourceUrl: "{{sourceUrl}}" ); {{#series}} report.addLine({ dataIndex:{{dataIndex}}, title: "{{title}}", color: "{{color}}" }); {{/series}} report.render($("{{divId}}")); {{/charts}}
Observe: essa abordagem "frontal" à padronização requer um esforço separado para rastrear valores no modelo. se uma vírgula ou aspas “Hello Kitty \” ”aparecer na série [0] .title, a sintaxe do arquivo resultante será desfeita. Portanto, escreva as funções de triagem e use-as ao criar modelos. Use formatadores se o mecanismo de modelo puder fazer isso.
O terceiro dado voou pela porta e bateu com uma batida. Também não é bom. Interessante. mas você pode rolar o cubo para que ele deslize por baixo da porta e atinja o fim do corredor? É possível imprimir borracha em 3D? Ou é melhor deixá-lo cheio de pequenos icosaedros cheios de ar? ...
Consultas SQL
O leitor exigente dirá que isso também é geração de código, tradução de conceitos de uma linguagem de programação para outra. Ao qual responderemos ao exigente leitor que trabalhar com SQL ou com qualquer outra linguagem de consulta de banco de dados é uma área de programação ligeiramente separada e não é óbvio para todos que, se os scripts js puderem ser gerados por modelos, o SQL também será possível. Portanto, emitiremos solicitações em um caso separado.
E para que o leitor exigente não fique entediado, deixamos no artigo apenas exemplos de algumas consultas. Você mesmo pode descobrir qual modelo e qual modelo é mais adequado aqui. Nos exemplos no github, você pode ver o que eu fiz.
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;
Modelos (inclusive para SQL) e exemplos de código podem ser encontrados no github .