Arquivo de tag programacao

porPaulo Henrique Corrêa Cardoso

Programação Orientada a Objetos – ADVPL

Olá pessoal, tudo bem ?

Hoje vou falar um pouco sobre o programação orientada a objetos (POO) dentro da linguagem ADVPL.

O ADVPL é uma linguagem baseada no Clipper, sendo assim, uma linguagem estruturada.

Com a evolução das linguagens, a TOTVS buscou aprimorar sua linguagem, e com o passar do tempo, e trouxe a orientação a objetos para dentro do ADVPL.

Então, como todas as linguagens POO, ela possui Classes, Propriedades, Métodos, Herança, Encapsulamento, Polimorfismo e Abstração.

Vou explicar um pouco de cada parte do conceito de POO na linguagem ADVPL.

Primeiramente vamos começar com a definição da classe.

#INCLUDE 'TOTVS.CH'
/*/-----------------------------------------------------------
{Protheus.doc} ExemploClass
Classe de exemplo ADVPL

Uso: Geral

@author Paulo Henrique Corrêa Cardoso.
@since 27/07/2020
@version 1.0
-----------------------------------------------------------/*/
CLASS ExemploClass From LongClassName
  
  // Defina os parâmetros que sua classe deverá possuir
  Data cPropStr
  Data nPropNum
  Data dPropData
  Data oPropObj
  Data aPropArray
  Data lActive
  
  METHOD New() CONSTRUCTOR
  METHOD Activate()
  METHOD Deactivate()
  METHOD Executar()
  // Demais métodos pertinentes a sua classe 
  
ENDCLASS

Nesta primeira primeira parte de definição da classe vamos colocar o nome da classe logo após a palavra reservada CLASS e o nome da classe pai que nossa classe vai herdar após a palavra reservada From.

Como não estamos herdando essa classe de nenhuma classe especifica vamos herdar a classe LongClassName que permite a utilização de nomes longos.

Logo abaixo começamos a definir as propriedades da classe, utilizando a palavra reservada Data, seguido do nome da propriedade.

Logo abaixo vamos definir as assinaturas dos métodos existentes em nossa classe. Repare que definimos um método New que será o construtor da nossa classe, utilizando a palavra reservada CONSTRUCTOR.

E por fim, encerramos a definição da classe utilizando a palavra reservada ENDCLASS.

Com nossa classe definida, começamos a realizar a construção de nossos métodos dentro da classe.

Primeiramente vamos definir o método construtor e  entender sua importância.

/*/-----------------------------------------------------------
{Protheus.doc} New()
Construtor da classe

Uso: ExemploClass

@sample
//ExemploClass():New()

@author Paulo Henrique Corrêa Cardoso.
@since 27/07/2020
@version 1.0
-----------------------------------------------------------/*/
METHOD New() CLASS ExemploClass

  ::cPropStr      := " "
  ::nPropNum      := 0
  ::dPropData     := Date()
  Self:oPropObj   := NIL
  Self:aPropArray := {}
  Self:lActive    := .F.

Return Self

O método New, é importante para a iniciação base das propriedades da classe, ou seja seus valores default, desta forma vamos garantir a integridade do funcionamento da classe.

Também podemos definir a obrigatoriedade do preenchimento dos parâmetros da classe, obrigando a passagem deles por parâmetro do método. Isso deve ser feito da mesma forma que é feito em uma função comum do ADVPL.

Muito importante que o retorno deste método seja a palavra reservada Self, que representa o objeto da instância da nossa classe.

Ou seja nosso método New tem a função de criar a instância em que iremos trabalhar, possibilitando a utilização de todos os métodos e propriedades existentes em nossa classe.

Note que para manipularmos ou acessarmos propriedades de dentro de nossa classe podemos utilizar a palavra reservada Self ou ::, as duas formas indicam que estamos acessando propriedades ou métodos de nossa classe corrente. Isso só pode ser utilizado dentro do escopo da classe, ou seja, dentro dos métodos da mesma.

 

Outros métodos importantes de utilizamos são os métodos Activate e o Deactivate.

Com o método Activate podemos definir que nossa classe esta pronta para executar determinados métodos e realizar uma pré-validação de suas execução.

E o método Deactivate é importante para realizarmos a destruição dos objetos e informações correntes, já que o ADVPL não destrói essas informações automáticamente, deixando as mesmas em memória até a finalização da thread corrente.

Vamos defini-los :

/*/-----------------------------------------------------------
{Protheus.doc} Activate()
Ativa a classe

Uso: ExemploClass

@sample
//ExemploClass():Activate()

@author Paulo Henrique Corrêa Cardoso.
@since 27/07/2020
@version 1.0
-----------------------------------------------------------/*/
METHOD Activate() CLASS ExemploClass
  
  If !Empty(::cPropStr) .AND. ::nPropNum > 0
    ::lActive := .T.
  EndIf
Return ::lActive

/*/-----------------------------------------------------------
{Protheus.doc} Deactivate()
Desativa a classe

Uso: ExemploClass

@sample
//ExemploClass():Deactivate()

@author Paulo Henrique Corrêa Cardoso.
@since 27/07/2020
@version 1.0
-----------------------------------------------------------/*/
METHOD Deactivate() CLASS ExemploClass
    
    If ::oPropObj <> NIL 
        ::oPropObj:DeActivate()  
        FreeObj(::oPropObj)
        ::oPropObj := Nil	
    EndIf
    
    ::lActive := .F.
Return

 

Vamos agora criar um exemplo de métodos de execução:

/*/-----------------------------------------------------------
{Protheus.doc} Executar()
Método exemplo de execução na classe.

Uso: ExemploClass

@sample
//ExemploClass():Executar()

@author Paulo Henrique Corrêa Cardoso.
@since 27/07/2020
@version 1.0
-----------------------------------------------------------/*/
METHOD Executar() CLASS ExemploClass
  Local cRet := ""
    
  If ::lActive 
     If ::nPropNum > 10 
       cRet := "Data de Execução do método - " + DTOS(dPropData) + "Texto: "+ ::cPropStr
     Else
       cRet := " Propriedade numerica é menor ou igual a 10 "
     EndIf
  Else
    cRet := "A Classe não está ativa"
  EndIf
    
Return cRet

 

No exemplo a seguir vamos aprender a instanciar e executar métodos da classe.

/*/-----------------------------------------------------------
{Protheus.doc} ExecClas()
Utilizando classe de Exemplo 

Uso: ExemploClass

@sample
//U_ExecClas()

@author Paulo Henrique Corrêa Cardoso.
@since 27/07/2020
@version 1.0
-----------------------------------------------------------/*/
User Function ExecClas()
  Local oObjClass  := NIL
  Local cTextoRet  := ""
  
   // Cria instancia da classe 
   oObjClass := ExemploClass():New() 
   
   // Preenche propriedades 
   oObjClass:cPropStr := "Teste 1"
   oObjClass:nPropNum := 20
   
   // Ativa a classe
   oObjClass:Activate()
   
   // Executa métodos
   cTextoRet := oObjClass:Executar() 
   Conout(cTextoRet)
   
   // Desativa e destroi a classe
   oObjClass:Deactivate()
   FreeObj(oObjClass)
   oObjClass := NIL
    
Return

Com essas estruturas podemos definir os métodos que quisermos e compartilhar as propriedades existentes na classe, entre eles.

Tenho certeza que com a utilização da orientação a objetos você vai economizar e reutilizar muitos códigos em seus futuros desenvolvimentos.

 

Espero que gostem…

 

Até a próxima!!!

 

porPaulo Henrique Corrêa Cardoso

Lógica de programação, um conhecimento para a vida.

Vejo muitas pessoas que estão tentando começar trabalhar na área de análise e desenvolvimento de software, sempre com muita dificuldade em escolher a melhor linguagem de programação, ou fazendo diversos cursos de desenvolvimento, mas nunca consegue evoluir na carreira.

Se você acredita que um curso de programação, ou as vezes até mesmo a faculdade de tecnologia vai te ensinar a programar, sinto dizer que será uma decepção… Decepção que vi nos olhos de diversos colegas que fizeram faculdade comigo.

Antes de mais nada, quero te dizer que o principal conhecimento da área de programação não é a linguagem de programação que você vai utilizar…
A principal skill dessa louca profissão é uma palavrinha de 6 letras…”Lógica”.

A lógica é a base pra qualquer linguagem de programação, não importa qual seja, se você tiver o seu raciocínio lógico aguçado, você será capaz de desenvolver em qualquer linguagem de programação.

Muito além disso, a lógica aguçada vai te ajudar em todas as áreas cognitivas da sua vida.

Na minha época de faculdade, vi diversos professores tentando introduzir a programação na cabeça dos alunos, com uma linguagem chamada Portugol, que nada mais é que uma linguagem de programação em português.

Só que muitos desses alunos não conseguiam pensar de forma estruturado o suficiente para conseguirem escrever uma condições básicas para efetuar as tarefas solicitadas. Isso tudo porque faltava o principal para o desenvolvimento, que é a lógica.

O melhor caminho pra aprender a lógica computacional, no meu ponto de vista, é quebrar ao máximo uma tarefa em pequenas sub-tarefas, de forma muito detalhada e bem compreensível.

Vou usar um exemplo bem simples que tive em minhas aulas de lógica na minha época de meu curso técnico.

Como trocar um pneu de um carro.

Você esta em uma estrada e sente o que o pneu do seu veículo furou, o que fazer?

1 – Ligue a seta para encostar na via.

2 – Vire a direção, sentido ao local que você quer estacionar, de uma forma suave.

3 – Vá parando o veículo aos poucos.

4 – Quando o veículo estiver totalmente parado, puxe o freio de mão.

5 – Desligue o veículo.

6 – Saia do veículo e abra o porta-malas.

7 – Retire o triângulo de sinalização e as ferramentas do porta-malas.

8 – Posicione o triângulo de sinalização na pista, com uma boa distância do veículo.

9 – Volte até o veículo, pegue a chave de rodas e solte um parafuso de cada vez do pneu furado.

10 – Posicione o macaco no local correto para retirar o pneu…

Acho que já deu pra você ter ideia de como é, não é mesmo?
Um bom exercício para você que está começando a estudar lógica, é completar esse exemplo da forma mais detalhada possível.

Viu só, a ideia desse exercício é demonstrar cada passo, de forma estruturada.

Temos que imaginar que um computador interpreta exatamente cada comando que passamos de forma literal e não de forma abstrata.

Após fixarmos a ideia de sempre deixar as informações o mais detalhadas possíveis, começamos a empregar o conceitos de decisões.

Se e Senão

Uma das bases da lógica é o conceito de decisão. Esse conceito temos que utilizar pra tudo em nossa vida pois o mesmo nos fará pensar o que vai acontecer, cada caminho que vamos seguir e prever as possíveis situações.

Uma técnica muito boa para visualizarmos esse conceito é a utilização de fluxogramas.

Os fluxogramas, são representações de processos, através de gráficos esquemáticos, onde cada símbolo tem uma função.

Neste exemplo podemos ver a tomada de decisão para uma lâmpada que parou de funcionar.

Muito importante !!!

Antes de começarmos a desenvolver a lógica de qualquer coisa que queremos passar para um programa, ou até mesmo para algum processo que desejamos criar pra qualquer área da vida, é imprescindível entender o problema, todas as suas variáveis e condições de falha e sucesso.

Quando estiver com esse raciocino lógico bem fixado na sua cabeça, você vai perceber que a linguagem de programação vai entrar muito mais fácil no seu dia a dia!

A complexidade da lógica em um vídeo. (Para rir um pouco…)

Espero que esse conteúdo te ajude!!!
E lembre-se, a lógica antes da linguagem…
A lógica é tudo !!!

Até a próxima !!!