Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Olá dev, te convidamos através dessa leitura a dar os primeiros passos em TLPP em sua jornada profissional.

Antes de começar temos que dar uma opinião muito importante. Não é preciso migrar as suas rotinas já desenvolvidas em ADVPL para TLPP sem o menor critério, pois o TLPP foi criado para facilitar a vida do desenvolvedor e portanto não há nenhuma exigência técnica para que essa migração seja feita e sobrecarregue as equipes de desenvolvimento. Logo pode-se adotar a seguinte estratégia:

1 - Implemente as novas rotinas em TLPP;

2 - Migre inicialmente algum trecho de antigos programas que necessitem dos recursos do TLPP;

3 - E caso haja o interesse, vá migrando aos poucos as demais rotinas, sem pressa e sem atropelo.

Bom, dito isso, seguimos.

Considerando que você já desenvolva em ADVPL e tenha um ambiente de desenvolvimento com VSCode configurado, a primeira coisa a se fazer é obter os arquivos de includes do TLPP e tlppCore, e para isso, recomendamos que siga os passos descritos em: Ambiente de compilação do TLPP.

Nota: Sempre que atualizar o binário ou o tlpp.rpo essa etapa precisar ser refeita.

Após a extração dos includes, devemos copiá-los para o diretório já configurado no VSCode, ou adicionar a pasta onde estão os includes do TLPP e tlppCore na configuração mencionada. Escolha com sabedoria caro padawan.

Agora já podemos iniciar nosso primeiro programa em TLPP e como todo início criaremos o bom e velho "Olá Mundo" ou "Hello World".

Então começamos com a primeira diferença, pois para acessar os recursos da linguagem é preciso utilizar a extensão [tlpp], portanto pelo VSCode iremos criar um arquivo de nome "olaMundo.tlpp".

Já de largada utilizaremos dois recursos úteis em TLPP:

Portanto, implementaremos da seguinte maneira:

namespace meu.exemplo

user function Ola_Mundo_em_TLPP()
  conout( "Olá Mundo!", "meu primeiro programa em TLPP" )
return

Podemos testar essa função diretamente pela execução Crtl+F5 do VSCode, informando a função:

meu.exemplo.U_Ola_Mundo_em_TLPP

Ou então, podemos chamar por um programa:

meu.exemplo.U_Ola_Mundo_em_TLPP()

Mas e programar orientado à objetos? TLPP ajuda?

Sim, ajuda e muito, falaremos agora de Class V2.

Class V2

Avançando em recursos chegamos ao desenvolvimento orientado a objetos, e é aqui que temos um ganho grande de recursos para esse tema e portanto, recomendamos que faça a leitura da documentação sobre Classes em TLPP em [CLASS V2], pois aqui iremos abordar somente os detalhes importantes para que você não tropece nas pequenas pedras.

Para acessar todos os recursos corretamente você deverá importar a biblioteca do TLPP, assim:

#include "tlpp-object.th"

Também é possível importando indiretamente, pois em seu fonte você pode importar a biblioteca do tlppCore, assim:

#include "tlpp-core.th"

Nesse caso, lembre-se que estará importando indiretamente não somente a biblioteca de objetos, mas também outras bibliotecas do tlppCore, como por exemplo o REST. Portanto somente utilize esse modo caso você também tenha interesse nas demais bibliotecas.

Importante!

A importação do include mencionado acima deve vir antes das importações em CH, seja ela a msobject.ch ou as generalistas totvs.ch ou protheus.ch.

Migrando ".prw" para ".tlpp"

A essa altura você deve estar se perguntando se é possível apenas renomear um código-fonte em .prw para .tlpp e apenas recompilar, certo?

Bom, é possível? É sim, bem plausível!

Mas, é 100% garantido que apenas renomeando eu não tenha problemas? Infelizmente não podemos garantir quem em 100% dos casos isso funcionará, pois existem alguns pontos de atenção que deve-se levar em consideração ao optar por esse caminho, são eles:

Tipagem

Embora AdvPL não tenha tipagem, muitos fontes foram escritos "tipando" variáveis com nomes de tipos de dados que foram implementadas na tipagem do TLPP com nome diferente.

Existirão muitos casos como as string , como também as boolean e outros. Porém esses tipos de dados não existem em TLPP e caso você tente compilar essas instruções como TLPP você terá erros de compilação.

Somente para não deixar no ar a dúvida, os tipos mencionados acima deveriam ser as character para as strings e as logical para os booleanos.

Portanto, antes de renomear seu fonte para ".tlpp", revise a tipagem já feita em seu código para que siga corretamente os tipos nativos do TLPP conforme documentado em: Tipos Nativos

Nomes longos

Um ponto que parece inofensivo são os nomes de funções, classes e métodos pois em AdvPL existe uma limitação para os nomes de 10 caracteres.

Em teoria isso não deveria ser um problema, pois você estará aumentando essa capacidade utilizando TLPP para 255 caracteres, porém existem casos em AdvPL que o desenvolvedor possui um falso positivo.

Como assim?

Irei explicar melhor:

Imagine que em seu fonte em AdvPL você tenha criado uma função conforme abaixo:

function myFunction001()
  /* code */
return

Note que o nome da função tem 13 caracteres, o que não gera erro de compilação, porém ao compilar como AdvPL o nome registrado no repositório de funções será de apenas 10 caracteres, ou seja: myFunction().

Agora as demais implementações por não conhecerem o fonte original e apenas conhecerem a assinatura que "funciona", fazem a chamada "corretamente" como myFunction(). E digo corretamente entre aspas porque só é correto porque você utiliza o AdvPL.

Por algum motivo, esse caso acima não é raro no meio de desenvolvedores AdvPL.

Bom, se o fonte original for migrado para ".tlpp", ao compilar a função será registrada com os 13 characteres, ou seja: myFunction001()

Porém, agora os demais fontes não farão mais a chamada "correta", pois podemos ter dois cenários:

  • Se os repositórios não forem trocados, a antiga função ainda existirá mas será uma versão obsoleta de seu fonte e caso você implemente lógicas novas elas simplesmente não serão acionadas pois os demais fontes ainda fazem a chamada ao myFunction() e não ao myFunction001(). Esse cenário é bem difícil de descobrir e muito provavelmente você decidirá reconstruir os repositórios desde o início e com isso ocorrerá o próximo cenário.

  • Os repositórios foram trocados por novos e reconstruídos com seu fontes, nesse caso a antiga função não existirá mais e você obterá "Cannot find function" em tempo de execução de suas rotinas. Agora você terá que modificar todas as chamadas que se referiam à myFunction() e passar a se referir à myFunction001(), solucionando seu problema.

Portanto caro colega, sugiro revisar os nomes das funções primeiro antes de efetuar a migração da extensão.

Outra boa prática é obter RPO novo no portal e recompilar todos os seus fontes para que tenham somente as novas versões de seus programas.

MVC

Se o seu fonte em AdvPL utilizar MVC (Model View Controller), infelizmente esse fonte não poderá ser convertido por enquanto em TLPP, pois o MVC utiliza o recurso de Static Call na qual foi bloqueado em TLPP, pois uma função Static somente poderá ser executada através de uma função ou método que esteja no mesmo código-fonte.

Nesse caso, fique de olho nos Release Notes do Protheus para verificar se já compatibilizaram o MVC para fontes TLPP.

Enfim, seus primeiros passos já podem ser dados sem maiores medos e estaremos aqui para auxiliá-los nessa caminhada.

Contem conosco e desejamos que aproveite o TLPP!

...