"Posso comecar minha proxima customizacao em TLPP?" e a pergunta que todo dev novato faz na consultoria. A resposta nao e "sempre" nem "nunca" — e "depende", com criterios objetivos. Esse artigo entrega esses criterios.
Historico em 30 segundos
TLPP (TOTVS Language for Protheus Platform) nao substitui AdvPL. Roda no mesmo runtime. Coexiste no mesmo RPO. Voce pode chamar funcao TLPP de codigo AdvPL e vice-versa.
Comparacao tecnica detalhada
| Caracteristica | AdvPL classico | TLPP |
|---|---|---|
| Namespaces | Nao tem (prefixos por convencao) | Sim, hierarquicos |
| Tipagem | Dinamica (opcional) | Forte e explicita |
| Tamanho de identificador | 10 chars | Ilimitado |
| OO | Class basica | Class + interface + heranca multipla |
| Modulos | Tudo global | Modular por namespace |
| Stack trace | Limitado | Completo com line numbers |
| Rest annotations | Manual | Decorators @Get @Post |
| Compatibilidade SmartClient | 100% | 100% (gera mesmo bytecode) |
| Suporte oficial novo | Manutencao | Foco da TOTVS daqui pra frente |
| Curva de aprendizado time AdvPL | — | ~2-4 semanas |
3 cenarios onde AINDA usar AdvPL classico
- Manutencao de codigo legado: 200k linhas de AdvPL no cliente, ninguem vai reescrever do zero. Mantenha em AdvPL e isole modulos novos em TLPP.
- Customizacao de relatorios antigos (RDMAKE/Report): muitas APIs especificas ainda exigem AdvPL puro.
- Equipe sem tempo de treinar agora: melhor codigo AdvPL bem escrito do que codigo TLPP ruim. Programe a transicao pra Q3/Q4.
5 cenarios onde MIGRAR pra TLPP
- Customizacao nova grande (>500 LOC): namespaces poupam horas em conflito de nomes.
- API REST nova: decorators TLPP
@Get/@Postreduzem boilerplate em ~60%. - Integracao com sistema externo: tipagem forte previne bug de "cString virou cNumber".
- Time grande (3+ devs): namespaces evitam que 2 pessoas criem
U_FAT_001diferentes. - Codigo critico (fiscal, financeiro): stack trace completo + tipagem reduz incidentes em producao.
Migracao gradual: namespaces e interop
Voce nao precisa migrar tudo. O segredo: arquivo .tlpp coexiste com .prw no mesmo RPO. TLPP chama AdvPL como funcao normal:
// arquivo: src/archtec/fiscal/CalculadoraIBS.tlpp
namespace archtec.fiscal
#include "tlpp-core.th"
@type class
class CalculadoraIBS
private data nAliquota as numeric
public method new(nAliq as numeric) as CalculadoraIBS
::nAliquota := nAliq
return self
public method calcular(nValor as numeric) as numeric
local nResultado as numeric
// Pode chamar funcao AdvPL classica daqui:
nResultado := nValor * (::nAliquota / 100)
nResultado := U_AjustarArredondamento(nResultado) // funcao AdvPL legacy
return nResultado
endclass
E o AdvPL classico chama TLPP via namespace explicito:
// arquivo legado: src/legacy/MATA001.prw
#include "totvs.ch"
User Function ProcessaPedido(cNumPed)
Local oCalc
Local nIBS
// Instancia classe TLPP a partir do AdvPL
oCalc := archtec.fiscal.CalculadoraIBS():New(8.6)
nIBS := oCalc:calcular(1000)
// continua codigo legacy normal
Return Nil
Benchmarks reais (loops + REST + DB)
Mesma logica em AdvPL puro vs TLPP, com Protheus 12.1.2410 + DBAccess homologado:
| Cenario | AdvPL classico | TLPP | Delta |
|---|---|---|---|
| Loop 100k iteracoes (calculo simples) | 1.42s | 1.45s | +2% (irrelevante) |
| Insert em loop 10k (mesmo codigo) | 5.8s | 5.9s | +1.7% |
| API REST endpoint /pedido | 180ms | 175ms | -3% |
| Parsing JSON com 50 campos | 22ms | 14ms | -36% |
| Compile time (10k linhas) | 4.2s | 5.8s | +38% |
Conclusao do benchmark Em runtime, TLPP esta empatado ou ligeiramente mais rapido (parsing JSON e endpoints REST). O custo esta no compile time — irrelevante em pipeline de CI, importante em desenvolvimento local. Dev produtivo em TLPP usa hot-reload da TOTVS.
Erros tipicos de quem migra rapido demais
Erro 1 Reescrever modulo inteiro de uma vez. Resultado: 2 meses sem entrega + bug em producao. Faca por feature, nao por modulo.
Erro 2 Importar tudo do AdvPL pro TLPP literalmente. TLPP tem padroes melhores (composition over inheritance). Aproveite a refatoracao.
Erro 3 Ignorar tipagem ("e dinamica mesmo, nao precisa"). O ganho do TLPP e justamente a tipagem. Se voce escreve any em tudo, esta no AdvPL com mais boilerplate.
Erro 4 Build sem TLPP-lint. Codigo TLPP sem linter regride pra qualidade de AdvPL classico.
Receita para a equipe: stack de qualidade
- VSCode + extensao oficial TLPP (autocomplete + hot reload)
- tlpp-lint com regras estritas no projeto
- Git Flow ou GitHub Flow + protecao de branch main (sem commit direto)
- CI/CD (veja nosso artigo de pipeline)
- Code review obrigatorio em PRs maiores que 20 linhas
- TIR com cobertura minima de 70% em codigo novo
- Documentacao em Markdown dentro do repositorio (nao em Confluence)
Roadmap recomendado pra 2026-2027
| Fase | Periodo | Acao |
|---|---|---|
| 1. Pilot | 1 mes | 1 dev escreve 1 modulo novo em TLPP. Validar ferramentas. |
| 2. Treinamento | 2 meses | Time inteiro em curso TLPP + lint configurado |
| 3. Padroes | 1 mes | Documentar convencoes (namespace, classe, teste) |
| 4. Producao | continuo | Codigo novo sempre em TLPP. Legacy AdvPL so se mexer. |
| 5. Migracao oportunista | 2-3 anos | Cada vez que tocar codigo legado, migra modulo. |
Em 24 meses voce tem ~70% do projeto em TLPP sem nenhum freeze de feature. Os outros 30% (codigo morto/raramente tocado) seguem AdvPL e nao incomodam ninguem.
Fale conosco se quer ajuda pra montar a stack TLPP da sua equipe.
Sua empresa esta preparada?
Nossa consultoria especializada em TOTVS Protheus pode acelerar sua adequacao.
Falar com Especialista
Comentarios 0