Anda di halaman 1dari 101

Autor: Fbio Pagoti

Instrutor: Fbio Pagoti

Orientao a Objetos em ABAP


Cpia de Marcos

Sumrio
1 Prefcio
2 Memria eidtica: O mundo procedural
2.1 Definio dos dados
2.2 Definio da lgica
2.3 Refletindo sobre as definies no mundo procedural
2.3.1 Diviso de responsabilidades
2.3.2 Reaproveitamento de cdigo
2.3.3 Testes Unitrios
2.3.4 Encapsulamento
2.3.5 Falsos mitos sobre as vantagens de OO
2.4 O TOP Include do Grupo de Funo
3 Conceitos bsicos
3.1 Classes
3.2 Referncias
3.3 Objetos (ou instncias)
3.4 O processo de construo e destruo de um objeto
3.4.1 Criao de objetos
3.4.2 Destruio de Objetos e o Garbage Collector
3.4.3 Tabela interna de referncias
3.4.4 LIKE REF TO
3.5 Atributos
3.6 Mtodos
4 Conceitos intermedirios
4.1 Construtores
4.1.1 Construtor de Instncia
4.1.2 Construtor esttico (ou de classe)
4.2 Autoreferncia me
4.3 Sesses de visibilidade
4.3.1 PUBLIC SECTION
4.3.2 PRIVATE SECTION
4.4 Atributos e Mtodos de Instncia vs Estticos

Orientao a Objetos em ABAP


Cpia de Marcos

4.4.1 Atributos de instncia


4.4.2 Atributos estticos
4.4.3 Mtodos de instncia
4.4.4 Mtodos estticos
4.5 Herana
4.5.1 Sesso protegida
4.6 Eventos
4.7 Classes de exceo
4.8 Interfaces
5 Conceitos Avanados
5.1 Abstrao
5.1.1 Classes abstratas
5.1.2 Mtodos abstratos
5.2 Final
5.2.1 Classes Final
5.2.2 Mtodos Final
5.3 Gerao de Instncia
6 Concluso

Orientao a Objetos em ABAP


Cpia de Marcos

1 Prefcio
Este livro foi criado no ano de 2016 para tentar solucionar um problema
que deveria na opinio do autor ter sido resolvido por volta de uma
dcada antes: o problema de ainda haver desenvolvedores ABAP sem o
conhecimento necessrio em orientao a objetos para exercer com
sucesso suas atividades no diaadia.
Adquirir tal conhecimento talvez tenha sido opcional ou mais do que o
suficiente em certa poca, mas se voc est lendo este prefcio deve
compartilhar da minha opinio que este tempo j passou.
Claro que h muitos desenvolvedores ABAP que alegam no precisar de
orientao objetos para realizarem seus trabalhos. Eles provavelmente
sempre implementaram BAdIs sem ter total convico do que estavam
fazendo e acabaram tratando problemas que a orientao a objetos
elementar resolve de maneira simples usando artifcios quase
indecifrveis em termos de lgica. Quem diz isso algum que j viu os
comandos EXPORT e IMPORT sendo usados para transferir dados do
mesmo objeto simplemente por estarem em diferentes mtodos.
Mas mesmo que tal pessoa nunca tenha tido dificuldades para
implementar BAdIs, ser que esta pessoa recebe outros tipos de
demanda das 8 as 5? Ser que ela alocada em projetos que envolvem
coisas diferentes ou modernas e at mesmo obrigatrias para quem quer
se considerar um desenvolvedor ABAP srio?
A ideia deste livro de no esgotar os exemplos. Falo de demandas e
projetos que envolvem Enhancements Framework, Workflow, PI, Web
Dynpro, FPM, SAP Gateway (necessrio ou no por conta do Fiori), BOPF,
CRM, BRF+, HANA, etc. Certamente Orientao a Objetos (ou

Orientao a Objetos em ABAP


Cpia de Marcos

simplesmente OO) um conhecimento que vai muito alm de um mero


ALV que responde a um duplo clique.
A quem diga que o ABAP no orientado a objetos pois no tem todos os
recursos que o Java tem. Se encontrar algum na rua que lhe diga tal
blasfmia (palavra mais prxima do que o autor gostaria de dizer
encontrada) diga a ela que Java no implementa todos os recursos de
orientao a objetos do SmallTalk, que foi criado em 1969. Encerre a
conversa neste ponto para no perder o amigo.
Independente de como os ABAPers enxergam o ABAP, este conhecimento
de vital importncia a voc meu caro amigo. Claro, caso voc queira
continuar sua jornada como ABAP.
Caso voc queira continuar sua jornada como ABAP, continue na prxima
pgina.

Orientao a Objetos em ABAP


Cpia de Marcos

2 Memria eidtica: O mundo


procedural
Para entender o que um objeto, preciso entender bem como funciona
a alocao de memria em um programa ABAP e para comear neste
assunto vamos direto ao ponto que o desenvolvedor ABAP se sente em
casa: no mundo procedural.
Entenda por mundo procedural qualquer programa ABAP baseado em
rotinas locais (FORM) ou globais (mdulos de funo).
Independente do tipo de programa, seja um executvel (tambm
conhecido como report), um module pool (vulgarmente conhecido como
online) ou at mesmo um smartform, algumas caractersticas so comuns
no mundo procedural.

2.1 Definio dos dados


Tais programas reservam um ou mais trechos de cdigo para a declarao
de tipos, constantes e variveis, usadas extensivamente ou em certos
pontos da aplicao como um todo. Desenvolvedores ABAP conhecem tais
techos como TOP Include ou Include TOP ou simplesmente reservam tal
espeo no cabealho do programa.
Obviamente tais tipos e variveis podem e devem ser declarados
localmente dentro de rotinas e funes quando usados em pequenos
trechos.
Contudo, ainda existe tal espao reservado para declaraes gerais e
consequentemente para fins diversos.

Orientao a Objetos em ABAP


Cpia de Marcos

Exemplo: Um programa executvel que possui:


Uma tela de seleo (criada com PARAMETERS e SELECTOPTIONS
que so representados por variveis simples e tabelas internas
respectivamente)
Alguma lgica de seleo de dados (com work areas e tabelas
internas usadas como destino e auxlio de comandos SELECT e
chamadas de funes que as populam)
Certa representao do resultado final (via arquivo, ALV, WRITE,
resultado de um batch input seja como for isso tambm envolve a
declarao de tipos e variveis).
Para organizar sua obra o desenvolvedor ABAP cuidadoso incluir
comentrios ilustrativos quando a responsabilidade de um conjunto de
tipos e variveis. Por exemplo, para indicar que algumas tabelas internas
so usadas para a realizao de um batch input ou para a sada em forma
de ALV.

2.2 Definio da lgica


Sabendo onde os dados so criados, vamos refletir como a lgica de uma
aplicao procedural criada.
Tipicamente encontramos um conjunto encadeado de rotinas e funes
separadas por partes, uma aps a outra. Seja vrias chamadas em
sequncia dentro do mesmo bloco, seja um AT SELECTIONSCREEN antes
de um STARTOFSELECTION ou at mesmo um PROCESS BEFORE OUTPUT
(PBO) antes de um PROCESS AFTER INPUT (PAI).
Pensando em boas prticas, cada rotina e funo recebe como forma de
parmetros somente o que usar para fazer o que deve ser feito nem
mais, nem menos.

Orientao a Objetos em ABAP


Cpia de Marcos

Esta boa prtica permite que deixemos o cdigo mais legvel, adaptvel e
reutilizvel.
Legvel pois fica fcil saber o que a funo espera de ns para que
ela funcione.
Adaptvel pois no precisamos alterar algo que est fora da funo
para poder alterar o seu comportamento
Reutilizvel pois podemos passar os mesmos parmetros em
diferentes lugares para ter o mesmo efeito. Tais lugares podem ser
simplesmente diferentes pontos na mesma aplicao (bom cenrio
para rotinas locais) ou at em aplicaes diferentes (bom cenrio
para o uso de mdulos de funo).
possvel no declarar parmetros em uma rotina local e usar tipos e
variveis definidos fora dela e ter um programa funcional. possvel
tambm que uma pessoa tenha a capacidade de lamber seus prprios
cotovelos. Geralmente a reao de uma outra pessoa ao ver qualquer um
dos casos anteriores a mesma.

2.3 Refletindo sobre as definies no mundo


procedural
muito provvel que o que voc leu at ento trivial por conta de sua
experincia h alguns anos, e bem por isso que a sesses anteriores so
bem curtas. Mas elas so importantes para fazermos algumas reflexes
sobre o mundo procedural. Considere que os itens abaixo se aplicam a
programas procedurais bem construdos, seguindo melhores prticas de
desenvolvimento.

2.3.1 Diviso de responsabilidades


No mundo procedural, dividimos responsabilidades.

Orientao a Objetos em ABAP


Cpia de Marcos

Algumas variveis so usadas na seleo de dados e outras na interao


com o usurio.
Algumas rotinas servem para calcular enquanto outras servem para exibir
um resultado.

2.3.2 Reaproveitamento de cdigo


Cdigo relevante para vrias aplicaes so postos em mdulos de funo
separados logicamente em grupos de funo. Podemos reaproveitar tais
instrues simplesmente chamando a mesma funo em diversas
aplicaes. Tais chamadas so ainda facilmente rastreveis usando a
funo de lista de utilizao, que salva a vida de milhares de ABAPers
diariamente.

2.3.3 Testes Unitrios


Ainda com mdulos de funo, podemos criar testes unitrios e at testes
em sequncia pela transao SE37, o que permite testar tais trechos de
cdigo de forma independente.

2.3.4 Encapsulamento
Apesar de ser um termo constantemente usado na orientao a objetos, o
mundo procedural tambm prov encapsulamento. Um report que chama
uma funo de seleo de dados no precisa conhecer nada alm dos
parmetros necessrios para fazer a chamada. Se internamente a funo
faz 1 ou 15 SELECTs no possvel descobrir lendo somente o trecho de
cdigo do programa que contm a instruo CALL FUNCTION.

2.3.5 Falsos mitos sobre as vantagens de OO


Aps fazer tal reflexo sobre como feita a organizao e construo de
programas procedurais, podemos fazer uma anlise mais crtica sobre

Orientao a Objetos em ABAP


Cpia de Marcos

quais sero de fato as vantagens exclusivas da orientao a objetos em


relao ao mundo procedural.
Diviso de responsabilidade, reaproveitamento de cdigo, testes unitrios
e encapsulamentos so caractersticas de uma aplicao alcanveis em
ambos os mundos, todavia feitos de uma maneira diferente. Seria raso
afirmar que tais fatores so a vantagem da orientao a objetos em
relao ao modelo rstico.
H outros conceitos porm que somente a orientao a objetos ir prover
de uma maneira
vivel
. O principal deles, o conceito de
instanciao,
que ser estudado mais adiante.

2.4 O TOP Include do Grupo de Funo


Talvez voc ficado curioso em saber porque o nome deste captulo
Memria eidtica (termo tambm conhecido como memria
fotogrfica). Esta uma analogia como o gerenciamento de memria
feito numa aplicao procedural, em especial para as que usam funes
globais.
Voc j usou o TOP Include de um Grupo de funes? Sabe em detalhes o
que acontece com as variveis declaradas nele antes e depois dos
mdulos de funes serem chamados em uma aplicao? Vamos analisar
tal tpico para ento entender mais adiante o que significa
instanciao.
O que ser discutido nesta sesso com certeza deveria ser sabido por
quem j trabalha com ABAP h algum tempo, mas me arrisco em dizer
que a importncia dado a tal conhecimento de certa forma ignorado ou
menosprezado.

Orientao a Objetos em ABAP


Cpia de Marcos

Podemos pensar em Includes como principalmente uma forma de agrupar


um trecho de cdigo. Uma forma simples de entender Includes em ABAP
para programadores que tem conhecimentos em .NET, associlos com
namespaces em C#.
possvel tambm reutilizar cdigo atravs da reutilizao de Includes e
o cdigo standard faz isso de maneira obsessiva. Porm, quem j
vivenciou tal prtica sabe que hoje existem melhores formas de se
reutilizar cdigo. O standard faz isso at os dias atuais muito mais por
uma questo de retrocompatibilidade do que por qualquer outro motivo.
O TOP Include acaba sendo to usado e importante, que ser estudado
em detalhes. Como geralmente ele usado no comeo de uma aplicao,
recebe tal nome diferenciado. Geralmente o desenvolvedor ABAP est
acostumado a trabalhar com TOP Includes em programas executveis
(report) e pools de mdulos (
online)
. Contdo, tais includes tambm
esto presentes em grupos de funo.
Quando um grupo de funo criado, automaticamente um TOP Include
criado dentro dele. As variveis declaradas neste include podem ser
usadas por qualquer mdulo de funo dentro do mesmo grupo
somente
.
Tal conceito prova que grupos de funo no so meramente separaes
lgicas de funes mas sim entidades que carregam dados que podem por
sua vez ser compartilhados pelas funes contidas neles.
Abaixo, temos o cdigo gerado de um grupo de funo chamado ZOO_FG.
*******************************************************************
*

System

defined

Include

files
.
*
*******************************************************************
INCLUDELZOO_FGTOP
.

"GlobalData
INCLUDELZOO_FGUXX
.

"FunctionModules

10

Orientao a Objetos em ABAP


Cpia de Marcos
*******************************************************************
*

User

defined

Include

files
(
if
necessary
).
*
*******************************************************************
*
INCLUDELZOO_FGF
...

"Subroutines
*
INCLUDELZOO_FGO
...

"PBOModules
*
INCLUDELZOO_FGI
...

"PAIModules
*
INCLUDELZOO_FGE
...

"Events
*
INCLUDELZOO_FGP
...

"Localclassimplement.
*
INCLUDELZOO_FGT99
.

"ABAPUnittests

Grupo de Funo ZOO_FG


Dentro deste grupo de funo, criaremos dois mdulos de funo, ambos
que acessam a mesma varivel a ser definida no include LZOO_FGTOP.
FUNCTION

POOLzoo_fg
.

"MESSAGEID..

*
INCLUDELZOO_FGD
...

"Localclassdefinition

DATAv_countTYPEi.

Include LZOO_FGTOP
O primeiro mdulo de funo simplesmente incrementa o valor da
varivel
v_count
.
FUNCTIONZ_OO_INCREMENT_COUNTER.

ADD
1
TOv_count.

ENDFUNCTION.

Mdulo de Funo Z_OO_INCREMENT_COUNTER


O segundo mdulo de funo captura o valor da varivel no include e
preenche um parmetro de exportao.

11

Orientao a Objetos em ABAP


Cpia de Marcos

FUNCTIONZ_OO_GET_COUNTER
EXPORTING
EX_COUNTTYPEI.

ex_count
=
v_count.

ENDFUNCTION.

Mdulo de Funo Z_OO_GET_COUNTER


Representando nosso grupo de funo graficamente, temos:

Representao grfica do mdulo de funo


As conexes a esquerda representam os nicos pontos de acesso1 ao nosso
grupo de funo que so seus mdulos. Todas as variveis declaradas
No considerase aqui o acesso a varivel na pilha de execuo via FIELDSYMBOLS e o comando
ASSIGN
1

12

Orientao a Objetos em ABAP


Cpia de Marcos

nos includes que esto no grupo de funo (que o caso da varivel


v_count
)
, podem ser apenas2 acessadas pelos mdulos de funo.
Vamos agora criar uma aplicao simples que chama tais mdulos de
funo. Nosso foco ser em entender o que acontece com a varivel
v_count contida dentro do grupo de funes mesmo que do ponto de
vista da aplicao nem se saiba da sua existncia.
REPORTzoo_fg_caller.

DATAcurrent_valueTYPEi.

DO
5
TIMES.

CALLFUNCTION
'Z_OO_GET_COUNTER'
IMPORTING
ex_count
=
current_value.

WRITE
/
current_value.

CALLFUNCTION
'Z_OO_INCREMENT_COUNTER'.

ENDDO.

Programa ZOO_FG_CALLER
DESAFIO !!!
Voc consegue imaginar qual seria a sada do programa?
Opo 1
0
0
0
0
0

Opo 2
0
1
2
3
4

Opo 3
0
1
0
1
0

Tais variveis poderiam ser acessadas por telas e outros includes definidos no grupo de funo, caso
existissem.
2

13

Orientao a Objetos em ABAP


Cpia de Marcos

Resposta:
Voc acertou se respondeu a opo 2. Enquanto a opo 3 no
faz sentido algum, compreensvel caso voc tenha achado que a opo
1 seria a correta. Note que todas as opes comeam imprimindo zero. A
dvida comea quando tentamos entender o que acontece em memria
uma vez que nossa aplicao cai na segunda ocorrncia da instruo DO.
Para entender, vamos representar graficamente a aplicao chamando
nossos mdulos de funo.

Representao de Programa chamando mdulos de funo


Precisamos entender que na imagem acima temos duas aplicaes ABAP:
um programa executvel e um grupo de funes. A forma que se cria cada
um destes diferente, mas ambos possuem variveis declaradas em
memria. O ABAP trata as variveis de forma igual independente do tipo
de aplicao.

14

Orientao a Objetos em ABAP


Cpia de Marcos

A varivel current_value do programa executvel posta em memria


assim que o programa carregado. A varivel existe em memria at o
encerramento do mesmo, quando ento a memria do servidor de
aplicao desalocada. No grupo de funes, o mesmo processo
acontece: quando o grupo de funo posto em momria, todas suas
variveis so alocadas em memria e permanecem l at o encerramento
do grupo de funes.
Tal afirmao gera duas novas dvidas:

Quando de fato o grupo de funo alocado em momria?


Assim que algum mdulo de funo deste chamado. Logo, no importa
qual foi o primeiro grupo de funo chamado. Antes da chamada ser de
fato realizada o ABAP aloca todo o grupo de funo em memria: isso
incluir as variveis definidas no TOP include do grupo de funo.

Quando se d o encerramento de um grupo de funo?


No mesmo momento que o programa que o chama encerrado. Logo,
podese entender que um grupo de funo nunca encerrado de maneira
isolada sempre quem faz a chamada a algum dos seus mdulos
encerrado juntamente ao primeiro.
Note ainda que totalmente possvel haver um mdulo de funo
chamando um outro mdulo de funo que est contido num grupo
diferente. Ainda neste caso nada muda: caso o segundo grupo de funo
no esteja em memria esta ser alocada antes da primeira chamada a
seu mdulo e ser desalocada no mesmo momento que o primeiro grupo
de funo for desalocado.

15

Orientao a Objetos em ABAP


Cpia de Marcos

Em suma, grupos de funo tem uma memria eidtica pois as variveis


em seu TOP include permanecem com os mesmos valores mesmo depois
da execuo de um CALL FUNCTION.

O entendimento de tal caracterstica dos grupos de funo fundamental


para entender o comportamento de um
objeto,visto que este pode ser
desalocado de memria muito antes da aplicao que o chamou ser
encerrada.
Anteriormente afirmamos que:
H outros conceitos porm que somente a orientao a objetos ir
prover de uma maneira
vivel
.
Apesar de no termos controle em quando um grupo de funo
desalocado de memria, podemos definir um mdulo de funo
responsvel por
resetar/limpar
as variveis dentro de seu TOP Include.
Tal procedimento funciona, mas considerado aqui invivel uma vez que
quanto mais variveis temos, mais comandos CLEAN/REFRESH/FREE
devemos executar, alm de ser necessrio chamar o mdulo responsvel
pela limpeza explicitamente.
No por coincidncia que existem diversos mdulos de funo standard
limpadores que devem ser chamados caso se queira chamar um mdulo
de funo diversas vezes.
Verifique na SE37 quantos mdulos de funo existem com os nomes:
*CLEAR*BUFFER*
*CLEAR*GLOBAL*

16

Orientao a Objetos em ABAP


Cpia de Marcos

3 Conceitos bsicos
preciso entender que a orientao a objetos no muda as demandas que
j temos como desenvolvedor, ela simplesmente muda a forma como as
entregamos.
Comearemos na orientao a objetos esclarecendo seus principais
conceitos. importante ter clara a definio de cada um deles antes de
pensar como seria uma aplicao ABAP orientada a objetos resolvendo um
problema real.

3.1 Classes
Comparado ao mundo procedural, uma classe seria o mais prximo de um
grupo de funes. Todavia existem muitas diferenas. Para evitar
comparaes num nvel tcnico, tentarei deixar a apresentao deste
importante conceito um pouco mais ldica.
Eu sou uma pessoa que gosta de bolos. Chocolate, cenoura, morango
no importa. verdade que cada bolo tem suas caractersticas mas para
se fazer um bolo, independente de como ele seja, preciso de uma
forma que, obviamente, define a forma que os bolos sero.
A relao que quero estabelecer entre a forma de bolo e as classes no
sentido de ser necessrio somente uma forma para se fazer uma
quantidade enorme de bolos. Da mesma forma, com uma classe possvel
criar uma quantidade enorme de objetos.
Ao passo que uma forma redonda s permitir fazermos bolos redondos e
portanto semelhantes entre si, uma classe s permite criar objetos
tambm semelhantes entre si.

17

Orientao a Objetos em ABAP


Cpia de Marcos

Ainda no vimos o conceito de objetos (representado pelos bolos que


podem ser criados), mas no precisamos definilo ainda para que voc
veja uma classe criada em ABAP.
CLASSlcl_ordem_de_vendaDEFINITION.

ENDCLASS.

Exemplo de classe
Muitos comandos podem estar contidos entre o bloco de cdigo acima. O
que temos por hora uma classe o mais simples possvel no ABAP.
As diferenas com grupos de funo j comeam nesta simples classe.
Primeiramente, usamos o nome de classes no cdigo fonte. No caso acima
usamos para
criar
a classe mas depois veremos que tambm usamos tal
nome para
usar
a classe.
Falando em nomes de classes, a regra noescrita
dar bons nomes a tudo
que se cria
continua valendo. Uma classe representa algo. Mesmo que
sendo um conceito abstrato, representa um conceito acima de tudo. Por
isso, comum encontrarmos substantivos sendo usados para nomear
classes.
No que se refere a convenes de cdigo, o prefixo l
cl
bastante usado.

Esta sigla significa


local class.
Uma classe local criada dentro de uma
aplicao (geralmente dentro de algum Include) e por isso pode ser
apenas usada localmente naquele programa. possvel definir classes
globais tambm (mais semelhantes com grupos de funo que so sempre
globais). Neste caso, o
namespace
prprio
ZCL_
. Classes globais sero
vistas mais adiante. Os conceitos vistos neste captulo so independentes
do escopo local ou global.

18

Orientao a Objetos em ABAP


Cpia de Marcos

3.2 Referncias
Agora que temos uma classe o mais bsica possvel, precisamos saber o
que possvel fazer com ela e a resposta para este caso : no muito.
Conforme dito antes, uma classe como se fosse uma forma de bolo.
Para fazer o bolo precisamos usar as mos: independente se for para
quebrar os ovos e batlos ou para abrir a caixa com o bolo em p pronto.
Tal analogia usada aqui para ilustrar o que so referncias.
Uma referncia como uma mo que segura um (e somente um) bolo. A
nossa mo pode no estar segurando um bolo e do mesmo modo uma
referncia pode no estar com objeto algum.
Uma vez que tenhamos posse de uma forma (classe), usamos nossas mos
para enchermos a forma quantas vezes quisermos.
Da mesma maneira que uma forma de bolo pode ser usada por diversas
pessoas, precisamos declarar quais mos manipularo quais formas.
DATA
:
r_ordem_aTYPEREFTOlcl_ordem_de_venda,
r_ordem_bTYPEREFTOlcl_ordem_de_venda,
r_ordem_cTYPEREFTOlcl_ordem_de_venda,
r_ordem_dLIKEr_ordem_c.

Referncias a classes
No se confunda. No exemplo acima temos quatro
referncias e no
quatro objetos. Uma das principais dificuldades para iniciantes no assunto
da orientao a objeto diferenciar estes conceitos.

19

Orientao a Objetos em ABAP


Cpia de Marcos

Isso se reflete at na nomenclatura usada por muitos. Enquanto no cdigo


acima optamos por declarar nossas referncias usando o prefixo
r_
,
muitos usariam o prefixo
o_ (simbolizando um
objeto que est errado
pois no temos nenhum objeto no trecho de cdigo acima).

Afinal, uma referncia declarada usando uma classe se refere a


que?
Esta uma excelente dvida para se ter neste momento. Olhando o
cdigo que cria as referncias vemos o nome da nossa classe sendo usado.
Porm, seria errado afirmar que uma referncia aponta para uma
classe. Uma referncia
pode
apontar para um objeto ou estar vazia.

Referncias so variveis (ou data objects)?


Sim, criadas com a variao REF TO. Isso quer dizer que so variveis que
internamente guardam o endereo de memria de outras variveis.
Quando a variao REF TO usada precedendo uma classe, temos o que
chamamos de referncia a objeto. Quando tal variao usada antes de
uma varivel primitiva, work area ou tabela interna, temos o que muitos
conhecem como ponteiro: pouco usado no ABAP em aplicaes
customizadas mas totalmente possvel.
Veja os exemplos abaixo.
TYPEStt_maraTYPESTANDARDTABLEOFmaraWITHDEFAULTKEY.

DATA
:
v_iTYPEi,
v_stringTYPE
string,
v_num_10TYPEnumc10,
waTYPEsyst,
itabTYPEtt_mara.

20

Orientao a Objetos em ABAP


Cpia de Marcos
BREAK

POINT
.

"Debugapartirdaqui

v_i
=

10.
v_string
=

'OrientaoaObjetos'.
v_num_10
=

'01234'.

wa
=
sy.

SELECT
*
FROMmaraINTOTABLEitab.

Preenchimento de objetos de dados comuns (variveis, work area e


tabela interna)

Com certeza o cdigo acima bem trivial para quem j desenvolve em


ABAP. Ele usa variveis cujos tipos so estruturas de dados muito
conhecidas: primitivas (usando ou no o dicionrio de dados), work areas
e tabelas internas.
A representao de tais varives em memria exibida abaixo.

21

Orientao a Objetos em ABAP


Cpia de Marcos

Representao de variveis comuns


Analise agora o segundo exemplo, fazemos o preenchimento de variveis
semelhantes, mas declaradas usando referncias (note a variao REF TO
sendo usada no comando DATA).
TYPEStt_maraTYPESTANDARDTABLEOFmaraWITHDEFAULTKEY.

DATA
:
r_iTYPEREFTOi,

22

Orientao a Objetos em ABAP


Cpia de Marcos
r_stringTYPEREFTO
string,
r_num_10TYPEREFTOnumc10,
r_waTYPEREFTOsyst,
r_itabTYPEREFTOtt_mara.

BREAK

POINT
.

"Debugapartirdaqui

CREATEDATA:
r_i,
r_string,
r_num_10,
r_wa,
r_itab.

r_i
>*

10.
r_string
>*

'OrientaoaObjetos'.
r_num_10
>*

'01234'.

r_wa
>*

=
sy.

SELECT
*
FROMmaraINTOTABLEr_itab
>*.

Criao de refncias e preenchimento de objetos de dados a que elas se


referem (variveis, work area e tabela interna)
O que est acontecendo no cdigo acima de diferente?
Temos agora no 5 variveis porm 10. Cinco delas ainda so as variveis
anteriores porm para ter acesso a elas agora precisamos usar 5
referncias que nos levam at de fato o endereo de memria delas.
Uma imagem vale mais que mil palavras.

23

Orientao a Objetos em ABAP


Cpia de Marcos

Representao de variveis de referncia


Na imagem acima, as variveis de referncia esto em vermelho. As
letras
u, v, x, y
e z simbolizam endereos de memria. Internamente as
referncias guardam tais endereos, que so nmeros inteiros cujo valor
variam bastante. Quando se trabalha com variveis de referncia, o
depurador ABAP converte tais nmeros aleatrios em sequenciais para
que se facilite o trabalho do desenvolvedor.

24

Orientao a Objetos em ABAP


Cpia de Marcos

Na imagem abaixo a primeira varivel de referncia do programa


exibida no depurador com o endereo
1
, que no de fato o endereo de
memria de tal varivel pois a converso do endereo j foi realizada.

Outra diferena entre os dois trechos de cdigo que quando usamos


referncias, a nica alocao de memria feita no incio da aplicao so
das referncias em si. Antes que o comando CREATE DATA seja realizado,
nenhuma das trs variveis primitivas, nem a work area ou a tabela
interna existem ainda em memria. Logo, no incio da execuo desta
aplicao existem 5 referncias em memria e antes do seu
encerramento temos outras 5 variveis comuns alocadas.
Caso voc tente usar uma referncia ainda no criada na sua aplicao
(usar >* sem antes ter realizado o comando CREATE), um DUMP ocorre.

Checkbox REF TO
Em diversas transaes de desenvolvimento, existe um checkbox chamado
REF TO, justamente que define se o que est sendo criada um
tipo/varivel simples ou uma referncia a algo.

25

Orientao a Objetos em ABAP


Cpia de Marcos

Podemos encontrar tais checkboxes nas transaes SE37 para definir os


tipos dos parmetros de uma funo e SE24 para se definir atributos e
parmetros de mtodos conceitos estudados mais adiante.

3.3 Objetos (ou instncias)


Na nossa analogia, objetos so os bolos. Com uma classe, possvel criar
quantos objetos quiser, desde que se tenha pelo menos uma referncia
tambm.
Se estamos estudando orientao a objetos de se presumir que
deveramos ter vrios destes em nossas aplicaes e a resposta
verdadeira para aplicaes orientadas a objetos bem construdas.
Um objeto muitas vezes chamado tambm de instncia. O processo de
se criar um objeto corriqueiramente chamado de instanciao.

Como se cria um objeto no ABAP?


A forma mais conhecida atravs do comando CREATE OBJECT, sendo
tambm possvel atravs do comando NEW.
CREATEOBJECT
:
r_ordem_a,
r_ordem_bTYPElcl_ordem_de_venda.

r_ordem_c
=
NEWlcl_ordem_de_venda
(

).

Criao de objetos
Caso esteja usando uma verso do NetWeaver de meados de 2012,
possvel criar uma referncia e um objeto para ela na mesma linha de
cdigo muito semelhante como o que feito em Java.
DATA
(
r_ordem_e
)

=
NEWlcl_ordem_de_venda
(

).

26

Orientao a Objetos em ABAP


Cpia de Marcos

Criao de referncia e objeto

3.4 O processo de construo e destruo de


um objeto
Sem dvida alguma, esta sesso uma das mais importantes deste livro.
No passe para a prxima sesso sem antes ter entendido bem o tema
atual, o processo de construo e destruo de um objeto.
Voc j foi intruduzido aos conceitos de classes, referncias e objetos.
Eles so mais do que o suficiente para confundir aqueles iniciantes a
orientao a objetos.
Isso devido ao fato que neste mbito que mora uma das principais
diferenas entre o mundo procedural e o orientado a objetos a
utilizao da memria de uma aplicao.
Vimos no captulo anterior como um grupo de funo funciona. Sabemos
quando a memria usada para as variveis declaradas em seu TOP include
desalocada: quando a aplicao termina. Sabemos tambm que a
alocao acontece quando qualquer mdulo de funo pertencente a tal
grupo chamado.
No mundo orientado a objetos, no bem assim. Apesar de toda a
memria ser desalocada quando a aplicao como um todo se encerra,
podemos ter
objetos
sendo desalocados de memria.
Abaixo temos a declarao da nossa classe e suas referncias.

27

Orientao a Objetos em ABAP


Cpia de Marcos
CLASSlcl_ordem_de_vendaDEFINITION.

ENDCLASS.

DATA
:
r_ordem_aTYPEREFTOlcl_ordem_de_venda,
r_ordem_bTYPEREFTOlcl_ordem_de_venda,
r_ordem_cTYPEREFTOlcl_ordem_de_venda,
r_ordem_dLIKEr_ordem_c.

Declarao de classe e referncias


Graficamente, temos:

Nossas referncias ainda no apontam para


objetos. Isso porque na
verdade nem temos objetos criados! At o momento temos 1 classe, 4
referncias e nenhum objeto.

3.4.1 Criao de objetos

28

Orientao a Objetos em ABAP


Cpia de Marcos

Vamos criar nosso primeiro objeto. J sabemos que para criar um objeto
precisamos de uma referncia.

CREATEOBJECTr_ordem_a.

Criao de primeiro objeto


O comando CREATE OBJECT inspeciona a declarao da referncia
r_ordem_a e nota que esta se refere a classe lcl_ordem_de_venda. Logo,
ele cria um objeto de acordo com a definio da classe (que por hora
ainda vazia para no nos adiantarmos).
Objetos so tipicamente representados por circunferncias e a imagem
acima segue prtica. Como resultado, temos:

Representao do primeiro objeto criado


Como podese notar pela imagem e cdigo acima, somente a referncia
r_ordem_a aponta para um objeto. Todas as outras referncias esto em
memria.

29

Orientao a Objetos em ABAP


Cpia de Marcos

Vamos agora criar outro objeto.

r_ordem_b
=
NEWlcl_ordem_de_venda
(

).

Criao de segundo objeto atravs do comando NEW

Usamos outro comando acima simplesmente para informar desta


possibilidade. Tal comando espera um tipo e uma classe nada mais que
um tipo complexo.
A criao do segundo objeto nos leva a representar a memria da
aplicao de acordo.

Representao de dois objeto criados


At o momento, esta tal de orientao a objetos no parece ser to
difcil no mesmo?
DESAFIO !!!

30

Orientao a Objetos em ABAP


Cpia de Marcos

Chegou a hora de se deparar com um cdigo campeo na gerao de


dvidas.
Dado o cenrio apresentado at ento onde temos dois objetos criados, o
que acontece quando executamos a instruo abaixo? Tente imaginar ou
desenhar como a representao em memria ficaria.
r_ordem_c
=
r_ordem_b.

Atribuio entre referncias

Reposta:
A resposta para tal desafio se resume a lembrar que as
referncias guardam endereos de memria que no fundo so nmeros.
Imaginando que a referncia r_ordem_b guarda o endereo de memria
548, estamos copiando tal valor para a referncia r_ordem_c. O resultado
de copiar o endereo de memria NO o mesmo de copiar o objeto.
Logo, a resposta abaixo est incorreta.

Resposta incorreta: copiar um endereo de memria no duplica um


objeto

31

Orientao a Objetos em ABAP


Cpia de Marcos

A resposta correta para o desafio representada abaixo.

Resposta correta: mais de uma referncia pode apontar para o mesmo


objeto

Podemos ter mais de uma referncia apontando para o mesmo


objeto?
Sim e isso muito mais comum do que talvez parea por hora. Toda
aplicao orientada a objetos vai ter em algum certo momento muito
mais que duas referncias apontando para o mesmo objeto.

Podemos ter a mesma referncia apontando para mais de um


objeto?
No. Assim como uma varivel declarada como inteiro s pode ter um
valor, uma referncia s pode guardar um endereo de memria, alm de
estar vazia. A diferena no caso das referncia que caso algum comando
seja exercido em uma referncia vazia (que no aponta para objeto
algum), um DUMP ocorre. A nica exceo a esta regra sobre os

32

Orientao a Objetos em ABAP


Cpia de Marcos

comandos que criam os objetos para as referncias como o CREATE


OBJECT e NEW.

3.4.2 Destruio de Objetos e o Garbage Collector


Assim como podemos preencher uma referncias, podemos apagar seu
contedo usando comando CLEAR.
CLEARr_ordem_a.

Limpando uma referncia


justamente neste cenrio que temos uma grande diferena com os
grupos de funo: um objeto que no possui referncias retirado da
memria. Em outras palavras, a memria que aquele objeto ocupava
poder ser usada para outro fim.
Apesar de isso no ser um problema tpico quando est se desenvolvendo,
importante saber que esta desalocao de memria no acontece
automaticamente.
Muitas linguagens orientadas a objetos, ABAP incluso, possuem um
Garbage Collector
, que responsvel por justamente identificar objetos
que no possuem referncias e reaproveitar a memria que os mesmos
ocupavam. Uma vez que no temos mais como acessar o objeto, no h
porque ele continuar residindo em memria. A boa notcia que o
desenvolvedor no precisa se preocupar com isso pois este processo
transparente.
Logo, representando a memria antes da atuao do Garbage Collector,
temos:

33

Orientao a Objetos em ABAP


Cpia de Marcos

Memria imediatamente aps comando CLEAR mas antes da atuao do


Garbage Collector
Depois da atuao do
Garbage Collector
, temos:

Memria aps a atuaco do Garbage Collector: objeto excludo de


memria

34

Orientao a Objetos em ABAP


Cpia de Marcos

possvel forar a execuo do


Garbage Collector atravs do
depurador ABAP escolhendo a opo
Edit > System Functions > Start
Garbage Collector
.
DESAFIO !!!
Sabendo o que acontece no momento que se apaga uma instncia que
antes apontava para um objeto, qual o efeito de apagar o contedo da
referncia r_ordem_b? Pense na representao assim como fez no desafio
anterior.
Resposta:
Neste caso, o objeto no apagado de memria pelo
Garbage
Collector visto que este ainda pode ser acessado pela referncia
r_ordem_c. O mesmo aconteceria se a referncia r_ordem_c fosse
deletada ao invs da r_ordem_b. O que importa para o
Garbage Collector
atuar encontrar um objeto sem referncia nenhuma. Todas as
referncias que apontam para o mesmo objeto tem a mesma importncia.
indiferente qual foi a referncia usada no momento da criao do
objeto. Assim sendo, temos:

Representao aps limpeza da referncia r_ordem_b

35

Orientao a Objetos em ABAP


Cpia de Marcos

Muitas vezes, no se sabe quantos objetos de um determinado tipo sero


criados durante a execuo de uma aplicaco. Tambm muito comum
no querer desassociar todas as referncias de um determinado objeto
para mantlo em memria acessvel quando se fizer necessrio. Nestes
casos, precisamos de um nmero ilimitado de referncias declaradas na
nossa aplicao.

3.4.3 Tabela interna de referncias


Para resolver tal necessidade, podemos declarar uma tabela interna de
referncias. Tal tabela interna permite termos um nmero qualquer de
referncias na mesma estrutura de dados. Os comandos prprios para
tabelas internas podem ser usados livremente.
DATAt_r_ordensTYPETABLEOFREFTOlcl_ordem_de_venda.

DATAr_ordemTYPEREFTOlcl_ordem_de_venda.

CREATEOBJECTr_ordem.

APPENDr_ordemTOt_r_ordens.

Declarao e preenchimento de uma tabela interna de referncias


Com o cdigo acima, poderamos reutilizar a referncia r_ordem tantas
vezes quanto fossem necessrias para a criao de objetos do tipo ordem
de venda. Isso verdadeiro desde que antes de reescrever tal referncia
(o que invalidaria o objeto), crissemos uma linha nova na tabela interna
de referncias apontando para o objeto mais recente.

36

Orientao a Objetos em ABAP


Cpia de Marcos

Referncia sendo usada para criar uma quantidade indefinida de objetos.


Uma tabela interna de referncias necessria para evitar a destruo
dos objetos.

3.4.4 LIKE REF TO


A nossa referncia r_ordem_d (declarada atravs da variao LIKE REF
TO) serve para lembrar que o comando LIKE no copia o calor da varivel
usada aps o REF TO. Logo em todo momento desta aplicao a
referncia r_ordem_d se manteve vazia.

3.5 Atributos
At o momento a definio de nossa classe (CLASS DEFINITION
ENDCLASS.) se manteve vazia. Contdo conforme dito anteriormente,
classes nada mais so que tipos complexos. Digase de passagem, muito
mais complexos que um mero BEGIN OF.. END OF pode fazer em uma
work area
.
Um atributos basicamente se resumem a declaraes de variveis
colocadas entre o bloco CLASS DEFINITION ENDCLASS.

37

Orientao a Objetos em ABAP


Cpia de Marcos

Tudo que voc j sabe sobre o comando DATA pode ser aplicado neste
contexto. possvel usar tipos primitivos, do dicionrio, clusula LIKE,
definio de work areas e tabelas internas e assim por diante.
possvel tambm usar tipos (TYPES) e constantes (CONSTANTS) dentro
do bloco CLASS DEFINITION.
Veja o exemplo abaixo.
CLASSlcl_ordem_de_vendaDEFINITION.
PUBLICSECTION.

TYPEStt_itemsTYPETABLEOFvbap.

CONSTANTSc_tipoTYPEvbak

auartVALUE
'OR'.

DATA
:
valorTYPEpLENGTH
10
DECIMALS
2,
idTYPEvbeln_va,
headerTYPEvbak,
itemsTYPEtt_items.

ENDCLASS.

Atributos de uma classe


Uma vez que seja inserido pelo menos algum contedo entre o bloco
CLASS DEFINITION e ENDCLASS, necessrio definir uma
sesso de
visibilidade. Discutiremos este assunto num captulo futuro. Por hora,
sempre inclua a opo PUBLIC SECTION em suas classes para depois
entender o efeito desta.
Novamente comparando com grupos de funo, as declaraes em uma
classe possuem um comportamento diferenciado.
Primeiramente, quando o programa que possui a classe
lcl_ordem_de_venda for carregado em memria, nenhuma das variveis

38

Orientao a Objetos em ABAP


Cpia de Marcos

declaradas nela sero alocadas. Isso acontece pois as variveis declaradas


usando a instruo DATA dentro do bloco CLASS DEFINITION cria variveis
que pertencem aos objetos desta classe e no a classe em si. A exceo a
esta regra acontecer para atributos estticos, vistos mais adiante, no
qual criar variveis pertencentes a classe e no aos objetos desta.
Supondo que criemos um objeto (usando uma referncia) a nossa nica
classe, o que teremos o resultado expresso abaixo.

39

Orientao a Objetos em ABAP


Cpia de Marcos

Objeto com atributos


Obviamente, todas as variveis iro ser carregadas com seu valor inicial.
Logo o que temos acima somente uma representao no os valores em
si. A tabela interna
items
por exemplo seria carregada com zero linhas.

40

Orientao a Objetos em ABAP


Cpia de Marcos

Caso crissemos mais dois objetos da mesma classe, somando 3 no total,


teramos vrias vezes as variveis declaradas. Porm, estas seriam
totalmente independentes uma das outras.

Trs objetos do mesmo tipo criados: cada objeto possui seus prprios
dados
No exemplo acima, temos trs referncias a classe lcl_ordem_de_venda
sendo que cada uma aponta para um objeto distinto j criado.

Neste caso a mesma aplicao pode ter vrias variveis com o


mesmo nome?
Sim, de fato h trs variveis chamadas id, trs tabelas internas
chamadas items e assim por diante. Todavia cada um destas variveis
esto em um
contexto
de memria diferente.
Temos o mesmo efeito de termos dois TOP Includes de grupos de funes
diferentes em memria com pelo menos uma varivel com o mesmo
nome. A diferena que no caso dos grupos de funo ter uma varivel

41

Orientao a Objetos em ABAP


Cpia de Marcos

com o mesmo nome em seus includes pode ser mera coincidncia,


enquanto
todos os objetos de lcl_ordem_de_venda possuiro
todos os
atributos definidos dentro da classe. Portanto, no existe algum tipo de
declarao opcional. Todos os objetos tem o mesmo formato bem
como tem os bolos feitos usando a mesma forma.

Como diferenciar os atributos de objeto para objeto sendo que


eles tem o mesmo nome?
Atravs das referncias. No possvel ler ou escrever em um atributo de
objeto sem tocar em alguma referncia. Em outras palavras, a nica
forma de se chegar em algum objeto via uma referncia que aponta a
este.
Veja os exemplos abaixo.
DATAr_ordem_aTYPEREFTOlcl_ordem_de_venda.

CREATEOBJECTr_ordem_a.

r_ordem_a
>
id
=

'1234'.

r_ordem_a
>
valor
=

1000.

r_ordem_a
>
valor
=
r_ordem_a
>
valor

100.

r_ordem_a
>
header

vbeln
=
r_ordem_a
>
id.

APPENDINITIALLINETOr_ordem_a
>
items.

READTABLEr_ordem_a
>
itemsINDEX
1
INTODATA
(
wa_item
).

LOOPATr_ordem_a
>
itemsASSIGNINGFIELD

SYMBOL
(<
item
>).
WRITE
/

<item>

vbeln.
ENDLOOP.

Manipulaco de atributos de um objeto

42

Orientao a Objetos em ABAP


Cpia de Marcos

Note que a referncia sempre antecede o atributo em si. Como as


referncias so manipuladas usando >, basta trocarmos o asterisco (*)
usado em referncias a tipos comuns pelo nome do atributo.
Nota: Usar >* para uma varivel que se refere a uma classe no retorna
dados algum.
Por isso, um dos principais pontos chave para se tornar um bom
entendedor de orientao a objetos saber qual referncia est
apontando para qual objeto num dado momento.

3.6 Mtodos
Objetos no simplesmente podem carregar dados em forma de atributos
mas tambm so capazes de processar tais dados. Em outras palavras um
objeto tem a capacidade de possuir cdigo ABAP como selees no banco
de dados, leitura de arquivos, chamadas a funes, exibies de telas,
etc.
Tais instrues so encapsuladas em
mtodos
, que podem ser comparados
a mdulos de funo no sentido de possurem parmetros de entrada e
sada, tratamento de erros, alm do cdigo em si.
Por infelicidade do destino, quando a SAP definiu qual seria a sintaxe dos
comandos de orientao a objetos, os comandos relacionados a mtodos
talvez no tiveram uma ateno to especial. O resultado disso que
uma vez que sua classe tenha mtodos (o que tipicamente vai ocorrer)
sua classe ir crescer em nmero de linhas de cdigo.
No ABAP, separase a declarao da implementao de uma classe. A
parte de declarao define basicamente os atributos e mtodos da classe
enquanto a parte de implementao conter o cdigo que pode ser
depurado. Tais trechos de cdigo estaro
sempre dentro da

43

Orientao a Objetos em ABAP


Cpia de Marcos

implementao dos mtodos. Logo, precisamos adicionar um novo bloco


de cdigo que conter tais implementaes.
CLASSlcl_ordem_de_vendaDEFINITION.
PUBLICSECTION.

"Declaraodeatributos(...)

ENDCLASS.

CLASSlcl_ordem_de_vendaIMPLEMENTATION.

ENDCLASS.

Blocos DEFINITION e IMPLEMENTATION


Agora que temos os dois possveis blocos de uma classe, vamos criar um
mtodo o mais simples possvel, que por hora no far rigorosamente
nada (mas que pelo menos existir).
Primeiramente, vamos
declarar o mtodo. Para isso, usamos o comando
METHODS
(no plural) seguido do nome do mtodo.
CLASSlcl_ordem_de_vendaDEFINITION.
PUBLICSECTION.

TYPEStt_itemsTYPETABLEOFvbap.

CONSTANTSc_tipoTYPEvbak

auartVALUE
'OR'.

DATA
:
valorTYPEpLENGTH
10
DECIMALS
2,
idTYPEvbeln_va,
headerTYPEvbak,
itemsTYPEtt_items.

METHODSfazer_absolutamente_nada.

ENDCLASS.

Declarao de mtodo

44

Orientao a Objetos em ABAP


Cpia de Marcos

Por fim, vamos


implementar o mtodo no recm criado bloco. Para isso
bloco de cdigo
METHOD ENDMETHOD
. Note que METHOD neste caso
no singular.
CLASSlcl_ordem_de_vendaIMPLEMENTATION.

METHODfazer_absolutamente_nada.
BREAK

POINT.
ENDMETHOD.

ENDCLASS.

Implementao de mtodo
O comando BREAKPOINT aqui ajuda a validarmos se o mtodo pode
realmente ser chamado.
Como os mtodos declarados neste cenrio pertencem aos objetos e
somente possvel usar os objetos atravs das referncias que apontam a
eles, precisamos tambm das referncias para chamar tais mtodos.
DATAr_ordem_aTYPEREFTOlcl_ordem_de_venda.

"Opo1)Semelhanteachamadademdulosdefuno
CALLMETHODr_ordem_a
>
fazer_absolutamente_nada.

"Opo2)Semelhanteaoutraslinguagensorientadaaobjetos
r_ordem_a
>
fazer_absolutamente_nada
(

).

Chamadas de mtodos

Classes, referncias, objetos, atributos e mtodos. Estes termos devem


fazer parte do seu vocabulrio para desbravar o que est por vir.

45

Orientao a Objetos em ABAP


Cpia de Marcos

4 Conceitos intermedirios
Estamos cada pargrafo mais longe no mar da orientao a objetos.
hora de estudar conceitos que dificilmente podem ser associados com o
mundo procedural. Esteja aberto a novas formas de escrever cdigo a
partir de agora.

4.1 Construtores
Diferente de outras linguagens orientadas a objetos, o ABAP no permite
que haja mais de um mtodo na mesma classe com o mesmo nome.
Construtores so mtodos especiais pois so chamados automaticamente
em momentos bem especficos. Existem dois tipos de mtodos
construtores, que so identificados pelo seu nome reservado.

4.1.1 Construtor de Instncia


constructor Tambm conhecido como construtor de instncia. A
execuo deste mtodo feita sempre que um objeto novo criado
(independente do comando usado para isso). O principal uso deste
mtodo para preencher atributos com valores iniciais.
O construtor de intncia declarado usando o comando METHODS, assim
como os mtodos vistos at aqui. O que diferencia este mtodo dos
demais seu nome.
CUIDADO! No ABAP no possvel dar outro nome ao construtor que no
seja
constructor. comum esquecermos o segundo c do mtodo o

46

Orientao a Objetos em ABAP


Cpia de Marcos

cdigo ativa porm o mtodo acaba no sendo chamado automaticamente


no momento da criao de um objeto.
CLASSlcl_ordem_de_vendaDEFINITION.
PUBLICSECTION.
METHODSconstructor.

ENDCLASS.

CLASSlcl_ordem_de_vendaIMPLEMENTATION.

METHODconstructor.

ENDMETHOD.

ENDCLASS.

Constructor de instncia

4.1.2 Construtor esttico (ou de classe)


class_constructor Tambm conhecido como construtor de
classe ou esttico. A execuo deste mtodo acontece no
mximo uma vez na aplicao: antes de ser realizada a primeira
operao envolvendo a classe. Caso no haja nenhum uso da classe,
este mtodo simplesmente no executado.
Existem conceitos que se aplicam a objetos e outros que se aplicam a
classes, como tal construtor. Nestes casos, o comando ABAP sendo usado
muda. Comandos que se referem a classes tipicamente comeam com
CLASS. Por exemplo, o construtor de classe deve ser definido com o
comando CLASSMETHODS (novamente no plural). A parte de
implementao no muda se comparado aos outros mtodos e portando
usase o bloco METHOD ENDMETHOD (no singular).

47

Orientao a Objetos em ABAP


Cpia de Marcos

CLASSlcl_ordem_de_vendaDEFINITION
.
PUBLICSECTION
.
CLASS

METHODSclass_constructor
.

ENDCLASS
.

CLASSlcl_ordem_de_vendaIMPLEMENTATION
.

METHODclass_constructor
.

ENDMETHOD
.

ENDCLASS.

Construtor de classe
Uma maneira simples de diferenciar quando cada um dos construtores so
chamados depurando o programa abaixo.
REPORTzoo_construtores.

CLASSlcl_ordem_de_vendaDEFINITION.
PUBLICSECTION.
METHODSconstructor.
CLASS

METHODSclass_constructor.

ENDCLASS.

CLASSlcl_ordem_de_vendaIMPLEMENTATION.
METHODconstructor.
BREAK

POINT.
ENDMETHOD.

METHODclass_constructor.
BREAK

POINT.
ENDMETHOD.
ENDCLASS.

DATAr_ordemTYPEREFTOlcl_ordem_de_venda.

START

OF

SELECTION.

48

Orientao a Objetos em ABAP


Cpia de Marcos

CREATEOBJECTr_ordem.
CREATEOBJECTr_ordem.
CREATEOBJECTr_ordem.

Classe com construtor de instncia e classe


Somente construtor de instncia pode possuir parmetros. Ainda, estes
obrigatoriamente devem ser importao somente. Caso este construtor
possua pelo menos um parmetro obrigatrio este ser passado atravs do
comando que cria o objeto (CREATE OBJECT ou NEW).

4.2 Auto-referncia me
Uma vez compreendida a diferena entre os construtores, chegou a hora
de entender o conceito de autoreferncia.
A
autoreferncia uma referncia chamada me declarada
implicitamente (obviamente usando a vario REF TO) acessvel dentro
de blocos METHOD ENDMETHOD e portanto pode ser usada somente
dentro de implementaes de classes.
Um caso de uso tpico da autoreferncia me dentro do construtor de
instncia. Veja o cdigo abaixo.
CLASSlcl_employeeDEFINITION.
PUBLICSECTION.

TYPESty_pernrTYPEpa0002

pernr.
DATApernrTYPEty_pernr.

METHODSconstructor
IMPORTING
i_personal_numberTYPEty_pernr.

ENDCLASS.

49

Orientao a Objetos em ABAP


Cpia de Marcos

CLASSlcl_employeeIMPLEMENTATION.
METHODconstructor.
me
>
pernr
=
i_personal_number
.

"

auto

refer

ncia
ENDMETHOD.

ENDCLASS.

DATA
:
r_employee_1TYPEREFTOlcl_employee,
r_employee_2TYPEREFTOlcl_employee,
r_employee_3TYPEREFTOlcl_employee.

START

OF

SELECTION.

CREATEOBJECTr_employee_1
EXPORTING
i_personal_number
=

'50000000'.

r_employee_2
=
NEWlcl_employee
(
i_personal_number
=

'50000001'

).

"Hasomenteumparametrodeentrada
r_employee_3
=
NEWlcl_employee
(

'50000002'

).

WRITE:

|
1

{
r_employee_1
>
pernr
}|,

/,

|
2

{
r_employee_2
>
pernr
}|,

/,

|
3

{
r_employee_3
>
pernr
}|.

Autoreferncia sendo usada no construtor

No cdigo acima, trs objetos so criados. Portanto, o construtor de


instncia chamado trs vezes, no momento que o objeto criado (via
comando CREATE OBJECT ou NEW).
Ao passo que a pilha de execuo sai do contexto STARTOFSELECTION e
entra no contexto CLASS IMPLEMENTATION ENDCLASS, a autoreferncia
me se torna acessvel. Neste momento, esta referncia aponta
exatamente para o objeto sendo criado. possvel acompanhar o
endereo de memria usado nesta referncia pelo depurador. Durante a

50

Orientao a Objetos em ABAP


Cpia de Marcos

execuco do programa possvel perceber que o objeto em questo o


mesmo sendo apontado por alguma das referncias
r_employee
.
possvel usar a autoreferncia para chamar mtodos pertencentes a
mesma classe.
Vamos aprimorar um pouco nossa classe lcl_employee para exemplificar
este cenrio. Ao invs de imprimir somente o ID de um funcionrio,
vamos imprimir tambm seu nome.
CLASSlcl_employeeDEFINITION.
PUBLICSECTION.

TYPESty_pernrTYPEpa0002

pernr.

DATA
:
pernrTYPEty_pernr,
wa_pa0002TYPEpa0002.

METHODSconstructor
IMPORTING
i_personal_numberTYPEty_pernr.

METHODSload_personal_data.

METHODSwrite_personal_data.

ENDCLASS.

CLASSlcl_employeeIMPLEMENTATION.

METHODconstructor.
me
>
pernr
=
i_personal_number.

me
>
load_personal_data
(

).

"
chamadausando
auto

refer

ncia

ENDMETHOD.

METHODload_personal_data.

SELECT
*
UPTO
1
ROWS

51

Orientao a Objetos em ABAP


Cpia de Marcos
FROMpa0002
INTOme
>
wa_pa0002
"
escrevendona
auto

refer

ncia
WHERE
pernr
=
me
>
pernr
"
lendoa
auto

refer

ncia
ORDERBYenddaDESCENDING.

ENDSELECT.

ENDMETHOD.

METHODwrite_personal_data.

"

Leitura
dosatributosparaimpressaousando
auto

refer

ncia
WRITE
:

{
me
>
wa_pa0002

pernr
}

{
me
>
wa_pa0002

cname
}

|
.
ENDMETHOD.

ENDCLASS.

DATA
:
r_employee_1TYPEREFTOlcl_employee,
r_employee_2TYPEREFTOlcl_employee,
r_employee_3TYPEREFTOlcl_employee.

START

OF

SELECTION.

CREATEOBJECTr_employee_1
EXPORTING
i_personal_number
=

'50000000'.

r_employee_2
=
NEWlcl_employee
(
i_personal_number
=

'50000002'

).

r_employee_3
=
NEWlcl_employee
(

'50000003'

).

"Impressao
r_employee_1
>
write_personal_data
(

).

CALLMETHODr_employee_2
>
write_personal_data.

r_employee_3
>
write_personal_data
(

).

Autoreferncia sendo usada para leitura e escrita de atributos, alm de


ser usada para chamado de mtodo da mesma classe.
Note acima quantas vezes usamos a autoreferncia. Isso faz com que
nossa classe seja totalmente independente das referncias declaradas a

52

Orientao a Objetos em ABAP


Cpia de Marcos

ela. Em outras palavras, apesar de no usarmos as referncias


r_employee dentro dos blocos CLASS...ENDCLASS, podemos manipular os
objetos sendo apontados por elas de uma maneira nica e independente.

4.3 Sesses de visibilidade


At ento usamos o comando PUBLIC SECTION dentro dos blocos de
definio de classe. Isso pois quando h pelo menos alguma definio
dentro de uma classe, obrigatrio especificar em qual
sesso de
visibilidade
ela se encontra.
As sesses de visibilidade nos permitem controlar em quais lugares algum
mtodo por ser chamado ou onde algum atributo pode ser acessado
(independente se seja para uma operao de leitura ou escrita).
Existem trs sesses de visibilidade possveis: PUBLIC, PROTECTED e
PRIVATE.
Por hora, vamos entender as sesses PUBLIC e PRIVATE uma vez que a
PROTECTED s faz sentido nos casos que h aplicao de herana, tema
que ainda ser abordado.
Dentro de uma sesso pode haver um nmero qualquer de tipos,
constantes, atributos e definies de mtodos e ainda uma mistura
destes. As sesses ainda somente so especificadas no bloco de definio
de classe.

4.3.1 PUBLIC SECTION


Atributos e mtodos declarados abaixo da
sesso pblica podem ser
usados em qualquer ponto de uma aplicao. Vamos mudar um pouco a

53

Orientao a Objetos em ABAP


Cpia de Marcos

nossa classe lcl_employee para perceber o que a sesso pblica nos


permite fazer.
CLASSlcl_employeeDEFINITION.
PUBLICSECTION.

TYPESty_pernrTYPEpa0002

pernr.

DATA
:
pernrTYPEty_pernr,
wa_pa0002TYPEpa0002.

METHODSload_personal_data.

METHODSwrite_personal_data.

ENDCLASS.

CLASSlcl_employeeIMPLEMENTATION.

METHODload_personal_data.

SELECT
*
UPTO
1
ROWS
FROMpa0002
INTOme
>
wa_pa0002
WHERE
pernr
=
me
>
pernr
ORDERBYenddaDESCENDING.

ENDSELECT.

ENDMETHOD.

METHODwrite_personal_data.
WRITE
:

{
me
>
wa_pa0002

pernr
}

{
me
>
wa_pa0002

cname
}

|
.
ENDMETHOD.

ENDCLASS.

DATA
:
r_employee_1TYPEREFTOlcl_employee,
r_employee_2TYPEREFTOlcl_employee,
r_employee_3TYPEREFTOlcl_employee.

54

Orientao a Objetos em ABAP


Cpia de Marcos
START

OF

SELECTION.

CREATEOBJECTr_employee_1.
r_employee_1
>
pernr
=

'50000000'.

r_employee_2
=
NEWlcl_employee
(

).
r_employee_2
>
pernr
=

'50000002'.

r_employee_3
=
NEWlcl_employee
(

).
r_employee_3
>
pernr
=

'50000003'.

Carrega
dados
do
empregado
r_employee_1
>
load_personal_data
(

).
r_employee_2
>
load_personal_data
(

).
r_employee_3
>
load_personal_data
(

).

Impressao
r_employee_1
>
write_personal_data
(

).
CALLMETHODr_employee_2
>
write_personal_data.
WRITE
:

{
r_employee_3
>
wa_pa0002

pernr
}

{
r_employee_3
>
wa_pa0002

cname
}

|
.

Uso de atributos e mtodos pblicos


Primeiramente, no considere o exemplo acima um cdigo orientado a
objetos com qualidade. Ele poderia estar bem melhor escrito usando mais
de uma sesso de visibilidade. Porm, ele um bom exemplo de o que a
sesso pblica nos permite fazer.
Todas as definies na classe acima so pblicas. Isso basicamente
permite que usemos elas fora do bloco CLASS IMPLEMENTATION
ENDCLASS. Note que os atributo
pernr
e
wa_pa0002 foram usados dentro
do evento STARTOFSELECTION (que est fora da classe). Ainda, os
mtodos
load_personal_data e
write_personal_data tambm puderam ser
chamados fora do bloco de implementao da classe.

O que poderia melhorar no cdigo acima?

55

Orientao a Objetos em ABAP


Cpia de Marcos

Antes, as nossas definies j eram pblicas, mas simplesmente no


usvamos todas elas. Agora, usamos. O construtor foi removido no
exemplo acima justamente para dar a ideia de que ele no preciso
tecnicamente deste para preencher o atributo
pernr. Todavia, para que a
impresso dos dados pessoais funcione, preciso antes carregar
explicitamente os dados do empregado usando o mtodo
load_personal_data
. Da mesma forma, o mtodo
load_personal_data s
ir funcionar caso o atributo
pernr esteja carregado. E por ltimo,
precisamos preencher o atributo
pernr obrigatoriamente depois da
criao do objeto para evitar um DUMP (lembrese que no se pode tocar
usar referncias que no estejam apontando para algum objeto).
Nota: O mtodo construtor de instncia (
constructor
)
deve sempre ser
pblico caso usado.
Tivemos portanto que respeitar um sequenciamento lgico para que tudo
funcionasse de acordo. Quando possuamos o construtor no nosso cdigo,
o preenchimento e carregamento das informaes do empregado se dava
automaticamente quando o objeto era instanciado (criado). Isso fazia
com que tivssemos que nos preocupar menos em chamar o mtodo
corrego no momento correto.

4.3.2 PRIVATE SECTION


Esta nossa verso da classe lcl_employee no
encapsula os dados dos
objetos, o que considerada uma m prtica. Se comparado ao modelo
procedural, esta verso orientada a objetos mais perigosa pois consegue
modificar qualquer atributo de um objeto a qualquer momento. No
mundo procedural, h um encapsulamento automtico dentro das
variveis que so declaradas dentro do TOP include do grupo de funo.

56

Orientao a Objetos em ABAP


Cpia de Marcos

Elas no podem ser usadas em outros pontos de cdigo que no sejam os


mdulos de funo do mesmo grupo.
Para impedir que algum atributo seja acessado ou algum mtodo seja
chamado em qualquer ponto da aplicao, preciso definilo como
nopblico (PROTECTED ou PRIVATE). No momento, focaremos na
sesso
private
(PRIVATE SECTION).
Vamos adequar nossa classe lcl_employee para fazer uso da sesso
privada.
CLASSlcl_employeeDEFINITION.
PUBLICSECTION.

TYPESty_pernrTYPEpa0002

pernr.

METHODSconstructor
IMPORTING
i_personal_numberTYPEty_pernr.

METHODSwrite_personal_data.

PRIVATESECTION.

DATA
:
pernrTYPEty_pernr,
wa_pa0002TYPEpa0002.

METHODSload_personal_data.

ENDCLASS.

CLASSlcl_employeeIMPLEMENTATION.

METHODconstructor.
me
>
pernr
=
i_personal_number.

Chamada
dem

todoprivado.
*

Como
estamosdentro
do
blocodeimplementa
o
*
isso

permitido
me
>
load_personal_data
(

).

57

Orientao a Objetos em ABAP


Cpia de Marcos

ENDMETHOD.

METHODload_personal_data.

SELECT
*
UPTO
1
ROWS
FROMpa0002
INTOme
>
wa_pa0002
WHERE
pernr
=
me
>
pernr
ORDERBYenddaDESCENDING.

ENDSELECT.

ENDMETHOD.

METHODwrite_personal_data.
WRITE
:

{
me
>
wa_pa0002

pernr
}

{
me
>
wa_pa0002

cname
}

|
.
ENDMETHOD.

ENDCLASS.

DATA
:
r_employee_1TYPEREFTOlcl_employee,
r_employee_2TYPEREFTOlcl_employee,
r_employee_3TYPEREFTOlcl_employee.

START

OF

SELECTION.

CREATEOBJECTr_employee_1
EXPORTING
i_personal_number
=

'50000000'.

Erro
desintaxe

atributoprivado
*
r_employee_1
>
permr
=

'50000000'.

r_employee_2
=
NEWlcl_employee
(
i_personal_number
=

'50000002'

).
r_employee_3
=
NEWlcl_employee
(

'50000003'

).

Erro
desintaxe

metodoprivado
*
r_employee_1
>
load_personal_data
(

).

"Impressao
r_employee_1
>
write_personal_data
(

).
CALLMETHODr_employee_2
>
write_personal_data.

58

Orientao a Objetos em ABAP


Cpia de Marcos
r_employee_3
>
write_personal_data
(

).

Refatoramento de cdigo para usar sesso privada. Chamadas que geram


erro de sintaxe foram comentadas.
No exemplo acima, damos menos liberdade no que tange o uso da classe
lcl_employee, o que bom. Podemos basicamente fazer duas aes sobre
esta classe:
Criar objetos o que chama o mtodo construtor. Para criar um
objeto preciso informar um nmero de empregado
Imprimir informaes atravs da chamada do mtodo pblico
write_personal_data
A chamada do mtodo
load_personal_data volta a acontece dentro do
construtor da classe. A diferena agora que a chamada explcita deste
mtodo proibida, gerando um erro de ativao caso seja feita fora do
bloco de implementao da classe.
Dependendo da aplicao, poderamos ainda tornar o mtodo
write_personal_data privado e chamlo no fim do construtor. Neste
caso, bastaria criar o objeto empregado para que as informaes do
mesmo fossem carregadas e impressas.

Qual a vantagem de impedir o uso a um atributo ou mtodo?


Dar menos liberdade a quem usa a classe tende a ser uma boa prtica:
com menos opes de uso as chances de usar uma classe de maneira
errada diminuem.
Ainda, classes bem construdas tendem a evitar que objetos tenham
estados invlidos. Quando todos os atributos da classe lcl_employee
eram pblicos, era possvel preencher os dados do empregado (atributo

59

Orientao a Objetos em ABAP


Cpia de Marcos

wa_pa0002
) sem antes ter preenchido o nmero do empregado o que
no faz sentido. Atributos e mtodos definidos como privados se bem
usados evitam que objetos tenham valores que no fazem sentidos e que
chamadas desnecessrias sejam feitas.

4.4 Atributos e Mtodos de Instncia vs


Estticos
Um tema que costuma gerar confuso para muita gente a diferena de
atributos e mtodos de
instncia
com atributos e mtodos
estticos
.
J vimos que existem construtores: o de instncia (
constructor
) e o de
classe (
class_constructor
).
O construtor de instncia chamado quando se cria instncias (objetos),
enquanto o esttico chamado quando se usa a classe pela primeira vez.
Porm no somente o construtor que pode ser de instncia ou esttico.
Atributos e outros mtodos tambm podem pertencer a objetos
ou a
classes.
A mesma regra expressa anteriormente ainda se aplica: tudo que se
refere a classes declarado com um comando comeando em CLASS.

4.4.1 Atributos de instncia


Atributos de instncia so declarados usando o comando DATA dentro do
bloco de definio da classe. Cada atributo de instncia declara uma
varivel independente para cada um os objetos criados.
Os atributos declarados at ento foram todos de instncia, como
acontecia na classe lcl_ordem_de_venda.

60

Orientao a Objetos em ABAP


Cpia de Marcos

Objetos e seus atributos de instncia

4.4.2 Atributos estticos


Atributos estticos comumente so ditos como
pertencentes a classes.
Estes atributos podem ser usados independente de haver objetos criados,
como abaixo.
Veja o cdigo abaixo. Criamos uma nova classe responsvel por selecionar
textos (descries) de materiais. Cada objeto representa um material
distinto, o que razovel supondo que tal apliacao no faz seleo em
massa de materiais.
CLASSlcl_material_textsDEFINITION.
PUBLICSECTION.
CLASS

DATA
:
languageTYPEmakt

spras.

CLASS

METHODSclass_constructor.

ENDCLASS.

61

Orientao a Objetos em ABAP


Cpia de Marcos
CLASSlcl_material_textsIMPLEMENTATION.

METHODclass_constructor.
lcl_material_texts
=>
language
=

'P'.
ENDMETHOD.

ENDCLASS.

START

OF

SELECTION.

WRITE
:
lcl_material_texts
=>
language.

lcl_material_texts
=>
language
=

'E'.

WRITE
:
lcl_material_texts
=>
language.

Atributo esttico em uso

No cdigo acima, usamos um atributo sem ao menos ter criado um nico


objeto. Isso s possvel pois tal atributo esttico. Como tal atributo
est abaixo da sesso pblica, podemos uslo para leitura e escrita fora
da classe, como acontece no evento STARTOFSELECTION.

Um atributo esttico uma constante?


Absolutamente no. Esta a grande confuso gerada neste assunto. Uma
constante um objeto de dados
imutvel
, enquanto um atributo esttico
pode ter seu valor alterado normalmente, como feito no cdigo acima.
Voc ter razo em achar que o termo
esttico ento confuso, mas isso
no anula o fato de ser importante entendlo.
O construtor de classe foi criado para atribuir um valor inicial para nosso
atributo esttico. Contdo, podemos alterar tal valor posteriormente.
Dentro do construtor esttico a autoreferncia
me no existe pois no
temos um objeto sendo criado.

62

Orientao a Objetos em ABAP


Cpia de Marcos

Note que para acessar atributos estticos usamos uma seta ( => ) um
pouco diferente da que estvamos acostumados. Ainda, o termo a
esquerda da seta no uma referncia mas sim o prprio nome da classe.
Assim, alm de no precisarmos criar um objeto, no precisamos tambm
declarar uma referncia para fazer uso de atributos estticos.
Vamos incrementar nosso modelo usando vrios conceitos j abordados,
alm de criar alguns objetos e trabalhar com eles.
CLASSlcl_material_textsDEFINITION.
PUBLICSECTION.

TYPES
:
ty_material_idTYPEmakt

matnr,
ty_material_textTYPEmakt

maktx,
ty_languageTYPEmakt

spras.

CLASS

DATA
:
languageTYPEty_language.

CLASS

METHODSclass_constructor.

METHODSconstructor
IMPORTING
i_matnrTYPElcl_material_texts
=>
ty_material_id.

METHODSselect_text
RETURNINGVALUE
(
re_material_text
)
TYPElcl_material_texts
=>
ty_material_text.

PRIVATESECTION.

DATA
:
matnrTYPEty_material_id
,

"lcl_material_texts=>opcional
material_textTYPElcl_material_texts
=>
ty_material_text,
selected_languageTYPEty_language
.
ENDCLASS.

CLASSlcl_material_textsIMPLEMENTATION.

METHODclass_constructor.
lcl_material_texts
=>
language
=

'P'.
ENDMETHOD.

63

Orientao a Objetos em ABAP


Cpia de Marcos
METHODconstructor.
matnr
=
i_matnr
.

"me>opcional

me
>
material_text
=
me
>
select_text
(

).

ENDMETHOD.

METHODselect_text.

IFme
>
material_textISINITIALOR
lcl_material_texts
=>
language
<>
me
>
selected_language.

SELECTSINGLE
maktx
FROMmakt
INTOre_material_text
WHERE
matnr
=
matnr
"me>opcional
ANDspras
=
lcl_material_texts
=>
language.

IFsy

subrcISINITIAL.
me
>
selected_language
=
lcl_material_texts
=>
language.
me
>
material_text
=
re_material_text.
ENDIF.

ENDIF.

re_material_text
=
me
>
material_text.

ENDMETHOD.

ENDCLASS.

DATA
:
r_material_aTYPEREFTOlcl_material_texts,
r_material_bTYPEREFTOlcl_material_texts.

START

OF

SELECTION.

WRITE
:

|
Textos
em
{
lcl_material_texts
=>
language
}|.

r_material_a
=
NEWlcl_material_texts
(

'RF130'

).

r_material_b
=
NEWlcl_material_texts
(

'RT300'

).

64

Orientao a Objetos em ABAP


Cpia de Marcos
WRITE
:
/
r_material_a
>
select_text
(

),

/,
r_material_b
>
select_text
(

),

/,
NEWlcl_material_texts
(

'MMFUSIVEL30'

)>
select_text
(

).

lcl_material_texts
=>
language
=

'E'.
ULINE.

WRITE
:
/
r_material_a
>
select_text
(

),

/,
r_material_b
>
select_text
(

).

Exemplo com atributos de instncia e estticos

Pode parecer muito cdigo para resolver um problema pequeno (e ),


mas interessante notar caractersticas deste modelo.
Primeiro, vamos diferenciar graficamente os atributos de instncia
(declarados usando DATA) e o nosso nico atributo esttico (declarado
usando CLASSDATA).

65

Orientao a Objetos em ABAP


Cpia de Marcos

Representao de atributos de instncia e esttico


Cada objeto possui guarda em seus atributos o cdigo de um material, o
sua descrio e o idioma em que tal descrio foi selecionada
(selected_language).
Ainda, todos os objetos compartilham de um atributo chamado
language
que guarda o idioma no qual as descries sero buscadas, independente
do objeto. Poderamos ento criar 10 objetos e seus textos em portugus,
na sequncia alterar o atributo esttico para outro idioma e selecionar
textos de outros 15 objetos. A vantagem deste que no preciso repetir
o idioma a ser usado para a seleo dos textos para cada objeto.
Mais importante ainda, o fato do atributo privado poder ser usado
atravs da classe, como em:
lcl_material_texts
=>
language
=

'E'.

bem como utilizlo atravs de referncias a objetos, como em:


me
>
selected_language
=
lcl_material_texts
=>
language.

Logo, cuidado com a definio de atributos estticos que diz ser


atributos
que pertencem a classe pois isso no anula o fato de tais atributos
pertencerem (de maneira compartilhada porm) aos objetos tambm.
Resumidamente, atributos estticos so aqueles que no precisam de
objetos para serem usados, mas que caso sejam criados compartilham do
mesmo valor. O valor de atributos estticos podem ser alterados pela
classe ou por objetos, a diferena que tal alterao reflete em todas as
instncias da classe pois na verdade, existe apenas uma varivel
compartilhada por todos os objetos.

66

Orientao a Objetos em ABAP


Cpia de Marcos

4.4.3 Mtodos de instncia


Havendo entendido a diferena entre atributos de instncia e estticos,
fica bem simples entender a diferena entre mtodos de instncia e
estticos tambm.
Mtodos de instncia so declarados usando o comando METHODS no
bloco de definio de classe e implementados usando o bloco METHOD
ENDMETHOD no bloco de implementao.
Tais mtodos podem somente ser invocados usando a referncia a um
objeto. Como de costume, tal referncia no poder estar vazia pois isso
ocasiona um erro de execuo (DUMP).
Mtodos de instncia podem usar a autoreferncia (me) para ler e
alterar atributos do objeto sendo invocado, bem como ser utilizado para
a chamada de outros mtodos pertencentes ao mesmo objeto.
importante destacar que dentro de mtodos de instncia tambm
possvel ler e alterar atributos estticos, bem como invocar mtodos
estticos.

4.4.4 Mtodos estticos


A declarao de mtodos estticos segue a mesma regra do construtor de
classe (
class_constructor
): usase o comando CLASSMETHODS no bloco de
definio da classe e o bloco METHOD ENDMETHOD dentro do bloco de
implementao da classe.
Cuidado! O termo CLASS no usado no bloco de implementao!

67

Orientao a Objetos em ABAP


Cpia de Marcos

Mtodos estticos no necessitam de instncias criadas para serem


executados. Todavia, instncias tambm podem fazer uso destes.
Como tais mtodos de fato no pertencem a somente um objeto, a
autoreferncia
me no pode ser usada dentro de mtodos estticos,
mesmo que estes tenham sido invocados atravs de uma referncia de
objeto.

4.5 Herana
comum termos a possibilidade de reutilizar um trecho de cdigo, seja
tal reuso vlido dentro da aplicao ou feito em vrios programas
distintos.
Tambm frequente termos a necessidade de adaptar alguns pequenos
detalhes alm de ser fazer reuso de um trecho de cdigo.
A
herana uma maneira que a orientao a objetos prov de reutilizar
cdigo entre classes que so semelhantes.
Acompanhe o seguinte exemplo. No mdulo de SD, temos vrios tipos de
documentos diferentes. Dois documentos bem famosos so a cotao e a
ordem de venda.
Ambos documentos possui muito em comum: cabealho, itens, preos,
quantias. O cabealho destes dois tipos de documentos so armazenados
na mesma tabela: VBAK.
Uma das diferenas tcnicas destes documentos a transao usada para
exibir tal documento. Para exibir cotaes usase a transao VA23

68

Orientao a Objetos em ABAP


Cpia de Marcos

enquanto para exibio de ordens de venda a to conhecida VA03


utilizada.
Vamos escrever uma aplicao que seleciona uma cotao ou ordem de
venda para posterior exibio. Como ambos documentos tem muito em
comum, usaremos a herana para poder reutilizar boa parte do cdigo.

REPORTzoo_heranca.

CLASSlcl_documento_de_vendaDEFINITION.
PUBLICSECTION.

TYPES:
ty_idTYPEvbak

vbeln,
ty_headerTYPEvbak.

METHODSconstructor
IMPORTING
i_idTYPEty_id.

METHODSabrir.

DATAheaderTYPEty_header.

PRIVATESECTION.

METHODSselect_header
RETURNINGVALUE
(
re_header
)
TYPEty_header.

ENDCLASS.

CLASSlcl_documento_de_vendaIMPLEMENTATION.

METHODconstructor.
me
>
header

vbeln
=
i_id.
me
>
header
=
me
>
select_header
(

).
ENDMETHOD.

METHODselect_header.

69

Orientao a Objetos em ABAP


Cpia de Marcos

SELECTSINGLE*
FROMvbak
INTOre_header
WHERE
vbeln
=
me
>
header

vbeln.

ENDMETHOD.

METHODabrir.
SETPARAMETERID
'AUN'
FIELDheader

vbeln.
ENDMETHOD.

ENDCLASS.

CLASSlcl_cotacaoDEFINITION
INHERITINGFROMlcl_documento_de_venda.

PUBLICSECTION.
METHODSabrirREDEFINITION.

ENDCLASS.

CLASSlcl_cotacaoIMPLEMENTATION.

METHODabrir.

super
>
abrir
(

).
callTRANSACTION
'VA23'
ANDSKIPFIRSTSCREEN.
ENDMETHOD.

ENDCLASS.

CLASSlcl_ordem_de_vendaDEFINITION
INHERITINGFROMlcl_documento_de_venda.

PUBLICSECTION.
METHODSabrirREDEFINITION.

ENDCLASS.

CLASSlcl_ordem_de_vendaIMPLEMENTATION.

70

Orientao a Objetos em ABAP


Cpia de Marcos
METHODabrir.

super
>
abrir
(

).
callTRANSACTION
'VA03'
ANDSKIPFIRSTSCREEN.
ENDMETHOD.

ENDCLASS.

START

OF

SELECTION.

DATA
:
r_cotacaoTYPEREFTOlcl_cotacao.

createOBJECTr_cotacao
EXPORTING
i_id
=

'0020000162'.

r_cotacao
>
abrir
(

).

new
lcl_ordem_de_venda
(
i_id
=

'0000016197'

)>
abrir
(

).

Aplicao de herana
No exemplo acima, temos trs classes:
A nossa classe me
lcl_documento_de_venda,que possui cdigo a
ser reutilizado pois comum a ambos os documentos.
A classe filha
lcl_cotacao
, que exibe uma cotao na transao
VA23
A classe filha
lcl_ordem_de_venda
, que exibe uma venda na
transao VA03
Todos os atributos e mtodos pblicos so
herdados
para as classes filhas.
Isso significa que o mtodo
select_header pode apenas ser chamado na
nossa classe me.
Para tornar uma classe filha de outra necessrio adicionar a variao
INHERITING FROM na definio da classe filha. No h limite para o

71

Orientao a Objetos em ABAP


Cpia de Marcos

nmero de classes filhas que uma classe pode ter. Ainda, uma classe pode
apenas ter uma e somente me.
Podese no exemplo reutilizar o mtodo
abrir da classe me, que
simplesmente preenche o ID de parmetro necessrio para abrir qualquer
um dos dois documentos de venda.

4.5.1 Sesso protegida


Agora que voc j sabe a proposta da herana, um momento oportuno
para aprender a terceira e ltima sesso de visibilidade disponvel: a
sesso protegida
. Esta s se faz necessrio e til quando h herana na
sua aplicao.
Atributos e mtodos protegidos no podem ser usados fora do bloco de
implementao da classe. Porm, estes so herdados para a classes
filhas, netas, etc... Logo, caso coloquemos nosso mtodo
select_header
na sesso protegida, este poder ser chamado dentro das classes filhas.
Vamos adaptar um pouco o exemplo. As classes podero adiar a seleo
do cabealho do documento bem como exibir informaes adicionais
antes da exibio do documento em si.
Em especial, a classe de cotao mostrar o tipo do documento enquanto
a classe de ordem de venda ser capaz de mostrar a sua quantidade de
iten.
CLASSlcl_documento_de_vendaDEFINITION.
PUBLICSECTION.

TYPES:
ty_idTYPEvbak

vbeln,

72

Orientao a Objetos em ABAP


Cpia de Marcos
ty_headerTYPEvbak.

METHODSconstructor
IMPORTING
i_idTYPEty_id.

METHODSabrir.

DATAheaderTYPEty_header.

PROTECTEDSECTION
.

"Protegida!

METHODSselect_header
"mtodoserherdado
RETURNINGVALUE
(
re_header
)
TYPEty_header.

PRIVATESECTION.

ENDCLASS.

CLASSlcl_documento_de_vendaIMPLEMENTATION.

METHODconstructor.
me
>
header

vbeln
=
i_id.
ENDMETHOD.

METHODselect_header.

SELECTSINGLE*
FROMvbak
INTOre_header
WHERE
vbeln
=
me
>
header

vbeln.

ENDMETHOD.

METHODabrir.
SETPARAMETERID
'AUN'
FIELDheader

vbeln.
ENDMETHOD.

ENDCLASS.

CLASSlcl_cotacaoDEFINITION
INHERITINGFROMlcl_documento_de_venda.

73

Orientao a Objetos em ABAP


Cpia de Marcos
PUBLICSECTION.
METHODSabrirREDEFINITION.

ENDCLASS.

CLASSlcl_cotacaoIMPLEMENTATION.

METHODabrir.
me
>
header
=
me
>
select_header
(

).
MESSAGE
|
Cota

o
do
tipo
{
me
>
header

auart
}

|
TYPE
'I'.

super
>
abrir
(

).

CALLTRANSACTION
'VA23'
ANDSKIPFIRSTSCREEN.

ENDMETHOD.

ENDCLASS.

CLASSlcl_ordem_de_vendaDEFINITION
INHERITINGFROMlcl_documento_de_venda.

PUBLICSECTION.
TYPES
:
ty_itemsTYPETABLEOFvbap.

DATAt_itemsTYPEty_itemsREAD

ONLY.

METHODSconstructor
IMPORTING
i_id_vendaTYPElcl_documento_de_venda
=>
ty_id.
METHODSabrirREDEFINITION.
PRIVATESECTION.

METHODSselect_items.
ENDCLASS.

CLASSlcl_ordem_de_vendaIMPLEMENTATION.

METHODconstructor.

super
>
constructor
(
i_id
=
i_id_venda
).
me
>
select_items
(

).
ENDMETHOD.

74

Orientao a Objetos em ABAP


Cpia de Marcos

METHODabrir.
DATAno_linhasTYPEi.

super
>
abrir
(

).

DESCRIBETABLEme
>
t_itemsLINESno_linhas.
MESSAGE
|
Ordem
possui
{
no_linhas
}
itens
|
TYPE
'I'.

CALLTRANSACTION
'VA03'
ANDSKIPFIRSTSCREEN.

ENDMETHOD.

METHODselect_items.
SELECT*
FROMvbap
INTOTABLEme
>
t_items
WHERE
vbeln
=
me
>
header

vbeln.
ENDMETHOD.

ENDCLASS.

START

OF

SELECTION.

DATA
:
r_cotacaoTYPEREFTOlcl_cotacao.

CREATEOBJECTr_cotacao
EXPORTING
i_id
=

'0020000162'.

r_cotacao
>
abrir
(

).

NEWlcl_ordem_de_venda
(
i_id_venda
=

'0000016197'

)>
abrir
(

).

Sesso protegida Mtodo select_header herdado para classes filhas


No exemplo acima, tambm redefinimos o construtor da classe
lcl_ordem_de_venda
. Apesar de ser possvel realizar tal feito,

75

Orientao a Objetos em ABAP


Cpia de Marcos

necessrio destacar que para redefinio construtores, duas excesses se


aplicam:
No se pode usar a adio REDEFINITION basta declarar o
construtor novamente.
A chamada do construtor da classe me (
super>constructor
)
obrigatria.
Em outros mtodos que so herdados, a chamada usando a palavra
reservada
super opcional. Ela se refere a implementao na classe me
e pode ser til quando o cdigo existente na classe me precisa ser
reutilizado, acompanhado por alguma diferena implementada na classe
filha.
Nem todos os mtodos precisam ser redefinidos. Os mtodos que no so
redefinidos existem na classe filha (desde que pblicos ou protegidos)
com a mesma implementao.

4.6 Eventos
Com evento, possvel realizar a comunicao entre dois objetos de uma
maneira mais sofisticada que simplemente chamar um mtodo de um
objeto dentro de outro objeto. Isso pois possvel que um objeto
dispare um evento e automaticamente vrios outros objetos reajam a
este.
Este conceito muito til quando em algum ponto da aplicao, vrios
procedimentos, checagens, contas, validaes precisam ser feitas de
maneira independente uma das outras.
Ao trabalhar com eventos, sempre haver 4 passos que obrigatoriamente
iro ser realizados.

76

Orientao a Objetos em ABAP


Cpia de Marcos

1 Criao do evento
Um evento criado no bloco de definio da classe que possuir o
evento. Tal procedimento realizado usando o comando EVENTS
CLASSlcl_documentos_fiDEFINITION.

PUBLICSECTION.
EVENTS
:
documentos_selecionados.

(...)

2 Disparo do evento
O disparo do evento deve ser feito pelo mesmo objeto que possui o
evento. Isto feito atravs do comando RAISE EVENT.
METHODselect_documents.

(...)

RAISEEVENTdocumentos_selecionados.

(...)

ENDMETHOD.

Assim que um evento disparado, um conjunto de objetos (at de outras


classes) podem reagir a tal ocorrncia. Os passos 3 e 4 devem ser feitos
para cada uma das classes que podero reagir a evento definido e
disparado nos passos 1 e 2.
3 Definio do mtodo a ser automatizado

77

Orientao a Objetos em ABAP


Cpia de Marcos

A maneira a qual um objeto reage a algum evento atravs da chamada


automtica de pelo menos um de seus mtodos. A definio do mtodo
carrega a informao se este seja chamado automaticamente na
ocorrncia de um evento que deve ser especificado explicitamente.
METHODScaptura_documentos
FOREVENTdocumentos_selecionadosOFlcl_documentos_fi

4 Marcao de objetos que sero escutados


No quarto e ltimo passo, necessrio especificar quais instancias da
classe que dispara o evento sero escutadas, sendo possvel especificar
todas as instncias. Este passo realizado usando o comando SET
HANDLER. Note que neste passo especificado o mtodo utilizado no
passo 3.
START

OF

SELECTION.

DATA
(
r_relatorio
)

=
NEWlcl_relatorio
(

).

SETHANDLERr_relatorio
>
captura_documentosFORALLINSTANCES.

Eventos tambm podem ser instncia ou estticos e devem estar


presentes em alguma sesso de visibilidade.
Para exemplificar o uso de eventos, vamos criar uma aplicao com mais
de um requisito funcional.
Tal aplicao selecionar documentos financeiros e seus itens, presentes
nas tabelas BKPF e BSEG. Tal seleo feita atravs de uma tela de
seleo que possui um PARAMETER para uma empresa e um
SELECTOPTIONS para a data de lanamento dos documentos. Tal

78

Orientao a Objetos em ABAP


Cpia de Marcos

SELECTOPTIONS s permitir a entrada de um range de datas (adio no


NOEXTENSION).
Com o conjunto de documentos selecionados, necessrio:
1. Somar o crdito de todos os itens
2. Dividir o intervalo de datas do lanamento em duas metades e
calcular a soma de crdito ocorrido em cada uma destas metas
3. Somar o nmero de itens dentro dos critrios de seleo
Para resolver tal demanda neste caso, vamos criar 2 classes: Uma
responsvel pela seleo dos dados (chamada aqui de
lcl_documentos_fi)
e outra responsvel pelo clculo dos trs itens desejados (classe
lcl_contador_relatorio
).
Primeiro, a classe
lcl_documentos_fi.
CLASSlcl_documentos_fiDEFINITION.

PUBLICSECTION.

EVENTS
:
documentos_selecionados.

TYPES:
ty_empresaTYPEbkpf

bukrs,
ty_data_lancamentoTYPERANGEOFbkpf

budat,

BEGIN
OFty_key,
bukrsTYPEbkpf

bukrs,
belnrTYPEbkpf

belnr,
gjahrTYPEbkpf

gjahr,

END
OFty_key,

BEGIN
OFty_header.
INCLUDETYPEty_key.
TYPES
:
budatTYPEbkpf

budat,

END
OFty_header,

BEGIN
OFty_item.
INCLUDETYPEty_key.
TYPES
:
buzeiTYPEbseg

buzei,
shkzgTYPEbseg

shkzg
,

"Debito/Credito

79

Orientao a Objetos em ABAP


Cpia de Marcos
dmbtrTYPEbseg

dmbtr
,

"Valor

END
OFty_item,

tt_headersTYPEHASHEDTABLEOFty_header
WITHUNIQUEKEYbukrsbelnrgjahr,

tt_itemsTYPESORTEDTABLEOFty_item
WITHUNIQUEKEYbukrsbelnrgjahrbuzei.

DATA:
v_empresaTYPEty_empresaREAD

ONLY,
t_ra_data_lancamentoTYPEty_data_lancamentoREAD

ONLY,
t_headersTYPEtt_headersREAD

ONLY,
t_itemsTYPEtt_itemsREAD

ONLY.

METHODSconstructor
IMPORTING
iv_bukrsTYPEty_empresa
it_ra_budatTYPEty_data_lancamento.

PRIVATESECTION.

METHODSselect_documents.

METHODSselect_headers
RETURNINGVALUE
(
re_headers
)
TYPEtt_headers.

METHODSselect_items
IMPORTING
it_headersTYPEtt_headers
RETURNINGVALUE
(
re_documentos
)
TYPEtt_items.

ENDCLASS.

CLASSlcl_documentos_fiIMPLEMENTATION.

METHODconstructor.
me
>
v_empresa
=
iv_bukrs.
me
>
t_ra_data_lancamento
=
it_ra_budat.
me
>
select_documents
(

).
ENDMETHOD.

METHODselect_documents.

80

Orientao a Objetos em ABAP


Cpia de Marcos
me
>
t_items=
me
>
select_items(
it_headers
=
me
>
select_headers
(
)

).

RAISEEVENTdocumentos_selecionados.
ENDMETHOD.

METHODselect_headers.

SELECT
bukrs
belnr
gjahr
budat
FROMbkpf
INTOTABLEre_headers
WHERE
bukrs
=
me
>
v_empresa
ANDbudatINme
>
t_ra_data_lancamento.

IFsy

subrcISINITIAL.
me
>
t_headers
=
re_headers.
ENDIF.

ENDMETHOD.

METHODselect_items.

SELECT
bukrs
belnr
gjahr
buzei

shkzg
dmbtr
FROMbseg
INTOCORRESPONDINGFIELDSOFTABLEre_documentos
FORALLENTRIESINit_headers
WHERE
bukrs
=
it_headers

bukrs
ANDbelnr
=
it_headers

belnr
ANDgjahr
=
it_headers

gjahr.

81

Orientao a Objetos em ABAP


Cpia de Marcos
ENDMETHOD.

ENDCLASS.

Classe lcl_documentos_fi detentora do evento


Note
que
a
classe
documentos_selecionados,
select_documents.

acima
que

possui
um
chamado no

evento chamado
final do mtodo

Os objetos do tipo
lcl_documentos_fi portanto disparam seus eventos.
Criaremos agora a segunda classe que reagir ao evento em questo.
Alm disso, tal classe possui outros eventos usados nela internamente.

CLASSlcl_contador_relatorioDEFINITION.

PUBLICSECTION.
METHODScaptura_documentos
FOREVENTdocumentos_selecionadosOF
lcl_documentos_fi
IMPORTINGsender.

METHODSpercorre_itens.

DATAv_totalTYPElcl_documentos_fi
=>
ty_item

dmbtrREAD

ONLY.

DATA
:

BEGIN
OFwa_total_periodoREAD

ONLY,
primeiroTYPElcl_documentos_fi
=>
ty_item

dmbtr,
segundoTYPElcl_documentos_fi
=>
ty_item

dmbtr,

END
OFwa_total_periodo.

DATAv_quantidade_itensTYPEiREAD

ONLY.
PRIVATESECTION.

DATAr_documentosTYPEREFTOlcl_documentos_fi.

DATAv_metade_periodoTYPEd.

82

Orientao a Objetos em ABAP


Cpia de Marcos
EVENTSnovo_item
EXPORTING
VALUE
(
wa_item
)
TYPElcl_documentos_fi
=>
ty_item.

METHODScalcula_total
FOREVENTnovo_itemOFlcl_contador_relatorio
IMPORTINGwa_item.

METHODSsoma_periodo
FOREVENTnovo_itemOFlcl_contador_relatorio
IMPORTINGwa_item.

METHODSconta_item
FOREVENTnovo_itemOFlcl_contador_relatorio.

ENDCLASS.

CLASSlcl_contador_relatorioIMPLEMENTATION.

METHODcaptura_documentos.
me
>
r_documentos
=
sender.

DATA
(
lv_delta_days
)
=

(
me
>
r_documentos
>
t_ra_data_lancamento
[

]
high
me
>
r_documentos
>
t_ra_data_lancamento
[

]
low
).

v_metade_periodo=
me
>
r_documentos
>
t_ra_data_lancamento
[

]
low+

(
lv_delta_days
/

).

SETHANDLER:
me
>
calcula_totalFORme,
me
>
soma_periodoFORme,
me
>
conta_itemFORme.

ENDMETHOD.

METHODpercorre_itens.

LOOPATme
>
r_documentos
>
t_itemsINTODATA
(
lwa_item
).
RAISEEVENTnovo_item
EXPORTING
wa_item
=
lwa_item.
ENDLOOP.

83

Orientao a Objetos em ABAP


Cpia de Marcos

ENDMETHOD.

METHODcalcula_total.
IFwa_item

shkzg
=

'H'
.

"Credito
me
>
v_total
=
me
>
v_total
+
wa_item

dmbtr.
ENDIF.
ENDMETHOD.

METHODsoma_periodo.

IFwa_item

shkzg
=

'H'
.

"Credito

READTABLEme
>
r_documentos
>
t_headers
WITHTABLEKEY
bukrs
=
wa_item

bukrs
belnr
=
wa_item

belnr
gjahr
=
wa_item

gjahr
ASSIGNINGFIELD

SYMBOL
(<
wa_header
>).

IF
<wa_header>

budat
<
me
>
v_metade_periodo.
me
>
wa_total_periodo

primeiro=
me
>
wa_total_periodo

primeiro
+
wa_item

dmbtr.

ELSE.
me
>
wa_total_periodo

segundo=
me
>
wa_total_periodo

segundo
+
wa_item

dmbtr.
ENDIF.

ENDIF.
ENDMETHOD.

METHODconta_item.
ADD
1
TOme
>
v_quantidade_itens.
ENDMETHOD.

ENDCLASS.

Classe lcl_contador_relatorio, que reage a evento de lcl_documentos_fi


Do ponto de vista do evento
documentos_selecionados
, o passo trs foi
feito acima: foi definido que na ocorrncia de tal evento o mtodo

84

Orientao a Objetos em ABAP


Cpia de Marcos

captura_documentos ser invocado. A palavra


sender mais uma
reservada do ABAP (assim como
me
e super
) que denota o objeto que
disparou o evento.
Falta ainda realizar o ltimo passo que especifica quais objetos do tipo
lcl_documentos_fi
sero
ouvidos
pelas
instncias
de
lcl_contador_relatorio. Como o mtodo
captura_documentos pblico
podemos realiar tal procedimento fora do escopo da classe. Veja abaixo a
tela de seleo de aplicao e a instanciao dos objetos necessrios.

PARAMETER:
p_bukrs TYPE bkpfbukrs OBLIGATORY.
DATA v_budat TYPE bkpfbudat .
SELECTOPTIONS:
s_budat FOR v_budat NOEXTENSION OBLIGATORY.
STARTOFSELECTION.
DATA(r_relatorio) = NEW lcl_contador_relatorio( ).
SET HANDLER r_relatorio>captura_documentos FOR ALL INSTANCES.
DATA(r_documentos_fi) = NEW lcl_documentos_fi(
iv_bukrs = p_bukrs
it_ra_budat = s_budat[]
).
r_relatorio>percorre_itens( ).
WRITE:
|Total de crdito: { r_relatorio>v_total }|, /,
|Perodo 1: { r_relatorio>wa_total_periodoprimeiro }|, /
|Perodo 2: { r_relatorio>wa_total_periodosegundo } |,/,
|Quantidade Itens: { r_relatorio>v_quantidade_itens }|.

85

Orientao a Objetos em ABAP


Cpia de Marcos

Debugando a aplicao acima, possvel perceber que quando os


comandos RAISE EVENT so chamados, automaticamente a execuo
levada a todos objetos que esto ouvindo este evento, exatamente no
mtodo automatizado especificado no passo 3.

4.7 Classes de exceo


At ento criamos classes que representavam documentos de finanas,
materiais, empregados e outros
objetos de negcio.Existem outras
classes que representam erros. Para estas, damos o nome de classes de
exceo, pois erros no mundo perfeito erros deveriam ser a exceo de
uma aplicao.
Alm disso, tais classes permitem que as usemos em alguns comandos
especiais para tratamento de erros.
Voltando a fazer uma comparao com o mundo procedural, o tratamento
de erros feito baseado no comando RAISE, que dispara um erro a ser
verificado na chamada da funo. Caso a funo tenha resultado em erro
isso facilmente percebido pela varivel de sistema sysubrc.
O tratamento de erros no mundo orientado a objetos tem uma sequncia
lgica parecida, apesar dos comandos sendo usados serem diferentes.
O comando RAISE possui uma variao para classes de exceo enquanto a
verificao da ocorrncia do erro feita pelo comando TRY CATCH.
Semelhantemente do que acontece nos mdulos de funo onde so
declaradas as possveis excees na assinatura da funo, mtodos que
podem lanar erros declaram as classes de exceo em sua assinatura
tambm usando o comando EXCEPTIONS.

86

Orientao a Objetos em ABAP


Cpia de Marcos

Por definio uma classe de exceo deve ser herdeira da classe


CX_ROOT, mas no diretamente. No fazemos uma herana simples a
partir desta classe caso seja preciso criar uma classe de erro customizada
pois isso ocasiona um erro de sintaxe. Ao invs disso precisamos iniciar a
herana a partir da classe standard CX_STATIC_CHECK (que j herdeira
da classe CX_ROOT).
No diaadia, muito mais importante para nossa aplicao possuir uma
classe de exceo do que as funcionalidades de tal classe. Apesar de no
ser comum a necessidade de se criar atributos e mtodos em tais classes,
no h restrio quanto a isso.
Veja o cdigo que segue. Ao passar o nome de um usurio o programa
informa quem criou tal usurio. O interessante nesta aplicao
entender como o tratamento de erros realizado.
Primeiro, vamos criar classes de exceo que representam os dois
possveis erros: usurio bloqueado e usurio inexistente.

CLASSlcx_usuario_inexistenteDEFINITION
INHERITINGFROMcx_static_check.

ENDCLASS.

CLASSlcx_usuario_bloqueadoDEFINITION
INHERITINGFROMcx_static_check.

PUBLICSECTION.
CONSTANTS:
c_mensagemTYPEstringVALUE'Usuriobloqueado'.

ENDCLASS.

Classes de exceo

87

Orientao a Objetos em ABAP


Cpia de Marcos

Agora, teremos um mtodo que pode lanar tais excees.


CLASSlcl_seletor_usuarioDEFINITION.
PUBLICSECTION.

TYPES:
ty_user_nameTYPEusr02

bname,
ty_userTYPEusr02.

CLASS

METHODSseleciona_usuario
IMPORTING
iv_userTYPEty_user_name
RETURNING
VALUE
(
re_user
)
TYPEty_user
RAISING
lcx_usuario_inexistente
lcx_usuario_bloqueado.

ENDCLASS.

CLASSlcl_seletor_usuarioIMPLEMENTATION.
METHODseleciona_usuario.
SELECTSINGLE*
FROMusr02
INTOre_user
WHERE
bname=iv_user.

IFsysubrcISNOTINITIAL.
RAISEEXCEPTIONTYPElcx_usuario_inexistente.
ENDIF.

IFre_useruflagISNOTINITIAL.
RAISEEXCEPTIONTYPElcx_usuario_bloqueado.
ENDIF.
ENDMETHOD.
ENDCLASS.

Mtodo que pode disparar exceo

88

Orientao a Objetos em ABAP


Cpia de Marcos

Agora, basta implementar o ponto de partida da nossa aplicao


contemplando o tratamento de excees.

PARAMETERp_userTYPElcl_seletor_usuario
=>
ty_user_nameOBLIGATORY.

START

OF

SELECTION.

TRY.
DATA
(
v_criador
)

=
lcl_seletor_usuario
=>
seleciona_usuario
(
p_user
)
aname.

CATCHlcx_usuario_inexistente.
MESSAGE
'Usurioinexistente'
TYPE
'S'
DISPLAYLIKE
'E'.
STOP.

CATCHlcx_usuario_bloqueado
INTODATA
(
r_erro_user_bloqueado
).

MESSAGEr_erro_user_bloqueado
>
c_mensagem
TYPE
'S'
DISPLAYLIKE
'E'.
STOP.

ENDTRY.

WRITE:

|
Criador

do
usu

rio
{
p_user
}

{
v_criador
}

|.

Tratamento de exceo usando TRY CATCH.

Pontos importantes da aplicao acima:


Classes de exceo podem conter atributos e mtodos
Mtodo que pode disparar a exceo deve especificarlas no bloco
de definio da classe
Lanamento da exceo feito pelo comando RAISE EXCEPTION TYPE.
Neste momento, o ABAP est instanciando um objeto do tipo da
classe informada. Tal objeto pode ser capturado na clusula CATCH
caso necessrio.

89

Orientao a Objetos em ABAP


Cpia de Marcos

Clusula CATCH possui o nome das classes seguidas de uma


referncia a classe de exceo optional.

4.8 Interfaces
O termo
interface em orientao a objeto em nada tem a ver com
integrao entre sistemas como muitos se confundem.
Uma interface uma forma de tornar classes no relacionadas entre si
minimamente semelhantes, o que permite por exemplo deixar o cdigo
robusto atravs de uma tcnica conhecida como polimorfismo.
Apesar da herana tambm deixar classes semelhantes entre si, ela
deveria ser usada somente quando uma das classes uma verso
especial da outra. Ainda, no ABAP qualquer classe possui no mximo
uma classe me, enquanto uma interface pode ser usada em vrias
classes ao mesmo tempo que uma nica classe pode se fazer o uso de
vrias interfaces.
Pensemos num caso que sua aplicao precisa criar 3 objetos de negcio
diferentes: um material, uma ordem de venda e um lanamento em
finanas.
Estes trs cadastros so totalmente diferentes entre si, mas h algo que
queremos fazer com todos estes: o cadastramento de fato.
Para tornar nosso cdigo mais legvel, vamos ocultar chamadas de BAPIs e
mdulos de funo que realizam o cadastro efetivamente. Comecemos
pelas nossas 3 classes.

CLASSlcl_materialDEFINITION.

90

Orientao a Objetos em ABAP


Cpia de Marcos
ENDCLASS.

CLASSlcl_ordemDEFINITION.

ENDCLASS.

CLASSlcl_lancamentoDEFINITION.

ENDCLASS.

START

OF

SELECTION.

DATA
(
r_material
)

=
NEWlcl_material
(

).
DATA
(
r_ordem
)

=
NEWlcl_ordem
(

).
DATA
(
r_lancamento
)

=
NEWlcl_lancamento
(

).

Como queremos cadastrar todos os objetos de negcio, seria possvel


criar um mtodo chamado
cadastrar em todas as classes. Neste cenrio,
caso no futuro tivssemos que implementar a atualizao dos trs
documentos deveramos inserir um mtodo
atualizar em cada uma das
classes. Tal tipo de manuteno no cdigo muito mais comum do que se
imagina caso o conceito seja abstrado.
Ao invs de criar mtodos semelhantes em cada uma das classes, vamos
criar uma interface que tornar nossas classes semelhantes entre si.
INTERFACElif_objeto_negocio.

METHODScriar.

ENDINTERFACE.

CLASSlcl_materialDEFINITION.
PUBLICSECTION.
INTERFACESlif_objeto_negocio.

ENDCLASS.

CLASSlcl_materialIMPLEMENTATION.

91

Orientao a Objetos em ABAP


Cpia de Marcos
METHODlif_objeto_negocio~criar.
*CALLFUNCTION'Z_CRIA_MATERIAL'...
ENDMETHOD.
ENDCLASS.

CLASSlcl_ordemDEFINITION.
PUBLICSECTION.
INTERFACESlif_objeto_negocio.
ENDCLASS.

CLASSlcl_ordemIMPLEMENTATION.
METHODlif_objeto_negocio~criar.
*CALLFUNCTION'Z_CRIA_ORDEM'...
ENDMETHOD.
ENDCLASS.

CLASSlcl_lancamentoDEFINITION.
PUBLICSECTION.
INTERFACESlif_objeto_negocio.
ENDCLASS.

CLASSlcl_lancamentoIMPLEMENTATION.
METHODlif_objeto_negocio~criar.
*CALLFUNCTION'Z_CRIA_LANCAMENTO'...
ENDMETHOD.
ENDCLASS.

Implementao de interface
Com o cdigo acima, poderamos fazer a chamada do mtodo
criar
proveniente da interface sem ao menos saber com qual tipo de objeto
estamos trabalhando.
START

OF

SELECTION.

DATA
(
r_material
)

=
NEWlcl_material
(

).
DATA
(
r_ordem
)

=
NEWlcl_ordem
(

).
DATA
(
r_lancamento
)

=
NEWlcl_lancamento
(

).

DATA
:
t_obj_negocio
TYPETABLEOFREFTOlif_objeto_negocio,
r_obj_negocioTYPEREFTOlif_objeto_negocio.

92

Orientao a Objetos em ABAP


Cpia de Marcos

APPENDr_materialTOt_obj_negocio.
APPENDr_ordemTOt_obj_negocio.
APPENDr_lancamentoTOt_obj_negocio.

LOOPATt_obj_negocioINTOr_obj_negocio.
r_obj_negocio
>
criar
(

).
ENDLOOP.

Polimorfismo

No exemplo acima, temos uma tabela interna de referncias. A novidade


que as referncias esto atreladas a uma interface e no uma classe.

Como funciona uma referncia a interface?


Uma referncia a
classe pode apontar para qualquer objeto da classe
especificada depois do TYPE ou de alguma outra classe pertencente a
estrutura de herana da primeira.
J uma referncia a
interface a permite apontar
para qualquer objeto de
qualquer classe que implementa tal interface
.
Por implementar uma interface, entenda uma classe que possui o
comando INTERFACES dentro do seu bloco de definio.
A frase acima fica clara caso voc tenha entendido bem conceitos de
orientao a objetos.

93

Orientao a Objetos em ABAP


Cpia de Marcos

5 Conceitos Avanados
Conceitos considerados avanados na orientao a objetos no so
difceis de serem entendidos. O principal desafio saber apliclos ou
entendlos em aplicaes para que haja benefcio no desenvolvimento.

5.1 Abstrao
O conceito de abstrao s ser relevante caso sua aplicao trabalhe
com herana. Tanto uma classe como um mtodo podem ser considerados
abstratos.

5.1.1 Classes abstratas


Classes abstratas so simplesmente classes que no podem ser
instanciadas, ou seja, no se pode usar a instruo CREATE OBJECT ou
NEW para se criar objetos desta classe.

CLASSlcl_documentoDEFINITIONABSTRACT.

ENDCLASS.

CLASSlcl_ordem_de_vendaDEFINITION
INHERITINGFROMlcl_documento.

ENDCLASS.

CLASSlcl_requisicao_de_compraDEFINITION
INHERITINGFROMlcl_documento.

ENDCLASS.

DATA
:
r_documentoTYPEREFTOlcl_documento
,

"ABSTRATO
r_ordem_de_vendaTYPEREFTOlcl_ordem_de_venda,
r_requisicao_de_compraTYPEREFTOlcl_requisicao_de_compra.

94

Orientao a Objetos em ABAP


Cpia de Marcos

START

OF

SELECTION.

r_ordem_de_venda
=
NEWlcl_ordem_de_venda
(

).
r_requisicao_de_compra
=
NEWlcl_requisicao_de_compra
(

).
*
r_documento
=

new
lcl_documento
(

).

"ERRODESINTAXE
r_documento
=
NEWlcl_ordem_de_venda
(

).

Exemplo de classe abstrata

Note que ainda possvel usar uma referncia a uma classe abstrata.
Todavia tal referncia ao ser preenchida deve apontar para algum objeto
de classe herdeira e da classe abstrata.

5.1.2 Mtodos abstratos


Um mtodo abstrato simplesmente um mtodo cuja redefinio na
classe filha obrigatria. Por definio um mtodo abstrato deve
pertencer a uma classe abstrata.
A abstrao de um mtodo faz com que no seja possvel implementlo
no bloco de implementao da mesma classe. Em outras palavras, a
classe abaixo est sintaticamente correta.
CLASSlcl_saida_templateDEFINITIONABSTRACT.
PROTECTEDSECTION.
METHODSimprimirABSTRACT.
ENDCLASS.

Mtodo abstrato
No caso acima, estamos forando a herana da classe lcl_saida_template
e
a redinio do mtodo
imprimir.
CLASSlcl_saida_templateDEFINITIONABSTRACT.
PROTECTEDSECTION.
METHODSimprimirABSTRACT.

95

Orientao a Objetos em ABAP


Cpia de Marcos
ENDCLASS.

CLASSlcl_saida_alvDEFINITION
INHERITINGFROMlcl_saida_template.

PROTECTEDSECTION.
METHODSimprimirREDEFINITION
.

"Obrigatorio

ENDCLASS.

CLASSlcl_saida_alvIMPLEMENTATION.

METHODimprimir.

"exibeALV
ENDMETHOD.

ENDCLASS.

Redefinio de mtodo abstrato

5.2 Final
O conceito de
finalizao
(ou simplesmente o comando FINAL) usado
quando querse
evitar
o uso de herana.

5.2.1 Classes Final


Uma classe final simplesmente no pode ser herdada.
CLASSlcl_saida_alvDEFINITIONFINAL.

ENDCLASS.

Classe final

E por que eu iria evitar que algum herdasse minha classe?

96

Orientao a Objetos em ABAP


Cpia de Marcos

Um bom motivo para evitar que manutenes impensadas sejam feitas.


Principalmente quando a classe FINAL standard. Assim, a SAP pode
evitar que o desenvolvedor ABAP do cliente herde uma classe standard
para deturpar seu comportamento.

5.2.2 Mtodos Final


De forma semelhante, mtodos FINAL so aqueles que no podem ser
redefinidos.
CLASSlcl_saida_alvDEFINITION.
PUBLICSECTION.
METHODSformat_columnsFINAL.

ENDCLASS.

CLASSlcl_saida_alvIMPLEMENTATION.
METHODformat_columns.

"Unicaimplementacaopossivel

"naopossvelredefinir

"estemtodo
ENDMETHOD.
ENDCLASS.

Mtodo Final

5.3 Gerao de Instncia


Destes pequenosgrandes detalhes da orientao a objetos, a
gerao de
instncia talvez seja o mais complicado de entender. Mas isso no quer
dizer que seja difcil demais.
Quando uma classe criada, por padro podemos criar quantas
referncias quisermos a ela e utilizlas para criar diversos objetos.

97

Orientao a Objetos em ABAP


Cpia de Marcos

Podemos ento instanciar objetos em qualquer local de uma aplicao


ABAP: dentro do STARTOFSELECTION, PBO, PAI, dentro de um mdulo
de funo ou at dentro de um mtodo.
A gerao de instncia permite definir onde objetos de uma classe podem
ser criados. Isso feito com a extenso CREATE PUBLIC | PROTECTED |
PRIVATE na declarao de uma classe. A diferena destas trs
possibilidades destacada a seguir:
Pblica (padro): Podese criar objetos em qualquer lugar da
aplicao
Protegido: Pode apenas criar objetos dentro da classe em si ou
dentro de uma classe filha (logo, neste caso h herana)
Privado: Somente a prpria classe pode criar objetos com seu tipo.
Exemplo:
CLASSlcl_impressoraDEFINITIONCREATEPRIVATE.

PUBLICSECTION.

CLASS

METHODScria_impressora
RETURNINGVALUE
(
re_nova_impressora)
TYPEREFTOlcl_impressora.

ENDCLASS.

CLASSlcl_impressoraIMPLEMENTATION.

METHODcria_impressora.

"criacaodeobjetosspodeacontecer

"dentrodaprpriaclasse
re_nova_impressora
=
NEWlcl_impressora
(

).
ENDMETHOD.

ENDCLASS.

Gerao de Instncia Privada somente a classe pode criar seus prprios


objetos

98

Orientao a Objetos em ABAP


Cpia de Marcos

99

Orientao a Objetos em ABAP


Cpia de Marcos

6 Concluso
Com os conceitos apresentados no livro, voc deve estar apto a se
aventurar nos diversos frameworks ABAP como Web Dynpro, Gateway e
BOPF.
Bons estudos!

100

Anda mungkin juga menyukai