O recurso de namespace foi liberado na versão 17.3.0.0 para a linguagem TLPP e tem como benefício a melhor organização do código.
Observações
- O nome do namespace pode ser um nome simples ou um nome que contenha "." como separador
- Importante ressaltar que todo nome de namespace iniciado com "tlpp." está reservado ao tlppCore. Desse modo, qualquer tentativa de uso fora desse domínio, será bloqueada em tempo de compilação.
- Uma vez utilizado o recurso namespace no 'main' da sua aplicação, é necessário que o explicite utilizando o separador "."
Exemplo: -p myNamespace.InitialFunction em vez de -p InitialFunction
Os namespaces iniciados por: "tlpp" e ou "core", são reservados para funções específicas da linguagem, sendo vetados para uso fora do ambiente da TOTVS ou para funções de usuário !
Classes em TLPP que herdam de classe com namespace precisam utilizar o namespace na declaração da classe ou utilizar o namespace no programa que executa a chamada da classe.
Funções dentro de namespace:
Exemplo:
namespace exemplo main function testeNamespace conout("testeNamespace") testeNamespace2() //a função testeNamespace2 poderá ser chamada sem explicitar o namespace nem utilizar using porque estão no mesmo fonte return function testeNamespace2 conout("testeNamespace2") return
Para chamar uma função que está declarada dentro de um namespace de um outro fonte é necessário que o explicite, o separador utilizado para isso é o "." conforme exemplo a seguir:
user function exemplo2 exemplo.testeNamespace2() return
Outra opção para chamar uma função que está declarada dentro de um namespace é utilizar a instrução "using namespace" conforme o exemplo a seguir:
using namespace exemplo user function exemplo3 testeNamespace2() //nesse caso como não há uma função com esse nome neste fonte, ele irá executar a função que está no fonte exemplo1.tlpp porque o namespace exemplo está definido. return
Classes dentro de namespace:
Exemplo:
#include "protheus.ch" namespace exemplo2.1 class ClassWithNamespace method new() data dataI endclass method new() class ClassWithNamespace conout("construtor do ClassWithNamespace no namespace exemplo2") return self main function exemplo4() local obj := exemplo2.1.ClassWithNamespace():new() //nesse caso está explícito o namespace e o objeto será criado da classe ClassWithNamespace que está no namespace exemplo2 local obj2 := exemplo.ClassWithNamespace():new() //nesse caso está explícito o namespace e o objeto será criado da classe ClassWithNamespace que está no namespace exemplo local obj3 := ClassWithNamespace():new() //nesse caso não está explícito, mas há uma classe com esse nome definido nesse fonte, estão essa será utilizada. return
Para utilizar uma classe que está declarada dentro de um namespace de um outro fonte é necessário que o explicite, o separador utilizado para isso é o "." conforme exemplo a seguir:
user function exemplo5() Local o1 := exemplo2.1.ClassWithNamespace():New() Return
Outra opção para utilizar uma classe que está declarada dentro de um namespace de um outro fonte é utilizar a instrução "using namespace" conforme o exemplo a seguir:
using namespace exemplo2.1 user function exemplo6() Local o1 := ClassWithNamespace():New() Return