Escolar Documentos
Profissional Documentos
Cultura Documentos
ABAP Objects
.
.
MANUAL DO PARTICIPANTE
TREINAMENTO CONDUZIDO PELO INSTRUTOR
.
Versão do curso: 18
Duração do curso: 5 Dias
Número de material: 50148232
Esteja ciente de que este curso foi traduzido por uma máquina e por isso pode não ter
a mesma precisão de uma tradução humana. Em caso de dúvida, consulte a versão em
inglês dos EUA.
SAP Direitos autorais, marcas
registradas e isenções de
responsabilidade da SAP
Demonstração
Procedimento
Advertência ou cuidado
Dica
Título da janela
PÚBLICO-ALVO
Este curso destina-se aos seguintes públicos:
● Consultor de aplicação
● Consultor de desenvolvimento
● Desenvolvedor
Lição 1
Explicação do modelo de programação orientado a objetos 3
Lição 2
Análise e design com Unified Modeling Language (UML) 15
OBJETIVOS DO CAPÍTULO
SÍNTESE DA LIÇÃO
Esta lição fornece uma síntese dos conceitos-chave da programação ABAP utilizando o
modelo orientado a objetos.
Exemplo de negócio
Você precisa explicar o modelo de programação orientado a objetos e suas vantagens para
seu gerente de projeto de desenvolvimento. Por esse motivo, você precisa:
● Compreensão da programação procedimental e orientada a objetos
● Compreensão de objetos ABAP
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Descrever as diferenças entre os modelos de programação procedimental e orientado a
objetos
Evolução do ABAP
Figura 2: Folie 1
Grupos de funções
Instanciação múltipla
Para que o programa principal funcione com vários veículos, é necessário que haja
programação adicional e esforço administrativo. Um grupo de funções só pode fazer
referência a um veículo de cada vez.
Os objetos são armazenados no mesmo modo interno que o programa em uso. Todas as
áreas de dados são separadas umas das outras, o que as mantém protegidas.
ABAP Objects
Os conceitos orientados a objetos do ABAP Objects compartilham conceitos com outras
linguagens modernas orientadas a objetos, como C++ ou Java. Os conceitos que não tiveram
êxito em outros idiomas não foram incluídos no ABAP Objects. Por outro lado, o ABAP
Objects tem elementos de linguagem úteis que C++ e Java não têm. Certos recursos do
ABAP Objects só existem devido à compatibilidade ascendente garantida dos elementos de
linguagem ABAP mais antigos. A diferença entre ABAP Objects e outras linguagens
orientadas a objetos é o ambiente de desenvolvimento. Você pode utilizar o conjunto
completo de funções do ABAP Workbench com o ABAP Objects.
Você pode utilizar instruções ABAP Objects em programas ABAP procedural.
O ABAP Objects não é um novo idioma, mas foi projetado como uma extensão sistemática do
ABAP. Todas as extensões, incluindo as antigas partes processuais, são compatíveis com a
alta.
As verificações de tipo nos contextos orientados a objetos do ABAP Objects são mais
rigorosas do que as dos contextos procedurais.
Para desenvolver ABAP Objects, a SAP limpou a linguagem ABAP nos contextos orientados a
objetos. Isso significa que as instruções obsoletas originam erros de sintaxe.
Nota:
É aconselhável evitar declarações obsoletas no ambiente puramente processual,
pois cria um texto fonte mais seguro e flexível. No entanto, como a linguagem é
compatível para cima, não é possível impedir o uso completo de tais afirmações.
Os objetos podem executar as duas funções simultaneamente. eles podem oferecer serviços
a outros objetos enquanto solicitam serviços ao mesmo tempo.
Na programação orientada a objetos, os serviços são distribuídos entre os objetos de modo
que não haja redundâncias e cada objeto oferece exatamente os serviços pelos quais é
responsável. Se um objeto necessitar de outros serviços, ele solicita os mesmos de outros
objetos. Esse conceito é conhecido como o princípio da delegação.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Descrever as diferenças entre os modelos de programação procedimental e orientado a
objetos
SÍNTESE DA LIÇÃO
Esta lição explica como desenvolver uma solução orientada a objetos para um problema de
aplicação empresarial. Ela também explica como classificar seus objetos e definir as relações
entre eles usando partes da Linguagem de Modelagem Unificada (UML) como um auxílio
visual.
Exemplo de negócio
Você precisa modelar um requisito de aplicação empresarial antes de implementar a
aplicação empresarial. Por esse motivo, você precisa:
● Compreensão dos diagramas de classe
● Compreender os diagramas de objetos
● Compreender os diagramas de sequência
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Classificar objetos
● Modelo em UML
Classificação de objetos
A programação orientada a objetos vê o mundo real como uma coleção de objetos, como
aviões, carros e pessoas. Alguns destes objetos são semelhantes. Em outras palavras, os
objetos podem ser descritos da mesma forma se usarem as mesmas características e
exibirem o mesmo comportamento.
Você pode agrupar todas as características e comportamentos desses objetos semelhantes
em uma classe central. Esta classe é usada para descrever cada objeto derivado dela.
Portanto, uma classe é uma descrição de uma quantidade de objetos que exibem as mesmas
características e o mesmo comportamento.
Por exemplo, o veículo (make x, ..., model n), é um objeto da classe car. Este objeto é uma
instância concreta de sua classe. Por isso, um objeto tem uma identidade, um status (número
de instâncias de característica) e um comportamento. Os conceitos de identidade e status
são diferentes um do outro.
A identidade é um atributo que distingue cada objeto de todos os outros objetos de sua
classe. Dois objetos podem ter valores de atributo idênticos, mas esses objetos podem não
ser idênticos. Por exemplo, duas xícaras de café têm a mesma altura, diâmetro, alça e cor.
Embora seus status sejam idênticos, são duas xícaras de café diferentes.
A literatura sobre o tema da programação orientada a objetos fala sobre instâncias. O termo
instância significa um objeto.
Nota:
O significado literal da instância é um pouco mais específico. Isso significa que a
instância de uma classe é identificável de forma única. Neste capítulo, você fará
uma distinção entre instância e objeto.
Modelagem em UML
Diagramas de classe
Os diferentes tipos de diagrama em UML representam diferentes visões de um sistema.
● Diagramas de classe
Os diagramas de classe exibem as relações entre as classes. Esta é uma visão estática de
um modelo.
● Diagramas de comportamento
Os diagramas de comportamento mostram a sequência em que os objetos se relacionam.
● Diagramas de componente
Você pode utilizar ABAP Objects para implementar diagramas de classe e diagramas de
comportamento de uma perspectiva de programação.
Os diagramas de componentes podem ser realizados utilizando o pacote de objetos do
repositório.
Os atributos descrevem os dados que podem ser armazenados nos objetos de uma classe.
Eles também determinam o status de um objeto. Os métodos descrevem as funções que um
objeto pode executar. Eles determinam como um objeto se comporta.
Associação
um cliente reserva um veículo em uma empresa locadora de veículos.
Generalização e especialização
Um carro, um ônibus e um caminhão são todos veículos.
Nota:
As classes também podem ser exibidas em diagramas de classe com seus
atributos e métodos. Neste exemplo de um diagrama de classes, esses atributos e
métodos foram omitidos para melhorar a clareza.
Associação
Uma associação descreve uma relação semântica entre classes. A relação específica entre os
objetos nessas classes é conhecida como ligação de objetos. Por isso, as ligações de objetos
indicam associações.
No entanto, uma associação também pode ser recursiva. Nesse caso, a classe teria uma
relação consigo mesma.
Na maioria dos casos, as associações recursivas são utilizadas para ligar dois objetos
diferentes na mesma classe.
Cada associação tem duas funções, uma para cada direção da associação. Cada função pode
ser descrita por um nome de associação. Cada função tem uma cardinalidade que mostra
quantas instâncias podem participar nessa relação. A multiplicidade é o número de objetos
participantes em uma classe que têm uma relação com um objeto na outra classe. Como
todos os outros elementos do modelo, as cardinalidades são dependentes da situação
concreta que está sendo modelada.
Neste exemplo, você também pode exigir uma cardinalidade de pelo menos um para indicar
que somente alguém que realmente faz uma reserva se torna um cliente da locadora de
veículos. Por outro lado, a cardinalidade de qualquer número permitiria uma definição mais
geral de um cliente.
As características da associação são as seguintes:
● Representa uma associação entre símbolos de classe desenhando uma linha entre eles.
● Indique a cardinalidade (também referida como multiplicidade) da relação no fim de cada
linha.
● Você deve usar as setas para indicar as opções de navegação.
● Você deve escrever o nome da associação em itálico acima da linha. O nome pode conter
uma seta para indicar a direção da leitura.
● Insira os nomes das funções no final das linhas se o modelador definir funções para os dois
parceiros.
Você pode utilizar nomes de função no fim das linhas de associação para descrever as
relações entre as classes envolvidas. Na figura, Exemplos de associação com funções, uma
pessoa pode aparecer na função de um empregado ou na função de um diretor da empresa.
Na associação recursiva mostrada na figura, Exemplos de associação com funções, as
funções de filho e pai são definidas usando nomes de função. Duas instâncias da classe
LCL_PERSON têm uma relação entre si e representam duas funções.
Classes de associação
Se a associação for utilizada para ligar duas classes, uma classe especial pode representar
essa relação.
As características da relação são descritas utilizando os atributos da classe de associação.
Uma linha pontilhada conecta esta classe à linha de associação.
Agregação e composição
A agregação e a composição aparecem como uma linha entre duas classes. Eles são
rotulados usando um pequeno rombo. O rombo indica a agregação ou composição. Caso
contrário, as convenções de notação são as mesmas utilizadas para associações.
A composição é uma especialização da agregação. Composição significa que o objeto contido
não pode existir sem a agregação (por exemplo, uma reserva de veículo não pode existir sem
a agência de locação de veículos). Por isso, a cardinalidade deste tipo de agregado é pelo
menos um. O tempo de duração das partes individuais está ligado ao tempo de duração do
agregado. Isso significa que as partes são criadas ao mesmo tempo que o agregado ou após o
agregado e são destruídas ao mesmo tempo que o agregado ou antes do agregado. Na
notação UML, um rombo preenchido denota composição.
Generalização e especialização
diagramas de objeto
Diagramas de sequência
Na notação UML, a linha de vida do objeto é representada por linhas verticais pontilhadas
com uma caixa contendo o nome do objeto no topo. Um X é utilizado para indicar o fim da
linha da vida. O foco do controle aparece como um retângulo vertical na linha de vida do
objeto. O foco do controle mostra o período ativo do objeto.
Os status possíveis de um objeto são os seguintes:
● Um objeto está ativo quando ações são executadas.
● Um objeto está indiretamente ativo se estiver esperando o encerramento de um
procedimento subordinado.
O princípio de delegação
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Classificar objetos
● Modelo em UML
Avaliação da aprendizagem
X Verdadeiro
X Falso
3. Qual das seguintes opções é uma simplificação das relações complexas no mundo real?
Escolha a resposta correta.
X A Herança
X B Abstração
X C Encapsulamento
X D Controle de evento
4. Qual tipo de diagrama UML presta especial atenção à sequência em que os objetos se
relacionam?
Escolha a resposta correta.
X A Classe
X B Comportamento
X C Componente
X D Objeto
X Verdadeiro
X Falso
X Verdadeiro
X Falso
3. Qual das seguintes opções é uma simplificação das relações complexas no mundo real?
Escolha a resposta correta.
X A Herança
X B Abstração
X C Encapsulamento
X D Controle de evento
4. Qual tipo de diagrama UML presta especial atenção à sequência em que os objetos se
relacionam?
Escolha a resposta correta.
X A Classe
X B Comportamento
X C Componente
X D Objeto
X Verdadeiro
X Falso
Você está correto! A programação orientada a objetos vê o mundo real como uma coleção
de objetos. Alguns desses objetos são semelhantes e podem ser descritos da mesma
forma se usarem as mesmas características e apresentarem o mesmo comportamento.
Você pode agrupar todas as características e comportamentos desses objetos
semelhantes em uma classe central. Leia mais na tarefa Classificação de objetos, na lição
Análise e design com Unified Modeling Language (UML), no curso, BC401.
Lição 1
Criação de classes locais 35
Lição 2
Criar objetos 49
Lição 3
Acessar métodos e atributos 55
Lição 4
Implementação de construtores em classes locais 61
Lição 5
Implementação de construtores de classe em classes locais 65
OBJETIVOS DO CAPÍTULO
SÍNTESE DA LIÇÃO
Esta lição fornece uma síntese de classes, atributos e métodos locais, que são os elementos
de sintaxe fundamentais orientados a objetos.
Exemplo de negócio
Como desenvolvedor, você precisa implementar classes, objetos e associações do seu
modelo no ABAP Objects.
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Definir classes locais
● Definir atributos
● Criar métodos
O conceito de classes é a base da programação orientada a objetos. Uma classe pode ter
componentes públicos ou privados. Você pode acessar componentes públicos, como
métodos e eventos, de fora de uma classe. No entanto, você não pode acessar componentes
privados, por exemplo, tipos de dados e atributos, de fora de uma classe.
A figura, Um exemplo de classe, mostra um veículo como um exemplo de uma classe.
Declaração de atributos
Os atributos contêm os dados que podem ser armazenados nos objetos de uma classe.
Os tipos de atributos são os seguintes:
● Objeto de dados elementares
● Estruturado
● Tipo de tabela
Os atributos podem ser compostos por tipos de dados (locais ou globais) ou tipos de
referência.
Tabela 1: Atributos
A tabela seguinte exibe alguns exemplos de atributos para a classe LCL_VEHICLE:
Atributos Descrição
MAKE Marca do veículo
MODEL Tipo de modelo
SER_NO Número de série
COLOR Cor
MAX_SEATS Número de lugares
R_MOTOR Referência à classe LCL_MOTOR
Na classe Instruções DATA, você só pode utilizar o suplemento TYPE para referenciar tipos
de dados.
O suplemento LIKE só é permitido para objetos de dados locais ou campos SY (por exemplo,
SY-DATE, SY-UNAME, etc.).
O suplemento READ-ONLY indica que um atributo público declarado com DATA pode ser lido
de fora. No entanto, o atributo só pode ser modificado por métodos da mesma classe.
Atualmente, você pode utilizar o suplemento READ-ONLY na área de visibilidade pública
(PUBLIC SECTION) de uma declaração de classe ou em uma definição de interface.
Com TYPE REF TO, você pode digitar um atributo como referência.
A instrução CONSTANTS é utilizada na definição de classe para definir objetos de dados que
têm um valor constante.
Se você utilizar a instrução TYPES na definição de classe, você está declarando um tipo local
específico para essa classe local. Você pode criar um tipo local a ser utilizado por um ou mais
atributos na mesma classe.
Visibilidade de atributos
Os atributos privados não podem ser endereçados diretamente de fora da classe e não são
visíveis para usuários externos. Você pode proteger atributos de acesso externo,
caracterizando-os como atributos privados.
Nota:
O conceito amizade é uma exceção a esta regra.
Os atributos públicos são atributos visíveis para todos os usuários e que podem ser
acessados diretamente por usuários externos.
Da mesma forma, as constantes e os tipos definidos por uma classe podem ser privados
(para uso dentro da classe) ou públicos (acessíveis de fora da classe). Os componentes
públicos de uma classe são conhecidos coletivamente como a interface de classes.
A utilização da área de visibilidade privada é conhecida como ocultação ou encapsulamento
de informações. O encapsulamento protege um usuário de classe fazendo alterações em
componentes privados invisíveis ao usuário externo.
Você pode modificar os componentes privados de uma classe sem modificar a interface.
Suponha que os componentes privados de uma classe são alterados em algum momento
com sua interface permanecendo a mesma, os usuários externos ainda podem continuar a
trabalhar com a classe como antes. Os usuários externos só podem acessar os componentes
por meio da interface da classe e não perceberão as alterações da implementação interna nas
SEÇÕES PRIVADAS. No entanto, quando os componentes públicos de uma classe são
modificados, cada usuário externo deve considerar essas modificações. Portanto, utilize
atributos públicos com moderação, ou evite fazer alterações incompatíveis em componentes
públicos.
Cuidado:
Um objeto de dados de número inteiro é definido para contar instâncias. Não é
possível saber o número de instâncias criadas a partir do sistema.
Implementação de métodos
Assinatura de método
Nota:
Não utilize os dois conceitos juntos em um programa.
Visibilidade de métodos
Você atribui métodos a uma área de visibilidade para determinar se os métodos são
chamados de fora da classe ou a partir da classe. Métodos privados permitem modularização
interna.
Nota:
Este é um exemplo introdutório. Mais tarde, você aprenderá mais técnicas de
programação para avaliar parâmetros formais.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Definir classes locais
● Definir atributos
● Criar métodos
SÍNTESE DA LIÇÃO
Isso explica menos em o conceito de criação de objetos.
Exemplo de negócio
Como desenvolvedor, você quer criar várias instâncias para a classe local que criou em seu
projeto ABAP Objects. Por esse motivo, você precisa compreender como criar objetos.
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Criar objetos
Dica:
Embora você possa utilizar classes e componentes estáticos para escrever
aplicações completas, o motivo para utilizar a programação orientada a objetos
é criar e trabalhar com instâncias de tempo de execução de classes.
A instrução DATA go_vehicle le1 TYPE REF TO lcl_vehicle define uma variável de referência.
Esta variável pode apontar para instâncias da classe lcl_vehicle. O valor inicial de uma variável
de referência é uma referência vazia, ou seja, a referência não aponta para nada.
Criar objetos
O coletor de lixo
Referências independentes são referências que não foram definidas dentro de uma classe. O
coletor de lixo é uma rotina que é iniciada automaticamente sempre que o sistema de tempo
de execução não tiver tarefas mais importantes para executar.
Neste exemplo, a referência ao objeto (2) LCL_OBJECT é inicializada. No entanto, não existe
nenhum ponto de referência subsequente para este objeto. Por isso, o coletor de lixo elimina
o objeto não referenciado. Como não há um ponto de referência para o objeto (4)
LCL_OBJECT, ele também é excluído.
Você pode usar a consulta lógica IF go_obj IS INITIAL para determinar se go_obj contém a
referência nula ou não aponta para nenhum objeto.
Cuidado:
Você pode ter referências a objetos e referências de dados. No caso de
referências de dados, não utilize IS BOUND. No caso de referências a objetos,
você pode trabalhar com IS INITIAL e IS BOUND.
Várias instâncias
Para manter vários objetos da mesma classe em seu programa, você pode definir uma tabela
interna com uma coluna que contenha as referências a objetos para essa classe. Para
atualizar os objetos na tabela, você pode utilizar instruções para tabelas internas, como
APPEND, READ ou LOOP.
Exemplo de agregação
Os objetos na classe LCL_WHEEL têm sua própria identidade. Você pode criar objetos
independentemente da existência de um objeto na classe LCL_VEHICLE. As referências são
transferidas para objetos da classe LCL_VEHICLE, de modo a criar a associação desejada.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Criar objetos
SÍNTESE DA LIÇÃO
Esta lição explica o processo de acesso a métodos e atributos.
Exemplo de negócio
Como desenvolvedor, você precisa explicar as várias formas de acessar métodos e atributos
de uma classe. Por esse motivo, você precisa:
● Compreensão de métodos de chamada
● Compreensão do acesso a atributos
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Chamar métodos de instância
● Chamar métodos estáticos
● Chamar métodos funcionais
● Acessar atributos públicos
Esta seção explica o uso de classes e suas instâncias, desde as conexões estáticas de várias
instâncias até seus efeitos práticos.
O exemplo na figura, Chamando métodos, mostra a sintaxe mais curta para chamadas de
método nas quais o prefixo CALL-METHOD é omitido.
Os métodos que têm o parâmetro RETURNING são descritos como métodos funcionais. O
parâmetro RETURNING deve ser sempre passado por valor - RETURNING VALUE(...) - e não
por referência.
Nota:
Antes do SAP NetWeaver 7.40, os métodos funcionais só permitiam parâmetros
IMPORTING e exceções, além de seus parâmetros RETURNING. A partir do SAP
NetWeaver 7.40, eles podem ter qualquer número de parâmetros EXPORTING e
CHANGING.
Nota:
No SAP NetWeaver 7.02, a lista de posições nas quais os métodos funcionais
podem ser utilizados foi ampliada consideravelmente.
Você pode acessar atributos públicos de fora da classe da mesma forma que chamadas de
método. Você pode acessar atributos estáticos utilizando
CLASSNAME=>STATIC_ATTRIBUTE. Acessar atributos de instância com REF-
>INSTANCE_ATTRIBUTE.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Chamar métodos de instância
● Chamar métodos estáticos
● Chamar métodos funcionais
● Acessar atributos públicos
SÍNTESE DA LIÇÃO
Esta lição explica a implementação de métodos de construtor em classes locais.
Exemplo de negócio
Como desenvolvedor, você deve explicar a criação e utilização de construtores de instância
para a classe em seu projeto ABAP Objects. Por esse motivo, você precisa:
● Compreensão de construtores de instância
● Compreensão de como utilizar construtores de instância
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Criar e utilizar construtores
Construtor de instância
Existem dois tipos de métodos no ABAP Objects. Os ABAP Objects podem ser chamados
implícita ou explicitamente com a sintaxe CALL METHOD. Os construtores são o primeiro tipo
de método.
O construtor de instância é um método de instância especial em uma classe e é sempre
chamado CONSTRUCTOR. O construtor é automaticamente chamado com a instrução
CREATE OBJECT, no momento da execução.
Ao definir construtores, considere sempre os seguintes pontos:
● Nenhuma classe pode ter mais de um construtor de instância.
● Um construtor deve ser definido na área pública.
● A assinatura do construtor só pode incluir parâmetros de importação e exceções.
● Quando são acionadas exceções no construtor, não são criadas instâncias e não é
ocupado nenhum espaço de memória principal.
● Com exceção de um caso único, você não pode chamar o construtor explicitamente.
Nota:
Não existe nenhum destrutor em ABAP Objects, ou seja, não existe nenhum
método de instância que seja chamado automaticamente da memória
imediatamente antes de o objeto ser eliminado.
Os comentários correspondentes na biblioteca SAP e os caminhos de menu fora
do ABAP Workbench só estão contidos em chamadas internas do sistema.
Construtor – Exemplo
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Criar e utilizar construtores
SÍNTESE DA LIÇÃO
Esta lição explica a criação e utilização de construtores estáticos e autoreferências.
Exemplo de negócio
Como desenvolvedor, você precisa explicar a criação e a utilização de construtores estáticos
para as classes em seu projeto ABAP Objects.
● Compreensão de construtores estáticos
● Compreensão da autorreferência
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Criar e utilizar construtores estáticos
Construtor estático
Autoreferência
Em alguns casos, você também deve ter uma autorreferência disponível. No ABAP Objects,
as autoreferências são sempre predefinidas, mas só são úteis e sintaticamente disponíveis
em determinados contextos.
Você pode endereçar o próprio objeto, usando a variável de referência predefinida ME dentro
de seus métodos de instância. Nesses casos, não é necessário utilizar me-> como prefixo,
mas você pode utilizá-lo para melhorar a legibilidade.
No entanto, você deve utilizar o prefixo me-> ao distinguir entre objetos de dados locais e
atributos de instância com o mesmo nome.
Uma utilização importante da autorreferência é quando você chama um método externo e um
objeto de mandante é necessário para exportar uma referência a si mesmo, você pode utilizar
ME como um parâmetro real com EXPORTING ou CHANGING.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Criar e utilizar construtores estáticos
Avaliação da aprendizagem
1. A instrução CLASS pode ser aninhada, ou seja, você pode definir uma classe em uma
classe.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
2. Qual dos seguintes elementos de sintaxe é utilizado para definir atributos estáticos?
Escolha a resposta correta.
X A CLASS-DATA
X B DATA
X C LIKE
X C CLASS ref_name
X Verdadeiro
X Falso
X Verdadeiro
X Falso
6. Ao chamar um método estático a partir da classe, você pode omitir o nome da classe.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
X A IF
X B COMPUTE
X C MOVER
X D WHILE
8. Você pode descrever métodos que têm um parâmetro _________ como métodos
funcionais.
Escolha a resposta correta.
X A EXPORTING
X B CHANGING
X C RETURNING
9. Você tem que definir parâmetros RETURNING utilizando o suplemento VALUE, ou seja,
eles devem ser transferidos por valor.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
X A construtor
X B função
X C atributos
X Verdadeiro
X Falso
12. Quais dos seguintes pontos são verdadeiros sobre o construtor estático?
Escolha a resposta correta.
X Verdadeiro
X Falso
1. A instrução CLASS pode ser aninhada, ou seja, você pode definir uma classe em uma
classe.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
Você está correto! Uma das características de uma classe na programação orientada a
objetos é que uma instrução de classe não pode ser aninhada, ou seja, você não pode
definir uma classe dentro de uma classe. Contudo, você pode definir classes auxiliares
locais para classes globais. Saiba mais nesta lição, Criação de classes locais,
características de tarefa de uma classe, no curso BC401.
2. Qual dos seguintes elementos de sintaxe é utilizado para definir atributos estáticos?
Escolha a resposta correta.
X A CLASS-DATA
X B DATA
X C LIKE
Você está correto! Os atributos estáticos existem uma vez para cada classe e são visíveis
para todas as instâncias de tempo de execução nessa classe. Você define atributos
estáticos com o elemento de sintaxe CLASS-DATA. Saiba mais nesta lição, Criação de
classes locais, atributos estáticos de tarefas e atributos de instância, no curso BC401.
X C CLASS ref_name
Você está correto! A instrução CREATE OBJECT cria um objeto na memória. Os valores
do atributo do objeto são iniciais ou atribuídos de acordo com a especificação TYPE. Saiba
mais na tarefa Criação de objetos na lição Criação de objetos do curso BC401.
X Verdadeiro
X Falso
Você está correto! A variável de referência pode apontar para a instância de uma classe. O
valor inicial de uma variável de referência é uma referência vazia, ou seja, a referência não
aponta para nada. Saiba mais na tarefa Definição de variáveis de referência na lição
Criação de objetos do curso, BC401.
X Verdadeiro
X Falso
Você está correto! Uma classe contém a descrição genérica de um objeto e descreve as
características que todos os objetos nessa classe têm em comum. Durante o tempo de
execução do programa, você utiliza a classe para criar objetos discretos (instâncias) na
memória. Esse processo é denominado instanciação. Leia mais na tarefa Objetos como
instâncias de classes, na lição Criação de objetos, no curso BC401.
6. Ao chamar um método estático a partir da classe, você pode omitir o nome da classe.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
Você está correto! Os métodos estáticos são abordados com o seu nome de classe, uma
vez que não necessitam de instâncias. Quando você chama um método estático a partir
da classe, pode omitir o nome da classe. Saiba mais na tarefa Chamadas de método
estático, na lição Acessando métodos e atributos, no curso BC401.
X A IF
X B COMPUTE
X C MOVER
X D WHILE
Você está correto! Você pode chamar métodos funcionais dentro das seguintes
expressões: MOVE, LOOP, Expressões lógicas: IF, ELSEIF, WHILE, CHECK, WAIT,
Expressões aritméticas e expressões de bit: COMPUTE, Case conditions: CASE, WHEN.
Saiba mais na tarefa Chamadas de método funcional, na lição Acessando métodos e
atributos, no curso BC401.
8. Você pode descrever métodos que têm um parâmetro _________ como métodos
funcionais.
Escolha a resposta correta.
X A EXPORTING
X B CHANGING
X C RETURNING
Você está correto! Os métodos que têm o parâmetro RETURNING são descritos como
métodos funcionais. Saiba mais na tarefa Chamadas de método funcional, na lição
Acessando métodos e atributos, no curso BC401.
9. Você tem que definir parâmetros RETURNING utilizando o suplemento VALUE, ou seja,
eles devem ser transferidos por valor.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
Você está correto! O parâmetro RETURNING deve ser sempre passado por valor -
RETURNING VALUE(...) - e não por referência. Saiba mais na tarefa Chamadas de método
funcional, na lição Acessando métodos e atributos, no curso BC401.
X A construtor
X B função
X C atributos
X Verdadeiro
X Falso
12. Quais dos seguintes pontos são verdadeiros sobre o construtor estático?
Escolha a resposta correta.
X Verdadeiro
X Falso
Lição 1
Implementar herança 79
Lição 2
Implementar upcasts utilizando herança 89
Lição 3
Implementar polimorfismo utilizando herança 93
Lição 4
Implementação de downcasts utilizando herança 99
OBJETIVOS DO CAPÍTULO
SÍNTESE DA LIÇÃO
Esta lição explica o conceito de herança e sua implementação.
Exemplo de negócio
Como desenvolvedor, você precisa implementar a herança para a classe em seu projeto de
objetos ABAP. Por esse motivo, você necessita dos seguintes conhecimentos:
● Compreensão da herança
● Compreensão de generalização e especialização
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Explicar generalização e especialização
● Implementar herança
● Elementos de acesso de classes na herança
Generalização e especialização
A especialização descreve uma relação na qual uma classe (subclasse) herda todas as
características principais de outra classe (classe superior). A subclasse também pode
adicionar novos componentes (atributos, métodos, etc.) e substituir as implementações em
métodos herdados. No último caso, o nome do método no diagrama Unified Modeling
Language (UML) é renomeado dentro da subclasse.
Implementação de herança
No ABAP Objects, uma relação de herança é definida para uma subclasse usando o
suplemento INHERITING FROM, seguido pela classe superior diretamente acima da
subclasse. Normalmente, as hierarquias de herança de complexidade variável podem ser
criadas quando uma classe superior herda de outra classe superior, mas não existe herança
múltipla no ABAP Objects, ou seja, somente uma classe superior pode ser indicada
diretamente acima de uma classe. No entanto, você pode utilizar interfaces no ABAP Objects
para simular herança múltipla.
A herança deve ser utilizada para implementar relações de generalização e especialização.
Uma classe superior é uma generalização de suas subclasses. As subclasses são, por sua vez,
especializações diferentes de suas classes superiores. Assim, são permitidas adições ou
modificações nas subclasses, mas você nunca pode remover nada de uma classe superior em
uma subclasse.
Herança é uma relação unilateral, as subclasses reconhecem suas classes superiores diretas,
mas as classes superiores não reconhecem suas subclasses. Neste exemplo, a subclasse
também contém o método set_type. A subclasse também define o método get_cargo.
Redefinição de métodos
Construtores de subclasse
Dica:
Neste contexto, o conceito de sobrecarga é relevante. Com a sobrecarga, um
método pode ter várias definições com diferentes assinaturas e diferentes
implementações. O conceito de sobrecarga não é suportado em ABAP Objects.
A solução alternativa comum é uma assinatura com diferentes conjuntos de
parâmetros opcionais.
Se uma subclasse não tiver modificado seu construtor de instância, o construtor é adotado
da classe superior. A implementação também é herdada da classe superior.
Herança e visibilidade
Os componentes herdados da classe superior podem não estar visíveis na subclasse. Uma
subclasse pode receber componentes privados de sua classe superior, que não podem ser
abordados na sintaxe da subclasse. Os componentes privados de classes superiores só
podem ser endereçados indiretamente utilizando métodos públicos ou protegidos da classe
superior, que, por sua vez, podem acessar os atributos privados. Estas restrições são
necessárias para garantir que a atualização centralizada seja possível.
Neste exemplo, é possível acessar a constante protegida C_POS_1 na classe superior
LCL_VEHICLE diretamente de sua subclasse LCL_BUS. Por outro lado, a única forma de
acessar os atributos privados MV_MAKE e MV_MODEL das subclasses de LCL_VEHICLE é
chamar métodos de LCL_VEHICLE. Esses métodos precisam ser públicos ou protegidos.
Utilizando PRIVATE SECTION, você pode modificar classes superiores sem a necessidade de
conhecer as subclasses. Desde que as modificações efetuadas por você não afetem a
semântica, você não precisa adaptar as subclasses. Isso deve-se ao fato de elas só
acessarem indiretamente os componentes privados da classe superior.
● Uma classe que define um atributo estático público ou protegido compartilha esse
atributo com todas as suas subclasses.
● Os métodos estáticos não podem ser redefinidos.
● O construtor estático de uma classe superior é executado quando a classe superior ou
uma de suas subclasses é acessada pela primeira vez.
● Uma subclasse pode sempre ter um construtor estático, independentemente da classe
superior.
● Se uma subclasse e sua classe superior tiverem um construtor estático, os dois
construtores serão executados quando acessarmos a subclasse pela primeira vez. Se o
acesso à classe superior e à subclasse do construtor estático ocorrer ao mesmo tempo, o
construtor estático da classe superior será executado primeiro, seguido imediatamente
pelo construtor estático da subclasse.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Explicar generalização e especialização
● Implementar herança
● Elementos de acesso de classes na herança
SÍNTESE DA LIÇÃO
Esta lição explica o conceito de up-casts e o tipo dinâmico e estático de variável de referência.
Esta lição também explica o método de implementação de up-casts.
Exemplo de negócio
Como desenvolvedor, você precisa implementar o conceito upcast para suas classes de
objeto ABAP. Por esse motivo, você precisa:
● Compreensão da herança
● Compreensão de upcasts
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar upcasts utilizando herança
Upcasts
Se você atribuir uma referência de subclasse a uma referência de classe superior, essa
subclasse garante que todos os componentes que você pode acessar sintaticamente após a
atribuição cast estejam realmente disponíveis na instância. A subclasse sempre contém pelo
Dica:
Observe que, com métodos redefinidos, a implementação da subclasse é
executada utilizando o tipo estático de referência da classe superior.
Nota:
As atribuições entre variáveis de referência são possíveis sempre que o tipo
estático das variáveis de destino for mais geral ou igual ao tipo dinâmico das
variáveis de origem.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar upcasts utilizando herança
SÍNTESE DA LIÇÃO
Esta lição explica o polimorfismo e implementa o polimorfismo usando herança.
Exemplo de negócio
Como desenvolvedor, você precisa implementar o polimorfismo usando a herança. Por esse
motivo, você precisa:
● Compreender o polimorfismo
● Compreensão de acesso genérico e atribuições upcast
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Explicar polimorfismo
● Implementar polimorfismo utilizando herança
Um uso típico para atribuições up-cast é preparar o acesso genérico. Um usuário que não
esteja interessado nos pontos mais refinados das instâncias das subclasses, mas que
Neste exemplo, a atribuição up-cast ocorre quando a referência do veículo é transferida para
o parâmetro formal do método ADD_VEHICLE. O componente compartilhado é acessado
genericamente dentro do loop ao redor da tabela interna que contém todas as referências de
veículo. O método DISPLAY_ATTRIBUTES foi herdado da classe superior LCL_VEHICLE e
pode ter sido redefinido.
Polimorfismo
Características do polimorfismo
Quando objetos de diferentes classes reagem de forma diferente às mesmas chamadas de
método, isso é conhecido como polimorfismo. A possibilidade de polimorfismo é um dos
principais pontos fortes da herança. um client pode tratar diferentes classes de modo
uniforme, independentemente da sua implementação. O sistema de tempo de execução
procura a implementação correta de um método, em nome do client.
O polimorfismo pode ser utilizado para escrever programas muito genéricos, ou seja, que não
precisam de grandes modificações se forem adicionados casos de utilização. Por exemplo, o
polimorfismo pode facilitar a adição de motos a este exemplo. Você só precisa definir uma
nova subclasse de LCL_VEHICLE, que você pode chamar LCL_MOTORBIKE. Seria também
necessário redefinir o método herdado DISPLAY_ATTRIBUTES. Sem precisar de mais
modificações, seu sistema de gerenciamento de veículos pode então trabalhar com motos,
bem como calcular os níveis de combustível necessários para elas.
Utilizando as chamadas dos módulos de função dinâmicos, você pode realizar uma
programação genérica no ABAP, mesmo sem um modelo de programação orientado a
objetos. Quando você compara a chamada dinâmica de módulo de função com o
polimorfismo por herança, o texto fonte é menos autoexplicativo e é mais suscetível a erros
na chamada dinâmica de módulo de função. Por exemplo, a verificação de sintaxe só pode
verificar se o módulo de função é chamado corretamente ou não. A verificação de sintaxe não
pode verificar se a tabela interna contém um nome de módulo de função válido para cada
veículo ou não.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Explicar polimorfismo
● Implementar polimorfismo utilizando herança
SÍNTESE DA LIÇÃO
Esta lição explica o conceito de atribuições downcast (narrowing cast).
Exemplo de negócio
Como desenvolvedor, você precisa criar uma subclasse da classe de avião e, em seguida,
utilizar o casting para acessar diferentes atributos. Por esse motivo, você precisa:
● Compreensão de downcasts
● Compreensão da herança
● Compreender a implementação de downcasts utilizando a herança
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar downcasts utilizando herança
● Hierarquias de classes de modelo
Downcasts
Para atribuir uma referência de classe superior a uma referência de subclasse, você deve
utilizar o operador de atribuição downcast MOVE ... ?TO ... ou sua forma breve ?
=. Caso contrário, você recebe uma mensagem informando que não está certo de que todos
os componentes que podem ser acessados sintaticamente após a atribuição cast estejam
realmente disponíveis na instância. Como regra, a subclasse contém mais componentes do
que a classe superior.
Depois de atribuir esse tipo de referência de volta a uma referência de subclasse à classe de
implementação, os clientes não estão mais limitados a componentes herdados. No exemplo
mostrado na figura Downcast (narrowing-cast) com referências de objeto, todos os
componentes da instância LCL_TRUCK podem ser acessados novamente após a atribuição
utilizando a referência GO_TRUCK2.
Por isso, normalmente a visão é ampliada ou não é modificada. Este tipo de atribuição de
variáveis de referência é conhecido como down-cast. Há uma mudança de uma visão de
alguns componentes para uma visão de muitos componentes. Como a variável de destino
aceita menos tipos dinâmicos após a atribuição, essa atribuição também é chamada de
narrowing cast.
Se você não tem uma compreensão correta da semântica de "é (específico)", corre o risco de
identificar os locais errados para usar herança. Às vezes, a necessidade de outro atributo
para uma classe é atendida incorretamente com uma especialização.
Por exemplo, uma classe superior chamada Carro contém as subclasses Carro vermelho,
Carro azul, etc. A declaração “Um carro vermelho é um carro específico” está correta apenas
à primeira vista. Contudo, não existem carros sem cor. Quando muito, existem alguns carros
que não foram pintados. Portanto, cada carro precisa da cor do atributo, assumindo que é
relevante para a aplicação. Portanto, esse atributo deve ser definido na classe superior. Pode
haver contradições com a realidade quando você tenta implementar um método para pintar
os carros.
Nota:
Tais atributos também são definidos como variáveis de referência para uma
classe superior de classes de função. Existe uma classe de descrição para cada
função. Para modificar a função de uma instância, você troca depois as
referências às instâncias de descrição de função correspondentes. A literatura
especializada também se refere a isso como modelo de design de funções.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar downcasts utilizando herança
● Hierarquias de classes de modelo
Avaliação da aprendizagem
X Verdadeiro
X Falso
3. Suponha que você tem uma classe X que herda da classe Y. Após um up-cast, uma
variável de referência que é estaticamente tipificada TYPE REF TO Y aponta para uma
instância da classe X. Quais dos seguintes componentes da classe X você pode acessar
com esta variável de referência?
Escolha as respostas corretas.
X A objetos
X B eventos
X C polimorfismo
X D herança
X A eventos
X B upcast
X C métodos
X D downcast
6. Qual das seguintes opções é utilizada para atribuir uma referência de classe superior a
uma referência de subclasse?
Escolha a resposta correta.
X A Ampliando cast
X B narrowing cast
X C Redefinição
X A =
X B <>
X C ?=
X D =?
8. Suponha que você tem a mesma classe X que herda da classe Y. Após um down-cast, uma
variável de referência que é tipificada estaticamente TYPE REF TO X aponta para uma
instância da classe X. Quais dos seguintes componentes da classe X você pode acessar
com esta variável de referência?
Escolha as respostas corretas.
X A Manutenção centralizada
X C Semântica preservada
Você está correto! Os componentes comuns das subclasses só precisam ser definidos e
implementados na classe superior e são herdados por todas as subclasses. As subclasses
são, por sua vez, especializações diferentes de suas classes superiores. Por isso, são
permitidos suplementos (ampliações) ou modificações nas subclasses. Saiba mais na
tarefa Características de generalização e especialização, na lição Implementação de
herança, no curso, BC401.
X Verdadeiro
X Falso
Você está correto! A herança deve ser utilizada para implementar relações de
generalização e especialização. Uma classe superior é uma generalização de suas
subclasses. Saiba mais na tarefa Implementação de herança, na lição Implementação de
herança, do curso BC401.
3. Suponha que você tem uma classe X que herda da classe Y. Após um up-cast, uma
variável de referência que é estaticamente tipificada TYPE REF TO Y aponta para uma
instância da classe X. Quais dos seguintes componentes da classe X você pode acessar
com esta variável de referência?
Escolha as respostas corretas.
Você está correto! Se você atribuir uma referência de subclasse a uma referência de
classe superior, essa subclasse garante que todos os componentes que você pode
acessar sintaticamente após a atribuição cast estejam realmente disponíveis na instância.
A subclasse sempre contém pelo menos os mesmos componentes que a classe superior
sempre o nome e a assinatura de métodos redefinidos são idênticos. Leia mais na tarefa
Upcasts, na lição, Implementando Up-casts usando Herança, claro BC401.
X A objetos
X B eventos
X C polimorfismo
X D herança
Você está correto! Quando objetos de classes diferentes reagem de forma diferente às
mesmas chamadas de método, isso é conhecido como polimorfismo. um client pode
tratar diferentes classes de modo uniforme, independentemente da sua implementação.
O sistema de tempo de execução procura a implementação correta de um método, em
nome do client. Leia mais nas lições, Implementando Up-casts usando Herança e
Implementando Polimorfismo Usando Herança, do curso, BC401.
X A eventos
X B upcast
X C métodos
X D downcast
Você está correto! Um uso típico para atribuições up-cast é preparar o acesso genérico.
Um usuário que não esteja interessado nos pontos mais refinados das instâncias das
subclasses, mas que simplesmente precise abordar os componentes compartilhados
pode utilizar uma referência de classe superior para esse acesso. Leia mais na tarefa,
Acesso genérico a objetos, na lição Implementação de polimorfismo utilizando herança,
do curso, BC401.
6. Qual das seguintes opções é utilizada para atribuir uma referência de classe superior a
uma referência de subclasse?
Escolha a resposta correta.
X A Ampliando cast
X B narrowing cast
X C Redefinição
Você está correto! Para atribuir uma referência de classe superior a uma referência de
subclasse, você deve utilizar a atribuição downcast, também chamada narrowing cast.
Leia mais na tarefa Downcasts, na lição, Implementando downcast utilizando herança,
claro BC401.
X A =
X B <>
X C ?=
X D =?
Você está correto! O operador de atribuição downcast é MOVE ... ?TO ... ou sua forma
breve ?=. Leia mais na tarefa Downcasts, na lição, Implementando downcast utilizando
herança, claro BC401.
8. Suponha que você tem a mesma classe X que herda da classe Y. Após um down-cast, uma
variável de referência que é tipificada estaticamente TYPE REF TO X aponta para uma
instância da classe X. Quais dos seguintes componentes da classe X você pode acessar
com esta variável de referência?
Escolha as respostas corretas.
Você está correto! Depois de atribuir um tipo de classe superior de referência a uma
referência de subclasse, os clientes não estão mais limitados a componentes herdados.
Leia mais na tarefa Downcasts, na lição, Implementando downcast utilizando herança,
claro BC401.
X A Manutenção centralizada
X C Semântica preservada
Lição 1
Definição e implementação de interfaces locais 115
Lição 2
Implementar polimorfismo utilizando interfaces 121
Lição 3
Integração de modelos de classe mediante interfaces 125
OBJETIVOS DO CAPÍTULO
SÍNTESE DA LIÇÃO
Esta lição explica o método de definição e implementação de interfaces.
Exemplo de negócio
Como desenvolvedor, você precisa criar interfaces e implementá-las em seu modelo em
objetos ABAP. Por esse motivo, você precisa:
● Compreensão do uso da interface
● Compreensão da definição de interface
● Compreensão da implementação da interface
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Explicar a utilização de interfaces
● Criar relações de generalização e especialização utilizando interfaces
Utilização de interfaces
interfaces podem ser vistas como classes superiores que não podem ser instanciadas, não
contêm implementações e só têm componentes públicos. Você pode simular várias heranças
utilizando interfaces.
No ABAP Objects, as interfaces servem principalmente para definir protocolos de interface
uniformes para serviços. Várias classes podem implementar esses serviços de diferentes
formas, mas você precisa manter a mesma semântica. Por isso, as interfaces não contêm
implementações.
Em ABAP Objects, os mesmos componentes geralmente podem ser definidos em interfaces e
classes. Para reconhecer as diferenças semânticas da herança regular, você pode se
concentrar nos seguintes casos de utilização.
Por exemplo, você quer permitir que várias classes implementem um serviço de formas
diferentes, mas utilizando os mesmos nomes de método e uma assinatura uniforme. Com a
herança normal, você definiria esse método na classe superior compartilhada. No entanto, se
você não puder modelar uma classe superior para herança adequadamente, precisará definir
uma interface e, em seguida, definir o método na interface. Portanto, você pode comparar
este caso com uma relação de generalização dentro de uma classe superior.
Definição de interfaces
Em UML, você representa as interfaces da mesma forma que representa classes. No entanto,
além do nome da interface, você utiliza a notação «interface». Você representa a utilização
de uma interface por uma linha pontilhada com uma seta de dois lados do usuário para a
interface. A palavra-chave «usa» é opcional.
Em ABAP Objects, você pode definir os mesmos componentes em uma interface como pode
em classes. No entanto, as interfaces não conhecem os níveis de visibilidade de seus
componentes, ou seja, todos os componentes de uma interface são públicos.
As classes implementam interfaces das seguintes formas:
● Nome da interface
O nome da interface está listado na parte de definição da classe com a instrução
INTERFACES. Isso ocorre em PUBLIC SECTION, ou seja, as interfaces só podem ser
implementadas publicamente.
● Métodos de interface
Os métodos de interface são implementados na parte de implementação da classe.
● Componentes de interface
Os componentes definidos na interface são abordados na parte de implementação da
classe.
Você só pode acessar componentes de interface utilizando uma referência a objetos cuja
classe implementa a interface. Você utiliza o operador de resolução de interface (~) para
acessar os componentes de interface na parte de implementação da classe.
Para simplificar o acesso a componentes da interface, você pode utilizar aliases. Esses nomes
alias podem aparecer na parte de definição de uma classe. A utilização de nomes alias está
sujeita à restrição de visibilidade da classe definidora.
Um alias para um método de interface é definido da seguinte forma:
ALIASES a_1 FOR lif_1~Method_1.
O método de interface lif_1~Method_1 pode ser acessado com o formulário mais curto ref-
>a_1.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Explicar a utilização de interfaces
● Criar relações de generalização e especialização utilizando interfaces
SÍNTESE DA LIÇÃO
Esta lição explica o polimorfismo e implementa o polimorfismo usando interfaces.
Exemplo de negócio
Como desenvolvedor, você precisa criar interfaces e implementar polimorfismo em seu
projeto ABAP Objects. Por esse motivo, você precisa:
● Compreender o polimorfismo
● Compreender o polimorfismo na implementação da interface
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar polimorfismo usando interfaces
regular, você deve utilizar upcast para copiar uma referência à variável de referência de
interface para executar polimorfismo com interfaces.
Se a classe tiver implementado a interface, é certo que todos os componentes que podem ser
acessados sintaticamente após a atribuição cast estão disponíveis na instância. Um usuário
pode acessar a instância da classe de implementação utilizando a interface. A prefixação do
nome da interface e do operador de resolução de interface é omitida. Contudo, o usuário está
restringido a utilizar os componentes da interface.
No exemplo, os métodos DISPLAY_PARTNER e CHECK_AVAILABILITY da interface
LIF_PARTNER só podem ser acessados após a atribuição da variável de referência
GO_PARTNER. Não é possível acessar os componentes específicos da instância a partir da
classe LCL_RENTAL (GET_NAME no exemplo acima) utilizando a variável de referência
GO_PARTNER.
Por isso, a visão é restringida ou, pelo menos, permanece inalterada. Por isso, você descreve
este tipo de atribuição de variáveis de referência como upcast. Existe uma mudança de uma
visão de vários componentes para uma visão de apenas alguns componentes. A referência de
destino pode, obviamente, aceitar tipos mais dinâmicos após a atribuição, do que antes.
Assim, o termo widening cast também é adequado.
Uma área de utilização típica para atribuições upcast é a preparação para o acesso genérico.
Um usuário que não esteja interessado nos pontos mais refinados das instâncias da classe
que implementam a interface, mas que simplesmente quer abordar os componentes
definidos na interface, poderia utilizar uma referência de interface para este acesso.
No exemplo mostrado, uma agência de viagens (LCL_TRAVEL_AGENCY) precisa gerenciar os
vários tipos de parceiros de negócios em uma lista. Por isso, o desenvolvedor deve atribuir a
categoria de linha da tabela interna como referência à interface LIF_PARTNER.
A agência de viagens só quer solicitar os serviços para exibir seus atributos e verificar sua
disponibilidade. Os métodos relevantes DISPLAY_PARTNER e CHECK_AVAILABILITY são
definidos na interface LIF_PARTNER e implementados em todas as classes de parceiro de
negócios.
O polimorfismo também pode ser realizado para interfaces. Você pode utilizar referências de
interface para chamar métodos e executar diferentes implementações dependendo do objeto
da referência.
O tipo dinâmico da variável de referência é utilizado para procurar a implementação de um
método. No exemplo acima, lo_partner->display_partner( ) utiliza a classe da instância à qual
lo_partner realmente se refere para procurar a implementação de display_partner.
A implementação que é executada quando DISPLAY_PARTNER é chamado agora depende do
objeto ao qual a referência de interface lo_partner se refere atualmente. Quando objetos de
diferentes classes reagem de forma diferente às mesmas chamadas de método, é conhecido
como polimorfismo.
A opção de realizar polimorfismo é um dos principais pontos fortes das interfaces. Um
mandante pode tratar de diferentes classes de modo uniforme, independentemente da sua
implementação. O sistema de tempo de execução procura a implementação correta de um
método, em nome do client.
O polimorfismo pode ser utilizado para escrever programas muito genéricos, ou seja, que não
precisam de grandes modificações se forem adicionados casos de utilização.
No exemplo, torna-se fácil adicionar uma classe para aluguéis de barcos. Por exemplo, a
classe relevante com o nome LCL_SHIPPING terá que simplesmente implementar a interface
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar polimorfismo usando interfaces
SÍNTESE DA LIÇÃO
Esta lição explica o método de junção de modelos de classe utilizando interfaces.
Exemplo de negócio
Como desenvolvedor, você precisa integrar vários modelos de classe de seu projeto ABAP
Objects. Por esse motivo, você precisa:
● Compreensão de submodelos
● Compreensão da integração de submodelos
● Compreensão de hierarquias de interface
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar downcasts com interfaces
● Integrar diferentes submodelos usando interfaces
● Criar e utilizar hierarquias de interface
Para atribuir uma referência de interface a uma referência de classe onde a classe
implementou a interface, você deve utilizar o operador de atribuição down-cast MOVE ... ?
TO ... ou sua forma breve ?=. Caso contrário, o sistema devolve uma mensagem informando a
você que não há garantias de que todos os componentes que podem ser acessados
sintaticamente após a atribuição cast estejam realmente disponíveis na instância. Regra
geral, a classe de implementação contém mais componentes do que a interface.
As variáveis de referência da interface podem conter referências a instâncias da classe de
implementação no momento da execução. Após a atribuição deste tipo de referência a uma
referência à classe de implementação, os mandantes já não estão limitados a componentes
de interface.
Este tipo de atribuição de variável de referência é descrito como down-casting. A visão down-
casting é ampliada ou pelo menos inalterada. Isto é uma mudança de uma visão de alguns
componentes para uma visão de mais componentes. O termo narrowing cast também é
usado.
Uma área de utilização típica para atribuições down-cast é quando componentes específicos
de instâncias precisam ser endereçados e suas referências são mantidas em variáveis
tipificadas na interface. Um usuário interessado nos pontos mais refinados das instâncias em
classes de implementação não pode utilizar a referência de interface porque a atribuição
downcast só permite o acesso aos componentes de interface. No exemplo mostrado na figura
Atribuição down-cast e tratamento de exceções no exemplo de aplicação, uma agência de
viagens (LCL_TRAVEL_AGENCY) precisa reservar um voo, mas mantém todas as várias
referências de parceiro de negócios em uma tabela interna que foi digitada na interface
LIF_PARTNER.
O que acontece se não existir nenhuma referência de companhia aérea na referência de
interface GO_PARTNER no momento da execução, mas o operador de atribuição down-cast
for utilizado para copiar a referência para a referência então inválida GO_CARRIER? Ao
No ABAP Objects, interfaces como classes superiores regulares podem incluir outras
interfaces. Tal como na herança regular, as hierarquias de interface podem ter qualquer
profundidade.
A interface de inclusão é uma especialização da interface incluída. A interface de inclusão é
conhecida como uma interface composta, representa uma extensão da interface incluída.
Uma interface incluída representa um componente de outra interface e é portanto conhecida
como interface de componentes. Uma interface que não contém outras interfaces em si é
conhecida como interface elementar.
A notação UML corresponde à implementação de uma interface elementar por uma classe.
Você precisa abordar os componentes de uma interface composta e efetuar atribuições cast
da mesma forma.
As interfaces são utilizadas para descrever protocolos para a utilização de componentes sem
conectar qualquer implementação. Uma camada intermediária é introduzida para proteger o
cliente do servidor explícito, tornando assim o cliente independente.
As interfaces permitem que diferentes classes sejam tratadas de modo uniforme, desde que
essas classes tenham implementado as interfaces. Tal como na herança, você também pode
executar polimorfismo, utilizando variáveis de referência de interface.
Como é o caso com herança regular, a definição de uma interface significa a abstração das
classes de implementação para um aspecto específico.
Várias heranças podem ser simuladas utilizando interfaces. Se estiverem incluídas várias
interfaces, todos os componentes estão disponíveis para cada uma das interfaces e você
deve implementar todos os métodos.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar downcasts com interfaces
● Integrar diferentes submodelos usando interfaces
● Criar e utilizar hierarquias de interface
Avaliação da aprendizagem
X Verdadeiro
X Falso
X A Eventos
X B Herança
X C Polimorfismo
X Verdadeiro
X Falso
4. Suponha que uma variável de referência que é tipificada para uma interface contém uma
referência de instância de uma classe que implementa essa interface e você copia isso
para uma variável de referência que é tipificada para a classe (down-cast). Quais dos
seguintes componentes podem ser acessados com essa variável de referência?
Escolha as respostas corretas.
X A Os componentes da interface
X A Interface
X B Classe
X C Método
X Verdadeiro
X Falso
X Verdadeiro
X Falso
X A Eventos
X B Herança
X C Polimorfismo
Você está correto! A opção de realizar polimorfismo é um dos principais pontos fortes das
interfaces. Um mandante pode tratar de diferentes classes de modo uniforme,
independentemente da sua implementação. Leia mais na tarefa Acesso genérico
utilizando a referência de interface, na lição Implementação de polimorfismo utilizando
interfaces, no curso BC401.
X Verdadeiro
X Falso
Você está correto! Para atribuir uma referência de interface a uma referência de classe
onde a classe implementou a interface, você deve utilizar o operador de atribuição down-
cast MOVE ... ?TO ... ou sua forma breve ?=. Saiba mais na tarefa Downcasts com
interfaces na lição Integração de modelos de classe utilizando interfaces, no curso BC401.
4. Suponha que uma variável de referência que é tipificada para uma interface contém uma
referência de instância de uma classe que implementa essa interface e você copia isso
para uma variável de referência que é tipificada para a classe (down-cast). Quais dos
seguintes componentes podem ser acessados com essa variável de referência?
Escolha as respostas corretas.
X A Os componentes da interface
Você está correto! A visão down-casting é ampliada ou pelo menos inalterada. Isto é uma
mudança de uma visão de alguns componentes para uma visão de mais componentes. O
termo narrowing cast também é usado. Saiba mais na tarefa Downcasts com interfaces
na lição Integração de modelos de classe utilizando interfaces, no curso BC401.
X A Interface
X B Classe
X C Método
X Verdadeiro
X Falso
Você está correto! No ABAP Objects, interfaces como classes superiores regulares
podem incluir outras interfaces. Tal como na herança regular, as hierarquias de interface
podem ter qualquer profundidade. Leia mais na Interface composta na notação de
Linguagem de modelagem unificada (UML), na lição Integração de modelos de classe
utilizando interfaces, no curso BC401.
Lição 1
Implementação de eventos em classes locais 139
Lição 2
Implementar eventos em interfaces locais 149
OBJETIVOS DO CAPÍTULO
SÍNTESE DA LIÇÃO
Esta lição explica o método de implementação de eventos em classes locais.
Exemplo de negócio
Como desenvolvedor, você precisa implementar um comportamento controlado por eventos
para seu modelo no ABAP Objects. Por esse motivo, você precisa:
● Compreensão de como definir e acionar eventos
● Compreensão de como lidar com eventos
● Compreensão de como registrar manipuladores para eventos
● Compreensão de como implementar manipuladores de eventos em classes locais
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar chamadas de método controladas por eventos
● Acionar e tratar eventos
● Registrar para eventos
● Explicar seções de visibilidade no tratamento de eventos
Além de atributos e métodos, as classes e suas instâncias também podem conter outro tipo
de componente chamado eventos.
Os eventos de instância podem ser acionados pelas instâncias da classe, mas os eventos
estáticos podem ser acionados pela própria classe.
Os eventos também podem ser definidos como componentes de interface.
Dadas as circunstâncias corretas, os métodos de manipulador reagem ao acionamento deste
evento. Isso significa que o sistema de tempo de execução pode chamar esses métodos de
manipulador após o acionamento do evento. Em outras palavras, o mandante normalmente
não chama o método de manipulador diretamente.
Isso resulta em um conceito de modelagem completamente diferente. durante o
desenvolvimento da classe que aciona o evento, você não precisa saber nada sobre a classe
que o está manipulando. A classe acionadora envia uma mensagem específica a todas as
classes e, se necessário, às suas instâncias. No momento do desenvolvimento, o tipo de
manipulador e o número de manipuladores, que podem ser utilizados, não são conhecidos.
Devido à definição do método de manipulador, o intervalo de resultados possíveis pode ser
reduzido. No entanto, os resultados que podem ocorrer só podem ser determinados depois
de o evento ter sido acionado.
Um evento pode ter parâmetros de exportação, o que significa que, ao contrário da chamada
de método explícita, o programa de chamada determina o protocolo.
Neste exemplo de aplicação, após uma instância ser criada na classe Veículo, a instância
aciona o evento Veículo criado.
Este evento é recebido por várias instâncias e é processado de forma diferente por cada
instância. Por exemplo, a locadora de veículos lida com a compra de um veículo, enquanto o
escritório de registro do veículo registra o veículo comprado.
Cuidado:
Não confunda este conceito de eventos na programação orientada a objetos
com eventos no sistema de tempo de execução ABAP, como LOAD-OF-
PROGRAM, START-OF-SELECTION, etc. Além disso, não confunda este conceito
com o processamento em background ou com o controle de workflow.
Nos diagramas de classe UML, uma seta pontilhada com o estereótipo «handlesEventOf»
aponta da classe de manuseio para a classe de acionamento. A definição de evento e a
assinatura só aparecem implicitamente na classe de tratamento dentro do método de
manipulador. Os métodos de manipulador são separados dos outros métodos, utilizando o
estereótipo «ManipuladorEventos».
Dependendo do status da sua aplicação, talvez você não precise programar todas as etapas
todas as vezes. A separação de causa e efeito em sua programação deve ser refletida na
forma como você constrói aplicações complexas. Muitas vezes, o evento já foi acionado e
tudo o que você precisa fazer é criar outro manipulador de eventos.
Dentro de uma classe, os eventos de instância são definidos utilizando a instrução EVENTS,
enquanto os eventos estáticos são definidos utilizando a instrução CLASS-EVENTS. Os
eventos só podem ter parâmetros de exportação que devem ser transferidos por valor.
Uma classe ou instância pode acionar um evento no momento da execução, utilizando a
instrução RAISE EVENT. Ambos os eventos de instância e os eventos estáticos podem ser
acionados em métodos de instância. Em métodos estáticos, você só pode acionar eventos
estáticos.
Quando um evento é acionado, os métodos de manipulador registrados nesse evento são
chamados em sequência. Esses métodos de manipulador podem acionar mais eventos
próprios.
Os eventos de instância ou os métodos estáticos podem ser definidos dentro de uma classe
para manipular eventos. Para isso, você deve indicar o evento utilizando a instrução FOR
EVENT e a classe ou interface na qual o evento foi definido utilizando a instrução OF.
Se o evento contiver parâmetros de exportação e você quiser acessá-los sintaticamente, você
deverá ter indicado os parâmetros de exportação exatamente após IMPORTING na definição
do método. Os parâmetros de exportação de assinatura do método de manipulador são todos
que podem ser incluídos explicitamente do que os parâmetros de exportação do evento
associado. Os parâmetros são digitados pelo método de manipulador durante a definição do
evento. O objeto que aciona o evento determina o protocolo.
Além dos parâmetros de exportação explicitamente definidos, o parâmetro de importação
predefinido SENDER pode ser sempre listado. Ao utilizar esse parâmetro, você pode colocar
uma referência ao objeto acionador de evento no método de manipulador.
Por isso, os métodos de manipulador são normalmente chamados por eventos acionados
RAISE EVENT. contudo, eles também podem ser chamados explicitamente (CALL METHOD).
1. Definir um evento em uma classe. A sintaxe para isso é o nome do evento EVENTS, nome
do evento CLASS-EVENTS.
2. Acione o evento em um método desta classe. A sintaxe para isso é RAISE EVENT
eventname.
A definição do método de manipulador só indica como e a que evento de que classe o método
irá reagir. No momento da execução, é necessário determinar quais as possíveis reações que
realmente ocorrerão e quando cada uma dessas reações ocorrerá.
Ao acionar eventos de instância, você também tem que indicar que evento a reação irá
acionar. Se os métodos de instância estiverem definidos para executar a reação, você
também tem que indicar que instâncias irão executar a reação.
Estas indicações são conhecidas coletivamente como registro. O registro é sempre efetuado
mediante o trigger. Quando o evento é acionado, o tempo de execução utiliza os registros do
acionador para determinar que métodos de manipulador de eventos precisam ser chamados.
Neste exemplo, os métodos de manipulador são definidos para o evento da classe de veículo,
da classe de veículo de aluguel e da classe de registro de veículo. No entanto, você só pode
predefinir que instâncias de locação de veículos e instâncias de registro de veículo irão reagir
a que instância de veículo e quando irão reagir.
Os registros também podem ser anulados.
Os eventos são registrados utilizando a instrução SET HANDLER. O registro só está ativo no
momento da execução do programa.
Com os eventos de instância, FOR é seguido da referência ao objeto que aciona o evento.
O suplemento ACTIVATION 'X' é opcional durante o registro. Para anular o registro, utilize
ATIVAÇÃO ' '.
Você pode registrar vários métodos com uma instrução SET HANDLER:
SET HANDLER ref_handler_1->on_eventname_1 ...
ref_handler_n->on_eventname_n FOR ...
Cuidado:
Se foram registrados vários métodos para um evento, a sequência em que os
métodos de manipulador de eventos são chamados não está definida, ou seja,
não há uma sequência garantida de chamada dos métodos de manipulador de
eventos.
Com a adição de ALL INSTANCES, um manipulador de eventos pode ser registrado para
todas as instâncias da classe que define o evento de instância. Esta é a única forma de
registrar manipuladores para instâncias que ainda não foram criadas.
Cada objeto ou classe que define eventos tem uma tabela interna conhecida como tabela de
manipulador. Todos os métodos de manipulador registrados nos vários eventos são listados
na tabela de manipuladores. Para métodos de instância, a tabela de manipuladores também
contém referências aos objetos registrados.
Dica:
Os objetos registrados para o tratamento de eventos não são eliminados pelo
coletor de lixo, mesmo que não existam referências restantes aos mesmos.
Nota:
É possível adicionar ou remover manipuladores de eventos para um determinado
evento enquanto um manipulador de eventos para esse evento exato for
executado. Se um novo manipulador de eventos for registrado, ele será
adicionado ao final da sequência e executado no momento correto. Se o registro
de um manipulador de eventos existente for cancelado, esse manipulador será
eliminado da sequência de métodos do manipulador de eventos.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar chamadas de método controladas por eventos
● Acionar e tratar eventos
● Registrar para eventos
● Explicar seções de visibilidade no tratamento de eventos
SÍNTESE DA LIÇÃO
Esta lição explica a implementação de eventos em interfaces locais.
Exemplo de negócio
Como desenvolvedor, você precisa implementar eventos em classes locais do avião. Por esse
motivo, você precisa:
● Compreensão de eventos
● Compreensão de interfaces
● Compreensão da implementação de eventos em interfaces locais
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar eventos em interfaces locais
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar eventos em interfaces locais
Avaliação da aprendizagem
1. Quais das seguintes opções não podem ser definidas como componentes de interface?
Escolha a resposta correta.
X A Atributos
X B Métodos
X C Eventos
X D classes
X A CLASS-EVENTS
X B RAISE EVENT
X C EVENTS
X D PARA EVENTOS
X Verdadeiro
X Falso
X Verdadeiro
X Falso
6. Em qual área de visibilidade um evento precisaria ser definido para garantir que ele só
possa ser tratado na própria classe e suas subclasses?
Escolha a resposta correta.
X A Autoridades
X B Protegido
X C Privada
1. Quais das seguintes opções não podem ser definidas como componentes de interface?
Escolha a resposta correta.
X A Atributos
X B Métodos
X C Eventos
X D classes
Você está correto! Os atributos e métodos podem ser definidos como componentes de
interface. Os eventos também podem ser definidos como componentes de interface.
Saiba mais na tarefa Chamadas de método controlado por eventos, na lição
Implementação de eventos em classes locais, no curso BC401.
X A CLASS-EVENTS
X B RAISE EVENT
X C EVENTS
X D PARA EVENTOS
Você está correto! Uma classe ou instância pode acionar um evento no momento da
execução, utilizando a instrução RAISE EVENT. Ambos os eventos de instância e os
eventos estáticos podem ser acionados em métodos de instância. Em métodos estáticos,
você só pode acionar eventos estáticos. Leia mais na tarefa Acionamento e manuseio de
eventos, na lição Implementação de eventos em classes locais, no curso BC401.
X Verdadeiro
X Falso
Você está correto! Em métodos estáticos, você só pode acionar eventos estáticos. Leia
mais na tarefa Acionamento e manuseio de eventos, na lição Implementação de eventos
em classes locais, no curso BC401.
Você está correto! É possível definir métodos estáticos ou de instância dentro de uma
classe para tratar eventos. Para isso, você deve indicar o evento na definição do
manipulador utilizando a instrução FOR EVENT e a classe ou interface na qual o evento foi
definido utilizando a instrução OF. Saiba mais na tarefa Manipulação de eventos, na lição
Implementação de eventos em classes locais do curso BC401.
X Verdadeiro
X Falso
Você está correto! Os eventos são registrados utilizando a instrução SET HANDLER. O
registro só está ativo no momento da execução do programa. Saiba mais na tarefa
Registro de manipulação de eventos na lição Implementação de eventos em classes locais
do curso BC401.
6. Em qual área de visibilidade um evento precisaria ser definido para garantir que ele só
possa ser tratado na própria classe e suas subclasses?
Escolha a resposta correta.
X A Autoridades
X B Protegido
X C Privada
Você está correto! A visibilidade de um evento define onde o evento pode ser tratado:
PUBLIC - O evento pode ser tratado em qualquer lugar, PROTECTED - O evento só pode
ser tratado dentro de sua própria classe ou suas subclasses, PRIVATE - O evento só pode
ser tratado dentro de sua própria classe. Saiba mais na tarefa, Visibilidade de seções de
eventos, na lição Implementação de eventos em classes locais, no curso BC401.
Lição 1
Criação de classes globais 159
Lição 2
Definição e implementação de interfaces globais 169
Lição 3
Utilização de outras funções do Class Builder 175
OBJETIVOS DO CAPÍTULO
SÍNTESE DA LIÇÃO
Esta lição explica como criar classes globais.
Exemplo de negócio
Como desenvolvedor, você deve criar uma classe ABAP global para aviões que podem ser
acessados por todos os outros objetos ABAP no sistema da SAP. Por esse motivo, você
precisa:
● Compreensão de classes globais
● Compreensão de como testar e utilizar classes globais
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Criar classes globais
● Testar classes globais
● Utilizar classes globais
Nota:
Um grande número de números é utilizado na lição. Observe que o aspecto de
alguns dos ícones ou menus depende do nível de release.
Tal como com subprogramas, utilize classes ou interfaces locais somente dentro do
programa no qual estão definidas e implementadas. A instrução CLASS é uma declaração
local no programa. Como a instrução TYPES define tipos de dados locais, a instrução CLASS
define tipos de objeto locais.
Por outro lado, as classes globais ou interfaces globais são objetos de repositório individuais
com todas as funcionalidades padrão do ABAP Workbench, como integração ativa, criação de
versões e sistema de transporte. A convenção de espaço de nomes, por exemplo, Y*, Z*, ou
um espaço de nomes de cliente especial é igual ao nome utilizado para o espaço de nomes de
outros objetos do repositório.
Portanto, uma ferramenta especial de atualização está disponível no ABAP Workbench, que é
o Class Builder.
Se você não tiver certeza sobre um determinado recurso no Class Builder, é aconselhável
utilizar a informação rápida. É o texto explicativo que aparece quando você posiciona o cursor
sobre um ícone e o deixa lá por um curto período de tempo.
Tal como com outros objetos do repositório, a área de navegação separada do Object
Navigator torna a ferramenta de desenvolvimento ideal para todos os objetos do repositório.
A forma mais fácil de criar uma nova classe global é utilizar o menu de contexto na área de
navegação. Para isso, selecione primeiro o nó de pacote ou o nó de classe dentro de um
pacote.
Aparece uma caixa de diálogo que oferece algumas opções para a nova classe. Selecione
Classe ABAP comum.
A classe global ou a interface global é então exibida na tabela Class Builder na área de editor
do Object Navigator.
Selecione a ficha de registro Atributos para abrir uma lista de todas as definições de atributo
na classe. Você também pode definir novos atributos aqui.
Você pode utilizar as entradas possíveis ao definir os tipos de atributos. Não se esqueça de
utilizar descrições breves significativas.
Selecione a ficha de registro Métodos para abrir uma lista de todas as definições de método
na classe. Você pode definir novos métodos aqui. Não se esqueça de utilizar descrições
breves significativas.
Existem janelas de editor separadas para os parâmetros de método (também conhecidos
como assinatura de método) e a implementação.
Dica:
Os métodos podem ser transportados separadamente porque cada
implementação é arquivada em seu próprio include ABAP.
Implementação de métodos
Dica:
Selecione o botão relevante para exibir a assinatura do método.
Você pode definir atributos, métodos ou eventos no menu de contexto da área de navegação
do Object Navigator. As características são então atualizadas em uma caixa de diálogo e não
na tabela.
Dica:
Selecione → ClassPrint ou → MethodPrint para imprimir partes selecionadas do
texto fonte.
Você pode testar classes globais ativas selecionando o caminho de menu → → ClassRunIn
Test Environment, selecionando o botão correspondente da barra de ferramentas da
aplicação ou pressionando F8.
Atributos estáticos e métodos estáticos podem ser acessados diretamente no ambiente de
teste. Atributos de instância e métodos de instância só podem ser acessados após a criação
da instância. Você pode criar uma instância utilizando o botão Criar instância.
O sistema apenas lista os componentes públicos. Os métodos podem ser testados utilizando
o botão Executar método.
Estas são as etapas para acionar eventos em uma classe:
1. Selecione um evento.
O evento acionado e todos os parâmetros reais exportados são exibidos em uma lista.
Como outros objetos do repositório, classes globais e interfaces são adicionadas na área de
navegação do Object Navigator. Dessa forma, as vantagens discutidas também se aplicam a
classes e interfaces globais.
Como alternativa, você também pode selecionar o botão Modelo. Você pode encontrar a
instrução CREATE OBJECT selecionando Padrões de objetos ABAP. Você pode gerar a
instrução utilizando as Entradas possíveis.
Nota:
Para gerar padrões, ative o estilo de escrita funcional moderno para chamadas de
método. Selecione Utilitários → → Configurações Modelo e marque o campo de
seleção Estilo de escrita funcional para método de chamada.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Criar classes globais
● Testar classes globais
● Utilizar classes globais
SÍNTESE DA LIÇÃO
Esta lição explica como definir e implementar interfaces globais.
Exemplo de negócio
Como desenvolvedor, você precisa criar uma interface global para que outros
desenvolvedores na sua organização possam utilizar a mesma interface e implementá-la de
formas próprias em suas classes. Por esse motivo, você precisa:
● Compreensão de como definir e implementar interfaces globais
● Compreensão de como importar classes e interfaces locais
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Definir e implementar interfaces globais
● Importar classes e interfaces locais
Você cria interfaces globais da mesma forma que cria classes globais. Clique com o botão
direito do mouse no nome do programa na área da tela Nome do objeto e selecione
→ CreateClass. A convenção de nomes é IF_ para interfaces SAP e ZIF_ ou YIF_ para
interfaces definidas pelo usuário.
Se você quiser incluir uma interface global na sua classe global, deve inserir o nome da
interface na ficha de registro Interfaces.
Assim que você tiver efetuado isso, todos os componentes de interface aparecem
automaticamente nas fichas de registro relevantes de acordo com a convenção de nomes
com o operador de resolução de interface. No exemplo, é incorporada a interface global
ZIF_00_PARTNER que contém o método DISPLAY_PARTNER. Clique duas vezes no nome do
método para implementar o método.
O procedimento a seguir é uma forma fácil de fazer cópias globais de classes locais e
interfaces locais.
Dica:
A função para copiar classes locais para classes globais não pode ser utilizada a
partir de OBJECT-NAVIGATOR.
5. Insira os nomes para as classes e interfaces globais que você quer criar.
8. Selecione as classes e interfaces globais que você quer criar e selecione o botão Importar.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Definir e implementar interfaces globais
● Importar classes e interfaces locais
SÍNTESE DA LIÇÃO
Esta lição explica como gerar diagramas UML utilizando herança em classes globais.
Exemplo de negócio
Como desenvolvedor, você precisa gerar diagramas UML, que ajudam você a manter uma
síntese sobre suas classes globais e suas relações entre si. Além disso, você precisa melhorar
a implementação de sua classe de hotel usando herança. Por esse motivo, você precisa:
● Compreensão de como gerar diagramas UML
● Compreensão de como lidar com classes globais
● Compreensão de como utilizar o assistente de refatoração
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Gerar diagramas UML para classes globais
● Implementar herança em classes globais
● Modificar a exibição de componentes em classes globais
No SAP NetWeaver 7.0 Enhancement Package 2 (EhP2), o Class Builder pode gerar
diagramas UML para a codificação existente. Esta função exibirá classes globais se você
selecionar um pacote para exibir. No entanto, se você selecionar um programa, as classes
locais e as interfaces globais serão exibidas, mas não as classes globais. No entanto, os
diagramas podem incluir objetos do ABAP Dictionary.
A figura mostra como iniciar a funcionalidade para um pacote completo. Em uma caixa de
diálogo, você pode adicionar uma seleção de objetos e indicar quais detalhes deseja ver no
diagrama.
Para redefinir um método herdado, selecione o método relevante na lista e selecione o botão
Redefinir. Alternativamente, você pode utilizar o menu de contexto na área de navegação.
Nota:
A aparência de alguns dos botões ou menus depende do nível de liberação. O
botão para redefinir métodos é um exemplo.
Dica:
Para definir o construtor na subclasse, selecione o botão CONSTRUCTOR na
barra de ferramentas da aplicação. O sistema propõe então a transferência da
assinatura do construtor da classe superior. Isso é útil quando você quer criar o
construtor da subclasse. Você pode adicionar alguns parâmetros aqui. Da
mesma forma, você pode encontrar a chamada para a classe superior aqui.
Você pode definir tipos locais em classes globais. Classes globais incluem classes locais.
Tecnicamente, você não está definindo uma classe dentro de uma classe, mas uma classe
que é local no objeto do repositório da classe global.
Todos os componentes da classe global têm acesso a esses tipos locais, mas são
encapsulados se você tentar acessá-los de fora.
O mesmo se aplica a interfaces locais em classes globais.
Existem dois includes de classe para a definição e implementação de classes locais, como se
segue:
Para melhorar o seu entendimento sobre herança e componentes de interface, você pode
definir o código Agrupar por classes e interfaces nas Configurações específicas do usuário
para o Class Builder. O sistema exibirá então os componentes da classe global em um grupo.
Você pode ordenar todos os componentes por cinco critérios em três níveis. Selecione o
botão Ordenar para exibir a caixa de diálogo apropriada.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Gerar diagramas UML para classes globais
● Implementar herança em classes globais
● Modificar a exibição de componentes em classes globais
Avaliação da aprendizagem
1. Você só pode utilizar classes ou interfaces locais dentro do mesmo programa no qual elas
estão definidas e implementadas.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
X Verdadeiro
X Falso
3. Qual dos seguintes botões no Class Builder é utilizado para substituir um método
herdado?
Escolha a resposta correta.
X A CONSTRUCTOR
X B Redefinir
X C Implementação
4. Os tipos locais da classe global estão encapsulados e não podem ser acessados de fora.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
1. Você só pode utilizar classes ou interfaces locais dentro do mesmo programa no qual elas
estão definidas e implementadas.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
Você está correto! Tal como com subprogramas, utilize classes locais ou interfaces locais
somente dentro do programa no qual estão definidas e implementadas. A instrução
CLASS é uma declaração local no programa. Saiba mais na tarefa Definição de classes
globais na lição Criação de classes globais do curso BC401.
X Verdadeiro
X Falso
Você está correto! A convenção de nomes é IF_ para interfaces globais SAP e ZIF_ ou YIF_
para interfaces globais definidas pelo usuário. Saiba mais na tarefa Definição de interfaces
globais na lição Definição e implementação de interfaces globais do curso BC401.
3. Qual dos seguintes botões no Class Builder é utilizado para substituir um método
herdado?
Escolha a resposta correta.
X A CONSTRUCTOR
X B Redefinir
X C Implementação
Você está correto! Para redefinir um método herdado, selecione o método relevante na
lista e selecione o botão Redefinir. Alternativamente, você pode utilizar o menu de
contexto na área de navegação. Saiba mais na tarefa Redefinição de um método na classe
global, na lição Implementação de herança em classes globais, no curso BC401.
4. Os tipos locais da classe global estão encapsulados e não podem ser acessados de fora.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
Você está correto! Você pode definir tipos locais em classes globais. Todos os
componentes da classe global têm acesso a esses tipos locais, mas são encapsulados se
você tentar acessá-los de fora. O mesmo se aplica a interfaces locais em classes globais.
Leia mais na tarefa, Tipos locais em classes globais, na lição, implementando Herança em
classes globais, no curso BC401.
Lição 1
Utilizando o ABAP List Viewer (ALV) 189
Lição 2
Descrição de Business Add Ins (BAdIs) 197
OBJETIVOS DO CAPÍTULO
SÍNTESE DA LIÇÃO
Esta lição mostra como implementar o ABAP List Viewer (ALV).
Exemplo de negócio
Você precisa criar um relatório usando o ALV Grid Control. Por esse motivo, você precisa:
● Compreensão do ALV Grid Control
● Compreensão da utilização de um ALV em uma área da tela
● Compreensão de como implementar ALV
● Compreensão da implementação de um manipulador para o evento de clique duplo
● Saber como implementar um manipulador de eventos para o ALV Grid Control
● Compreensão de como implementar um popup com o ALV Grid Control
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar um ALV Grid simples
● Processar o evento de clique duplo do ALV Grid
Figura 122: Inclusão de uma instância ALV Grid Control em um programa de diálogo
Criação de um ALV
Figura 123: Exibição dos dados da aplicação usando uma instância de ALV Grid
Você deve colocar um ALV Grid Control em uma área de tela com um tamanho fixo. Para isso,
você deve criar uma instância de cada uma das classes globais
CL_GUI_CUSTOM_CONTAINER e CL_GUI_ALV_GRID.
Para a exibição normal, execute as seguintes etapas de programação:
1. Utilize o editor de tela inteira do Screen Painter para definir uma área de controle
personalizada na sua tela.
Se a tabela tiver uma categoria de linha global definida no ABAP Dictionary, você pode
transferir o nome desta estrutura global para o mesmo método. O ALV Grid Control cria o
catálogo de campos automaticamente
Cuidado:
A tabela interna transferida para o método SET_TABLE_FOR_FIRST_DISPLAY
deve estar definida globalmente. Por isso, a tabela deve ser uma variável de
programa global ou um atributo público de uma classe.
Quando você modifica o conteúdo das tabelas internas enquanto o programa está sendo
executado, você só precisa chamar o método REFRESH_TABLE_DISPLAY na etapa de diálogo
relevante para atualizar a exibição.
Um ALV Grid Control pode reagir ao clique duplo do usuário. Como reação possível, você
pode acionar uma etapa de processamento subsequente na qual são exibidas informações
adicionais.
No exemplo exibido na figura ALV Grid Control – clique duplo, os dados da reserva para os
clientes de voo individuais ou dados sobre a aeronave também podem ser exibidos para os
dados do voo. Isso é executado ao capturar o evento DOUBLE_CLICK com um método de
manipulador.
Nota:
A documentação abrangente sobre o SAP Control Framework está disponível na
documentação de produto padrão da SAP (fornecida com o produto ou online por
meio do SAP Help Portal). A biblioteca SAP contém descrições abrangentes de
todas as classes e um tutorial completo.
O ABAP Workbench também contém o Centro de demonstração Enjoy, que
facilita a utilização de programas-modelo padrão. Para encontrá-lo, utilize a
transação DWDM (demonstrações do workbench de desenvolvimento).
Elementos individuais do SAP Control Framework são abordados em outros
cursos.
A SAP também oferece um curso abrangente separado sobre programação em
diálogo com os controles da SAP. O curso abrange todos os aspectos, incluindo
técnicas de programação complexas, como as funções de arrastar e soltar.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar um ALV Grid simples
● Processar o evento de clique duplo do ALV Grid
SÍNTESE DA LIÇÃO
Esta lição mostra como implementar Business Add Ins (BAdIs).
Exemplo de negócio
Você precisa ampliar a funcionalidade em um programa padrão da SAP, sem alterar o
programa original. Isso pode ser feito usando BAdIs. Por esse motivo, você precisa:
● Compreensão de BAdIs
● Compreensão de como definir um BAdI
● Compreensão de como implementar um BAdI
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Descrever BAdIs
BAdIs
Ao contrário dos exits de cliente, os BAdIs são otimizados para o processo de entrega de
software modificado.
O processo típico de entrega de software não consiste apenas de fornecedores e clientes,
mas vários provedores intermediários podem estar envolvidos na cadeia de entrega de
software. Por exemplo, um parceiro da SAP pode ampliar um programa de aplicação da SAP
com uma solução setorial como a unidade de negócios industrial (IBU). O cliente pode, então,
ampliar novamente o mesmo programa.
BAdI – Fundamentos
Com um BAdI, uma aplicação SAP fornece a opção de ampliação mediante uma interface e
uma classe de adaptador que implementa essa interface.
A interface pode ser implementada por vários usuários na cadeia de fornecimento, assim, são
possíveis várias implementações de BAdI. Além disso, uma implementação de BAdI pode
fornecer outro BAdI, que pode ser implementado por usuários que aparecem mais na cadeia
de fornecimento.
Quando você define um BAdI, deve indicar uma interface (IF_EX_<badi>) com métodos
correspondentes definidos formalmente. A classe de adaptador gerada automaticamente
durante a definição de interface (CL_EX_<badi>) tem, entre outras funções, a função de
chamar todas as implementações ativas do BAdI. Quando você tem várias implementações
ativas, não existe nenhuma sequência de processamento predefinida.
1. Execute a transação SE18 ou, na tela SAP Easy Access, selecione Ferramentas → ABAP
→ WorkbenchUtilitários → Business Add Ins → Definição.
6. Clique duas vezes no nome da interface para navegar para a definição da interface.
8. Clique duas vezes em Demo BAdI call para navegar para o texto fonte do programa
SAPBC401_BAD_D1.
10. Execute o programa e demonstre que nenhum texto adicional é visível no fim da lista.
A pesquisa de BAdIs
Você pode procurar o BAdI utilizando as seguintes estratégias:
● Você pode utilizar o guia de customizing (guia de implementação para a transação SPRO).
O nome do BAdl deve ser investigado antes de você poder implementar o BAdI. Ao procurar
nomes de BAdI, você pode utilizar os mecanismos de pesquisa. Clique duas vezes na variável
de referência (gb_adapter) no exemplo para obter a definição da interface. Você pode derivar
o nome do BAdI a partir do nome da interface.
Nota:
Como procurar no texto fonte ABAP:
Ao executar uma transação arbitrária, pressione a tecla F1. Na caixa de diálogo
exibida, selecione o botão Informações técnicas. Navegue para o texto fonte do
programa clicando duas vezes no nome do programa. Em seguida, chame a
função de pesquisa global no menu Edit → Find Next e pesquise a cadeia
desejada.
Não utilize a função de pesquisa do editor Processar → Procurar/substituir (Ctrl +
F), pois esta função irá considerar somente um único include de texto fonte.
Implementação de BAdI
Nota:
Ative os métodos das implementações no fim da tarefa.
6. Clique duas vezes no nome da classe de implementação para navegar para a classe e
implementar seu texto fonte aí (é suficiente implementarWRITE 'Hello World' a
instrução no método ENHANCE_LIST.)
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Descrever BAdIs
Avaliação da aprendizagem
1. O ABAP List Viewer (ALV) Grid Control é uma ferramenta que você pode utilizar para
exibir listas não hierárquicas de forma padronizada.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
X Verdadeiro
X Falso
X A classe
X B estrutura
X C tela
X D atributo
X Verdadeiro
X Falso
X Verdadeiro
X Falso
X Verdadeiro
X Falso
X Verdadeiro
X Falso
X A método
X B estrutura
X C objeto
1. O ABAP List Viewer (ALV) Grid Control é uma ferramenta que você pode utilizar para
exibir listas não hierárquicas de forma padronizada.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
Você está correto! O ALV Grid Control é uma ferramenta que você pode utilizar para exibir
listas não hierárquicas de uma forma padronizada. Saiba mais na tarefa, O ALV Grid
Control, na lição Utilização do ABAP List Viewer (ALV), no curso BC401.
X Verdadeiro
X Falso
Você está correto! Os controles de container fornecem a conexão técnica entre a tela e os
controles de aplicação. Os controles de aplicação ALV Grid Control, Tree Control e Picture
Control estão sempre integrados no Container Control, que está conectado à tela. Saiba
mais na tarefa, Incluindo uma instância do ALV Grid Control em um programa de diálogo,
na lição Utilização do ABAP List Viewer (ALV), no curso BC401.
X A classe
X B estrutura
X C tela
X D atributo
Você está correto! Para criar um objeto manipulador para um evento, defina uma classe.
Saiba mais na tarefa, ALV Grid Control – Reagindo a um clique duplo, na lição Utilização
do ABAP List Viewer (ALV), no curso BC401.
X Verdadeiro
X Falso
X Verdadeiro
X Falso
Você está correto! Com um BAdI, uma aplicação SAP fornece a opção de ampliação
mediante uma interface e uma classe de adaptador que implementa essa interface. A
interface pode ser implementada por vários usuários na cadeia de fornecimento, assim,
são possíveis várias implementações de BAdI. Saiba mais nesta lição, Descrição de
Business Add-Ins (BAdIs), Descrição de Business Add-Ins (BAdIs), Tarefa BAdI –
Fundamentos do curso, BC401.
X Verdadeiro
X Falso
X Verdadeiro
X Falso
Você está correto! O nome do BAdl deve ser investigado antes de você poder
implementar o BAdI. Quando o nome do BAdI é determinado, o BAdI pode ser
implementado. Saiba mais nesta lição, Descrição de Business Add-Ins (BAdIs), tarefa
Implementação de BAdI, do curso BC401.
X A método
X B estrutura
X C objeto
Lição 1
Desenvolvimento de programas ABAP com ferramentas baseadas em Eclipse 213
OBJETIVOS DO CAPÍTULO
SÍNTESE DA LIÇÃO
Esta lição explica como utilizar as ferramentas de desenvolvimento ABAP (ADT). O ADT é
baseado no framework do Eclipse.
O ADT oferece funções que não estão disponíveis no ABAP Workbench. Essas funções são
especialmente úteis ao escrever código orientado a objetos.
Exemplo de negócio
Você ouviu que a SAP oferece a possibilidade de desenvolvimento ABAP no Eclipse e que o
desenvolvimento do ABAP no Eclipse é particularmente útil para escrever código orientado a
objetos. Por isso, você quer saber mais sobre essa possibilidade.
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Desenvolver codificação ABAP em Eclipse
● Usar soluções rápidas e refatoração
A perspectiva ABAP
O Eclipse permite o desenvolvimento em muitas linguagens de programação diferentes. Para
suportar diferentes tipos de desenvolvimento, o Eclipse contém diferentes combinações de
ferramentas, chamadas Perspectivas. Se você tiver o ADT instalado, poderá mudar para a
perspectiva ABAP. Selecione → WindowOpen PerspectiveOther → ... → ABAP na barra de
menu ou selecione o botão Open Perspective.
Quando você utiliza o ADT, efetua login em um sistema back-end do SAP e trabalha
diretamente com seus objetos do repositório. Por isso, o processo de desenvolvimento é
exatamente o mesmo que quando você utiliza o ABAP Workbench, não é efetuado o check out
e o check in dos objetos.
Um projeto ABAP serve como um container para os objetos de desenvolvimento que são
armazenados em um sistema back-end ABAP específico e contém os parâmetros de login
para o logon no sistema — Sistema, Mandante, Usuário e idioma. Você deve estar conectado
ao sistema para processar um objeto. Dentro do ABAP projeto, você pode acessar qualquer
objeto de desenvolvimento no repositório. Além disso, para facilitar o gerenciamento de
objetos, você pode configurar pacotes favoritos para cada projeto.
Processamento de objeto
Tipos de editores
Existem dois tipos de editores no ADT – há uma implementação nativa do Eclipse e uma
implementação baseada no SAP GUI. Na imagem, editores nativos e editores SAP GUI
integrados, você pode ver um exemplo de cada um dos seguintes tipos:
Há dois tipos de editores nas ferramentas de desenvolvimento ABAP:
● Editores para os quais há uma implementação nativa do Eclipse
Por exemplo, editor ABAP, um editor Eclipse
● Editores que são exibidos em uma SAP Graphical User Interface (GUI) integrada.
Por exemplo, o editor de transações ABAP com a visualização clássica da SAP GUI que
aparece no ambiente Eclipse
Correções rápidas
Desenvolvedores são frequentemente obrigados a reestruturar o código-fonte para facilitar o
entendimento, ampliá-lo e também torná-lo mais eficiente. No entanto, as consequências da
reestruturação podem levar à quebra de dependências. A refatoração elimina a necessidade
de edição tediosa que, de outra forma, é necessária para corrigir tais problemas de
reestruturação.
● Correções rápidas
- adicionar implementação em falta (para classe completa ou método individual)
- gerar método (por exemplo, construtor de instância ou método setter/getter para um
atributo)
- Modificar visibilidade (por exemplo, transformar variável local em atributo, tornar o
componente privado público)
- renomear componente ( atributo, método, variável, interface)
● Extrair um método
● Excluir todas as variáveis não usadas
No Eclipse, Quick Fixes são atalhos para concluir tarefas ou resolver erros propostos
automaticamente pelo editor. O editor de classes no ADT fornece correções rápidas para
tarefas de editor comuns.
Extração de método
Uma importante técnica de refatoração é a extração de métodos. Isso envolve mover um
bloco de código para um novo método e substituir o bloco por uma chamada para esse novo
método. Para executar a extração do método, você deve estar processando uma classe ABAP
global ou local em um pool de classes, um programa ou outro tipo de programa ABAP. Seu
código não pode conter erros de sintaxe antes de começar. Considere que a extração de
métodos não é suportada em código fora de classes e que você só pode extrair um método
dentro da área de início e de fim de outro método.
A figura Extraindo um método: antes mostra dois métodos da mesma classe. Ambos
necessitam da mesma verificação de existência, embora o processamento seguinte seja
diferente.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Desenvolver codificação ABAP em Eclipse
● Usar soluções rápidas e refatoração
Avaliação da aprendizagem
1. Ao trabalhar com ADT, você efetua o logon no sistema back-end ABAP e permanece
conectado durante toda a sua sessão.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
2. O ADT contém editores nativos do Eclipse para quais tipos de objetos do repositório?
Escolha as respostas corretas.
X A Programas ABAP
X B Elementos de dados
X C Classes ABAP
X D Pacotes
X E Elementos de texto
3. Você está criando uma classe ABAP no ADT e acabou de escrever a definição de um
método na seção pública da definição de classe. Pressione CTRL + 1 para ver as soluções
rápidas disponíveis. Quais das seguintes soluções rápidas estão disponíveis?
Escolha as respostas corretas.
X C Eliminar o método
1. Ao trabalhar com ADT, você efetua o logon no sistema back-end ABAP e permanece
conectado durante toda a sua sessão.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
Você está correto! Quando você utiliza o ADT, efetua login em um sistema back-end do
SAP e trabalha diretamente com seus objetos do repositório. Por isso, o processo de
desenvolvimento é o mesmo que quando você utiliza o ABAP Workbench, não é efetuado
o check out e o check in dos objetos. Saiba mais na tarefa Criação de um projeto ABAP na
lição Desenvolvimento de programas ABAP baseados em Eclipse, no curso BC401.
2. O ADT contém editores nativos do Eclipse para quais tipos de objetos do repositório?
Escolha as respostas corretas.
X A Programas ABAP
X B Elementos de dados
X C Classes ABAP
X D Pacotes
X E Elementos de texto
Você está correto! Existem dois tipos de editores nas ferramentas de desenvolvimento
ABAP: Editores para os quais existe uma implementação nativa do Eclipse por exemplo,
editor ABAP, um editor Eclipse, para editar relatórios ABAP ou classes ABAP Editores que
são exibidos em uma interface gráfica do usuário (GUI) da SAP, por exemplo, editor de
transação ABAP com a visualização SAP GUI clássica aparecendo no ambiente Eclipse.
Leia mais na tarefa, Tipos de tarefa de editores, na lição Desenvolvimento de programas
ABAP baseados em Eclipse, no curso BC401.
3. Você está criando uma classe ABAP no ADT e acabou de escrever a definição de um
método na seção pública da definição de classe. Pressione CTRL + 1 para ver as soluções
rápidas disponíveis. Quais das seguintes soluções rápidas estão disponíveis?
Escolha as respostas corretas.
X C Eliminar o método
Lição 1
Explicação de exceções baseadas na classe 229
Lição 2
Definição e geração de exceções 237
Lição 3
Implementar técnicas avançadas de tratamento de exceções 247
OBJETIVOS DO CAPÍTULO
SÍNTESE DA LIÇÃO
Esta lição explica como tratar e depurar exceções baseadas na classe.
Exemplo de negócio
Você deve utilizar o novo conceito de exceções em seus programas ABAP Object. Por esse
motivo, você precisa:
● Compreender as exceções baseadas na classe
● Compreensão de como tratar exceções baseadas na classe
● Compreensão de como depurar exceções baseadas na classe
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Explicar exceções baseadas na classe
● Tratar exceções baseadas na classe
● Depurar exceções baseadas na classe
Dica:
Observe que a utilização de exceções baseadas na classe não se limita a
contextos orientados a objetos. As exceções baseadas na classe podem ser
criadas e tratadas em todos os blocos de processamento. Em particular, todos
os erros em tempo de execução anteriormente interceptáveis podem ser
tratados como exceções baseadas na classe.
Você pode definir suas próprias classes de exceção, mas o sistema já inclui uma série de
classes de exceção predefinidas – especialmente para exceções no ambiente de tempo de
execução. Você pode criar classes de exceção globalmente no Class Builder, mas também
pode definir classes de exceção locais dentro de um programa ou classe global.
Os nomes das classes de exceção globais sempre começam com <namespace>CX_. As
classes de exceção globais utilizadas pelo ambiente de tempo de execução começam com
CX_SY_. Recomendamos que você inicie os nomes das classes de exceção locais com LCX_.
Todas as classes de exceção são derivadas de uma classe de exceção, CX_ROOT. Por isso,
você pode acessar genericamente qualquer objeto de exceção por meio de uma variável de
referência, REF TO CX_ROOT.
No entanto, uma nova classe de exceção não pode herdar diretamente de CX_ROOT, derivar
qualquer classe de exceção nova direta ou indiretamente de uma das subclasses CX_ROOT -
CX_NO_CHECK, CX_DYNAMIC_CHECK ou CX_STATIC_CHECK.
Por meio disso, todas as classes de exceção são subdivididas em três grupos. Dependendo
do grupo ao qual uma determinada exceção pertence, a exceção é tratada de forma diferente
pela verificação de sintaxe e pelo ambiente de tempo de execução. O grupo padrão é
CX_STATIC_CHECK, que assegura máxima estabilidade do programa e da verificação de
sintaxe. Utilize os outros grupos somente em casos especiais.
O método GET_SOURCE_POSITION devolve o nome do programa principal ou programa
include e o número da linha no texto fonte onde ocorre a exceção. O método GET_TEXT
devolve um texto de exceção sob a forma de uma cadeia. Este método não está definido
diretamente em CX-ROOT, mas sim na interface IF_MESSAGE, que é implementada por CX-
ROOT.
Você pode tratar uma exceção se a instrução que acionou a mesma estiver dentro de uma
estrutura de controle TRY-ENDTRY. Você trata a exceção utilizando a instrução CATCH na
estrutura TRY-ENDTRY.
O bloco TRY contém as instruções para as quais as exceções precisam ser tratadas. Um
bloco CATCH contém o manipulador de exceções, que é executado se tiver ocorrido uma
exceção especificada no bloco TRY associado.
Como todas as estruturas de controle em ABAP Objects, você pode aninhar estruturas TRY-
ENDTRY em qualquer nível. Em particular, o bloco TRY, o bloco CATCH e o bloco CLEANUP
podem conter estruturas TRY-ENDTRY completas.
Indique qualquer número de classes de exceção na instrução CATCH. Assim, você define um
manipulador de exceções para todas essas classes de exceção e suas subclasses.
Se ocorrer uma exceção, o sistema procura uma instrução CATCH correspondente na
estrutura TRY-ENDTRY que envolve imediatamente a instrução. Ele procura nos blocos
CATCH a classe de exceção relevante ou as classes superiores da hierarquia de herança. Se
for encontrada uma das classes de exceção relevantes, o programa navega diretamente para
o manipulador.
Se o sistema não encontrar uma instrução CATCH correspondente, ele pesquisará
gradualmente as estruturas TRY-ENDTRY adjacentes. Se não for possível encontrar nenhum
manipulador no mesmo procedimento, o sistema tenta propagar a exceção para o programa
de chamada. Este processo será discutido mais detalhadamente mais adiante.
Se uma estrutura TRY-ENDTRY contiver um bloco CLEANUP, este bloco é executado quando
a estrutura TRY-ENDTRY é encerrada porque o sistema não consegue encontrar um
manipulador dentro da própria estrutura TRY-ENDTRY, mas sim em uma estrutura TRY-
ENDTRY circundante ou em um programa de chamada.
Se for criada uma exceção, o sistema exibe o nome da classe de exceção no campo Exceção
acionada no modo de depuração.
Se um bloco CATCH detectar a exceção, é exibida uma mensagem de êxito. O ponteiro para a
instrução atual move-se depois para esse bloco CATCH.
São exibidos dois botões se ocorrer uma exceção. Utilize os botões para analisar o objeto de
exceção e para navegar para o ponto no texto fonte onde a exceção ocorreu,
respectivamente.
Dica:
Por motivos de desempenho, o sistema na verdade não criará objetos de
exceção se o suplemento INTO estiver faltando na respectiva instrução CATCH.
Nesses casos, o botão Último objeto de exceção normalmente não aparece.
Para definir o ABAP Debugger para criar sempre o objeto de exceção, selecione a
respectiva opção nas configurações do depurador.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Explicar exceções baseadas na classe
● Tratar exceções baseadas na classe
SÍNTESE DA LIÇÃO
Esta lição explica como definir e criar classes de exceção globais.
Exemplo de negócio
Você precisa definir classes de exceção globais para seus programas ABAP Objects. Por esse
motivo, você precisa:
● Compreender a definição de classes de exceção globais
● Compreensão de como criar exceções baseadas na classe
● Compreensão de como implementar a propagação de exceção
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Definir classes de exceção globais
● Criar exceções baseadas na classe
● Propagar exceções
Você utiliza o Class Builder para criar uma classe global como descrito na biblioteca SAP. Ao
inserir o nome da classe global, utilize o prefixo CX_. Selecione a opção Classe de exceção
como o tipo de classe.
Nota:
A partir do SAP NetWeaver Application Server 6.40 (SAP NetWeaver AS 6.40),
existe um campo de seleção de classe de mensagens que você pode selecionar ao
criar a classe. Esta opção permite que o texto das classes de exceção seja
reutilizado de qualquer classe de mensagem cujo texto esteja arquivado na tabela
T100. Você não pode misturar texto de classes de mensagem e OTR em uma
classe de exceção.
Em releases anteriores ao SAP NetWeaver AS 6.40, os textos de exceção eram
arquivados exclusivamente no Online Text Repository (OTR).
Ao criar uma classe de exceção, não modifique a entrada padrão para Herda de, a
menos que você esteja ciente das consequências de efetuar a modificação.
Defina atributos adicionais em sua classe de exceção conforme necessário (por exemplo,
para ampliações genéricas a textos de exceção).
Dica:
Se esse atributo for público, o Class Builder ajusta automaticamente o
construtor de instância da classe de exceção.
Um novo parâmetro de entrada é gerado e um valor pode ser definido para este
atributo ao acionar a exceção. O parâmetro de importação é gerado com o
mesmo nome do atributo. Por padrão, o parâmetro é opcional. Você pode
declarar isso obrigatório editando a assinatura do construtor.
Grave quantos textos de exceção forem necessários. Ao gravar textos de exceção, você pode
inserir atributos como parâmetros no texto estático utilizando a forma &<nome_atributo>&.
Nota:
Para o primeiro texto que você criar, utilize sempre a constante estática
predefinida como um ID. A constante tem sempre o mesmo nome que a própria
classe de exceção. Se o responsável pela exceção não indicar um texto quando a
exceção é criada, o sistema utiliza o texto com este ID.
Você define outros IDs para todos os outros textos. Em seguida, o Class Builder gera
automaticamente constantes estáticas com nomes idênticos. Quando a exceção é acionada,
transfira uma dessas constantes para o parâmetro de importação TEXTID para indicar o texto
adequado para a instância de exceção.
Nota:
Em releases anteriores ao SAP NW AS 6.40, os textos de exceção para classes de
exceção globais e suas traduções foram arquivados em OTR. Você pode atribuir
vários textos a uma única classe. Você atribui um texto a uma exceção utilizando
o atributo TEXTID, que contém o ID único global do objeto de texto em OTR em
uma instância no momento da execução. Em seguida, o método GET_TEXT
exporta este texto, substitui todos os parâmetros de texto pelo conteúdo dos
atributos relevantes, conforme necessário, e retorna o texto como uma cadeia de
caracteres.
1. No Class Builder, na caixa drop-down sem nome no lado esquerdo da tela, selecione
Classe/interface.
2. No campo sem nome, insira o novo nome da classe de exceção, use o prefixo ZCX_.
Pressione Enter.
4. Selecione o botão de rádio Classe de exceção e, se você quiser que os textos de exceção
venham de uma classe de mensagens existente, selecione o campo de seleção Com classe
de mensagens.
7. Na caixa de diálogo Criar entrada do catálogo de objetos, insira o nome do seu pacote e
selecione Gravar.
Uma caixa de diálogo Prompt para ordem de workbench transportável é exibida.
9. Se necessário, defina atributos adicionais na sua classe de exceção (por exemplo, para
utilizar nos textos de exceção).
Nota:
Se esses atributos forem públicos, o Class Builder ajusta automaticamente o
construtor de instância da classe de exceção: um novo parâmetro de entrada
é gerado para que um valor possa ser fornecido para esse atributo ao criar a
exceção. O parâmetro de importação é gerado com o mesmo nome do
atributo. Por padrão, o parâmetro é opcional. Você pode declará-la como
obrigatória editando a assinatura do construtor.
10. Selecione a guia Textos no Class Builder e crie quantos textos de exceção forem
necessários. Ao fazê-lo, você pode inserir seus atributos como parâmetros no texto
estático, sob a forma &<attribute_name>&.
Nota:
Para o primeiro texto que você criar, utilize sempre a constante estática
predefinida como um ID. Tem sempre o mesmo nome que a própria classe de
exceção. Se nenhum texto for indicado explicitamente quando a exceção é
acionada, é utilizado o texto com este ID. Você define outros IDs para todos os
outros textos. O Class Builder gera depois automaticamente constantes
estáticas com nomes idênticos. Quando a exceção é criada, você transfere
uma dessas constantes para o parâmetro de importação TEXTID, de modo a
indicar o texto apropriado para a instância de exceção.
A figura Variantes da instrução RAISE EXCEPTION mostra exemplos para a instrução RAISE
EXCEPTION.
A geração de exceções baseadas na classe é efetuada utilizando a instrução RAISE
EXCEPTION. Existem duas variantes da instrução.
Variantes da instrução RAISE EXCEPTION ...
RAISE EXCEPTION TYPE <exception_class> [EXPORTING ...].
Esta instrução cria um novo objeto de exceção que é uma instância da classe
<exception_class>.
RAISE EXCEPTION <object_ref>.
Textos de exceção
Nota:
O tipo das constantes e do parâmetro TEXTID no construtor é determinado pelo
fato de a classe de exceção ter sido criada ou não com o código Com classe de
mensagem. Se a classe de exceção ainda utilizar textos OTR, as constantes são do
tipo CHAR e contêm um ID técnico do texto OTR. Se a classe de exceção utilizar
uma classe de mensagem, as constantes são estruturas que contêm o nome da
classe de mensagem, o número da mensagem.
Propagação de exceção
O tratamento de exceções que ocorrem dentro de procedimentos não precisa estar dentro do
mesmo procedimento. Em vez disso, o procedimento pode propagar a exceção para seu
chamador. O chamador pode então tratar a exceção ou propagá-la para seu próprio
chamador. Os níveis mais elevados de propagação que uma exceção pode atingir são blocos
de processamento sem áreas de dados locais, ou seja, blocos de evento ou módulos de
diálogo. Esses blocos de processamento têm que tratar as exceções propagadas. Caso
contrário, ocorre um erro em tempo de execução. O mesmo se aplica a exceções criadas
dentro desses blocos de processamento.
Para propagar uma exceção de um procedimento, você geralmente usa o suplemento
RAISING quando define a interface do procedimento. Em métodos de classes e
subprogramas locais, indique o suplemento RAISING diretamente quando você estiver
definindo o procedimento. Por exemplo:
METHODS meth_name ... RAISING cx_... cx_... ou FORM subr_name ... RAISING cx_... cx_....
O suplemento RAISING é seguido por uma lista das classes de exceção cujas instâncias
devem ser propagadas. Em métodos de classes globais, insira classes de exceção cujas
instâncias devem ser propagadas para a tabela de exceções do método no Class Builder.
Você também precisa definir o flag Classe de exceção para cada tabela de exceções. O
processo é semelhante para módulos de função. Para definir o código no Function Builder,
selecione a ficha Exceções.
Dica:
Um único método, subprograma ou módulo de função só pode acionar um tipo
de exceção, ou seja, baseado em classe ou convencional.
A propagação da exceção baseada na classe não requer que o método de chamada trata
realmente a exceção. O chamador pode passar a exceção para seu próprio chamador,
mesmo sem tratá-la.
No exemplo, o construtor propaga a exceção CX_EXC criada pelo método GET_TECH_ATTR.
Quando o erro ocorre e o programa gera a exceção, a execução do programa salta
diretamente para o bloco CATCH no programa principal.
Nota:
Se o construtor implementar o bloco opcional CLEANUP, o sistema executa este
bloco antes do bloco CATCH do programa principal.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Definir classes de exceção globais
● Criar exceções baseadas na classe
● Propagar exceções
SÍNTESE DA LIÇÃO
Esta lição explica a implementação de técnicas avançadas de tratamento de exceções.
Exemplo de negócio
Você precisa usar técnicas avançadas de tratamento de exceções para detectar exceções e
tentar novamente após o tratamento de exceções em seus programas ABAP Objects. Por
esse motivo, você precisa:
● Compreensão de classes de exceção predefinidas
● Compreensão de como tratar uma classe de exceção
● Compreensão de como tentar novamente após uma exceção
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Explicar a hierarquia de classes de exceção predefinidas
● Explicar as diferentes formas de tratamento de uma exceção
● Repetir após exceções
● Implementar exceções retomáveis
● Mapear exceções
A figura mostra como as exceções padrão no sistema de tempo de execução são integradas
na hierarquia de herança das classes de exceção.
A seleção da classe superior influencia a forma como a verificação de sintaxe e o ambiente de
tempo de execução tratam de uma determinada exceção. Algumas das classes de exceção
padrão são as seguintes:
● CX_STATIC_CHECK
Se uma classe de exceção herdar de CX_STATIC_CHECK, você deve tratar a exceção
relevante ou propagá-la utilizando o suplemento RAISING. Se a exceção não for tratada
nem propagada usando o suplemento RAISING, a verificação de sintaxe exibirá um aviso.
Quando você define uma nova classe de exceção global, CX_STATIC_CHECK é definida
como a classe superior por padrão.
● CX_DYNAMIC_CHECK
Para subclasses de CX_DYNAMIC_CHECK, a verificação de sintaxe não exibe nenhuma
advertência se as exceções não forem tratadas nem propagadas com o suplemento
RAISING. Se uma exceção for criada no momento da execução e você não a tratar nem
propagar, o sistema encerra o programa com um erro de tempo de execução.
Nota:
Os exemplos típicos desta situação são as exceções predefinidas CX_SY_...
para erros que ocorrem no ambiente de tempo de execução. São geralmente
subclasses de CX_DYNAMIC_CHECK.
● CX_NO_CHECK
Para subclasses de CX_NO_CHECK, você não pode propagar as exceções
correspondentes explicitamente utilizando o suplemento RAISING. Se você não tratar
essas exceções no bloco de processamento onde elas ocorrem, elas são propagadas
automaticamente. Se o bloco de chamada não tratar das exceções, elas são propagadas
automaticamente para o nível mais alto da hierarquia de chamadas. Se as exceções não
forem tratadas no nível superior, ocorre um erro em tempo de execução no ponto em que
elas foram criadas. Algumas exceções predefinidas com o prefixo CX_SY_... para
situações de erro no ambiente de tempo de execução são subclasses de CX_NO_CHECK.
Tratamento de exceções
Depois que uma exceção é interceptada em uma instrução CATCH, você pode tratá-la de
várias formas diferentes.
1. Continue o programa por trás de uma instrução ENDTRY após executar uma das
seguintes ações:
● Emitindo um aviso
● Escrever em um protocolo
● Correção da situação
A instrução RETRY
Ao tratar uma exceção em um bloco CATCH, use a instrução RETRY para voltar para a
instrução TRY da respectiva estrutura TRY-ENDTRY, por exemplo, se a causa da exceção
tiver sido removida durante o tratamento.
Dica:
Essa técnica é nova com o release SAP NetWeaver 7.0 EhP 2.
Cuidado:
Você deve usar RETRY com algum cuidado. Se você não remover a causa da
exceção adequadamente, seu programa entrará em um loop infinito.
Utilize a instrução RESUME para retomar um programa imediatamente após a instrução que
acionou a exceção no texto fonte.
Você deve cumprir os seguintes pré-requisitos para utilizar a instrução RESUME:
1. A exceção deve ser capturada com a instrução CATCH usando o suplemento BEFORE
UNWIND. Isso assegura que o contexto da exceção seja mantido ativo para um possível
RESUME. Se o bloco CATCH sair sem a instrução RESUME, o sistema exclui o contexto da
exceção após o bloco CATCH ser encerrado.
2. A exceção deve ser criada com a variante RAISE RESUMABLE ... da instrução RAISE
EXCEPTION. Isso prepara o bloqueio de processamento de acionamento para o RESUME.
3. Se a exceção for propagada, você deve marcá-la como resumível em todos os níveis
hierárquicos usando o suplemento RAISING RESUMABLE ( ... ) com o nome da classe de
exceção dentro dos parênteses. Isso prepara todos os métodos que propagam a exceção
para um possível RESUME.
Dica:
Existe um campo de seleção para indicar a utilização de exceções básicas de
classe na interface de um módulo de função e a assinatura de um método.
Quando verificado, o módulo de função ou o método deve utilizar todas as
exceções baseadas na classe. Quando deixada desmarcada, todas as
exceções clássicas devem ser usadas.
Dica:
Neste exemplo, você mantém o contexto da exceção. Sem o suplemento
BEFORE UNWIND, o sistema exclui a instância recém-criada antes de executar o
bloco CATCH. Não seria possível continuar o método GET_GET_TECH_ATTR e o
construtor.
Você cria exceções baseadas na classe com uma das seguintes variantes da instrução RAISE
EXCEPTION:
● RAISE EXCEPTION TYPE <exception_class> [EXPORTING ...]
Essa instrução cria um novo objeto de exceção, que é uma instância da classe
<exception_class>. Opcionalmente, os valores podem ser fornecidos para o construtor
usando o suplemento EXPORTING.
● RAISE EXCEPTION <object_ref>
Esta instrução utiliza um objeto de exceção existente, ou seja, qualquer que seja o objeto
de exceção <object_ref> que aponta. Este objeto de exceção é criado diretamente, usando
uma instrução CREATE OBJECT ou, mais comumente, capturado em um CATCH
anterior ... instrução INTO ... e transfira explicitamente para o chamador.
Mapeamento de exceções
Depois de interceptar uma exceção, o programa pode criar uma segunda exceção, e assim
por diante. Um objeto de exceção se torna inválido quando o programa deixa o bloco CATCH.
Por isso, o manipulador no nível superior só pode acessar o último objeto de exceção. No
entanto, você pode encadear objetos de exceção, ou seja, você pode deixar que um objeto de
exceção aponte para um antes, que aponte um antes, etc. O manipulador de uma exceção
pode seguir a cadeia e avaliar cada objeto de exceção na sequência.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Explicar a hierarquia de classes de exceção predefinidas
● Explicar as diferentes formas de tratamento de uma exceção
● Repetir após exceções
● Implementar exceções retomáveis
● Mapear exceções
Avaliação da aprendizagem
1. Qual das seguintes afirmações é utilizada para criar exceções baseadas na classe?
Escolha a resposta correta.
X A EXPORTING
X B EXCEÇÃO RAISE
X C CREATE OBJECT
X D CATCH
X A IMPORTANDO….RETURNING
X B MÉTODO…. ENDMETHOD
X C TRY … ENDTRY
X D TRY...CATCH...ENDTRY
3. Uma exceção baseada na classe só pode ser tratada se a instrução que a criou estiver
incluída em uma estrutura de controle TRY-ENDTRY.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
X Verdadeiro
X Falso
X Verdadeiro
X Falso
6. Se for criada uma exceção, o nome da classe de exceção é exibido no campo __________
no modo de depuração.
Escolha a resposta correta.
X A exceção acionada
X C watchpoint
X D layout
7. Qual das seguintes adições de sintaxe é utilizada para propagar uma exceção de um
procedimento?
Escolha a resposta correta.
X A CATCH
X B RAISING
X C METHODS
X D FORM
X A CX_STATIC_CHECK
X B CX_NO_CHECK
X C CX_DYNAMIC_CHECK
X A Continuar programa
10. Qual das seguintes opções é usada para voltar para a instrução TRY?
Escolha a resposta correta.
X A RETRY
X B CATCH
X C TRY-ENTRY
X D RAISE
11. Qual das seguintes opções é um pré-requisito para utilizar a instrução RESUME?
Escolha as respostas corretas.
1. Qual das seguintes afirmações é utilizada para criar exceções baseadas na classe?
Escolha a resposta correta.
X A EXPORTING
X B EXCEÇÃO RAISE
X C CREATE OBJECT
X D CATCH
Você está correto! As exceções baseadas na classe são criadas pela instrução RAISE
EXCEPTION ou pelo ambiente de tempo de execução. Saiba mais na tarefa Utilização da
instrução RAISE EXCEPTION, na lição Explicação de exceções baseadas na classe, do
curso BC401.
X A IMPORTANDO….RETURNING
X B MÉTODO…. ENDMETHOD
X C TRY … ENDTRY
X D TRY...CATCH...ENDTRY
Você está correto! Você trata a exceção utilizando a instrução CATCH na estrutura TRY-
ENDTRY. Saiba mais na tarefa Tratamento de exceções baseado na classe, na lição
Explicação de exceções baseadas na classe, no curso BC401.
3. Uma exceção baseada na classe só pode ser tratada se a instrução que a criou estiver
incluída em uma estrutura de controle TRY-ENDTRY.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
Você está correto! Saiba mais na tarefa Downcasts com interfaces na lição Integração de
modelos de classe utilizando interfaces, no curso BC401.
X Verdadeiro
X Falso
Você está correto! Como todas as estruturas de controle em ABAP Objects, você pode
aninhar estruturas TRY-ENDTRY em qualquer nível. Em particular, o bloco TRY, o bloco
CATCH e o bloco CLEANUP podem conter estruturas TRY-ENDTRY completas. Saiba
mais na tarefa Tratamento de exceções baseado na classe, na lição Explicação de
exceções baseadas na classe, no curso BC401.
X Verdadeiro
X Falso
Você está correto! Indique qualquer número de classes de exceção na instrução CATCH.
Assim, você define um manipulador de exceções para todas essas classes de exceção e
suas subclasses. Saiba mais na tarefa Tratamento de exceções baseado na classe, na
lição Explicação de exceções baseadas na classe, no curso BC401.
6. Se for criada uma exceção, o nome da classe de exceção é exibido no campo __________
no modo de depuração.
Escolha a resposta correta.
X A exceção acionada
X C watchpoint
X D layout
Você está correto! Se for criada uma exceção, o sistema exibe o nome da classe de
exceção no campo Exceção acionada no modo de depuração. Saiba mais na tarefa
Exceções baseadas na classe no depurador, na lição Explicação das exceções baseadas
na classe, do curso BC401.
7. Qual das seguintes adições de sintaxe é utilizada para propagar uma exceção de um
procedimento?
Escolha a resposta correta.
X A CATCH
X B RAISING
X C METHODS
X D FORM
Você está correto! Para propagar uma exceção de um procedimento, você geralmente
usa o suplemento RAISING quando define a interface do procedimento. Saiba mais na
tarefa Propagação de exceções, na lição Definição e geração de exceções do curso
BC401.
X A CX_STATIC_CHECK
X B CX_NO_CHECK
X C CX_DYNAMIC_CHECK
Você está correto! Para subclasses de CX_NO_CHECK, você não pode propagar as
exceções correspondentes explicitamente utilizando o suplemento RAISING. Se você não
tratar essas exceções no bloco de processamento onde elas ocorrem, elas são
propagadas automaticamente. Saiba mais na tarefa Hierarquia de classes de exceção
predefinidas na lição Definição e geração de exceções do curso BC401.
X A Continuar programa
Você está correto! Técnicas para tratar uma exceção obtida em uma instrução CATCH:
Continue o programa por trás de uma instrução ENDTRY, remova a causa do erro e inicie
novamente, gere e propague uma exceção. Saiba mais na tarefa, Tratamento de
exceções, na lição Efinir e criar exceções, no curso BC401.
10. Qual das seguintes opções é usada para voltar para a instrução TRY?
Escolha a resposta correta.
X A RETRY
X B CATCH
X C TRY-ENTRY
X D RAISE
Você está correto! Ao tratar uma exceção em um bloco CATCH, use a instrução RETRY
para voltar para a instrução TRY da respectiva estrutura TRY-ENDTRY, por exemplo, se a
causa da exceção tiver sido removida durante o tratamento. Saiba mais na tarefa, A
declaração RETRY, na lição Implementação de técnicas avançadas de tratamento de
exceções, no curso BC401.
11. Qual das seguintes opções é um pré-requisito para utilizar a instrução RESUME?
Escolha as respostas corretas.
Você está correto! A exceção deve ser capturada com a instrução CATCH usando o
suplemento BEFORE UNWIND. Isso assegura que o contexto da exceção seja mantido
ativo para um possível RESUME. Se a exceção for propagada, você deve marcá-la como
resumível em todos os níveis hierárquicos usando o suplemento RAISING RESUMABLE
( ... ) com o nome da classe de exceção dentro dos parênteses. A exceção deve ser criada
com a variante RAISE RESUMABLE ... da instrução RAISE EXCEPTION. Saiba mais na
tarefa Implementação de exceções que podem ser retomadas, na lição Implementação de
técnicas avançadas de tratamento de exceções, no curso BC401.
Lição 1
Teste funcional com unidade ABAP 265
OBJETIVOS DO CAPÍTULO
SÍNTESE DA LIÇÃO
Esta lição explica como utilizar testes de módulo ABAP para verificar o comportamento
correto do seu programa.
Exemplo de negócio
Você deseja utilizar testes ABAP Unit para testes automatizados e eficientes de sua
codificação ABAP.
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Executar teste funcional
● Utilizar classes de teste e métodos de teste
● Executar teste funcional ABAP avançado
Teste funcional
Teste funcional é um processo no qual um desenvolvedor garante que as menores unidades
testáveis de seu código, como métodos, sejam verificáveis. Isso facilita garantir a qualidade,
refatorar o código, realizar testes de regressão e implementar de acordo com o modelo de
desenvolvimento orientado por testes. O teste funcional é parte integrante da fase de
desenvolvimento.
Os testes de módulo são escritos como classes locais dentro do programa principal de uma
classe global (pool de classes). Eles atuam como usuários da classe e, como tal, só podem
acessar seus componentes públicos. Cada teste é implementado como um método da classe,
com o objetivo de realizar operações de remoção na classe em teste que levam a um estado
particular verificável da classe. Cada método de teste é executado de forma independente.
No entanto, isso não significa necessariamente que os testes de ABAP Unit possam ser
executados em todos os sistemas. O parâmetro de perfil abap/test_generation indica para
que sistemas é gerada a carga dos testes. Normalmente, a codificação de teste só é gerada
em sistemas de desenvolvimento e de teste. Em sistemas produtivos, as classes de teste são
excluídas das versões de carga para minimizar o tamanho das cargas. Isso impede que a
codificação de teste tenha qualquer impacto na função e performance no sistema produtivo.
● Teste em massa
- Teste funcional integrado ao Code Inspector e ao ABAP Test Cockpit
● Fácil execução e avaliação
- Qualquer pessoa pode executar um teste sem conhecimento ABAP
● Abrangência do teste integrada
- Avaliar qual porcentagem do seu código está coberta pelos seus testes
● Nenhum consumo de recursos em sistemas produtivos
- Decidir em quais sistemas a codificação de teste é gerada e carregada
● Classificação de teste em relação ao consumo de tempo e danos potenciais
- Identificar testes demorados ou críticos (por exemplo, testes que atualizam dados
persistentes)
Métodos de teste
Os métodos de teste são definidos como métodos de instância sem parâmetros
(preferencialmente privados) nas suas classes de teste locais. Como uma classe de teste, a
sua definição também requer o suplemento FOR TESTING.
Um método de teste contém o código do programa a ser executado para teste, seguido por
uma verificação dos resultados derivados do código de teste. O conteúdo das variáveis a
serem testadas é comparado com os valores previstos, chamando métodos de verificação
padrão da classe de serviço CL_ABAP_UNIT_ASSERT (métodos estáticos ASSERT_...). Se os
respectivos valores não corresponderem à expectativa, o método de verificação pode inserir
uma nota, uma advertência ou mesmo um erro no log de teste.
Parâmetros de método
ABAP Workbench
● Para um programa, na barra de menu, selecione → → ProgramExecuteUnit Tests.
● Para uma classe, na barra de menu, selecione Classe → Testes → RunUnit.
● Na área da tela Nome do objeto, clique com o botão direito do mouse no nome do item
e selecione Executar → testes de unidade.
O teste ABAP Unit está incluído nos dois ambientes de desenvolvimento ABAP. Nos dois
ambientes, você pode executar testes de ABAP Unit para objetos do repositório individuais
(classe, grupo de funções, programa) e também para um pacote de desenvolvimento
completo. Para permitir testes em massa, o framework de teste de unidade também está
incluído em outras ferramentas, como o Code Inspector (código de transação: SCI) e o ABAP
Test Cockpit (código de transação ATC).
A figura, Exemplo: Executar um teste de unidade ABAP no ABAP Workbench, ilustra como
iniciar um teste de unidade para um programa executável.
No lado esquerdo da figura Exemplo de resultado de teste no ABAP Workbench, existe uma
lista dos testes executados (métodos de teste agrupados por classes de teste). Um semáforo
vermelho indica as classes e os métodos com erros. Quando você seleciona uma entrada com
um semáforo vermelho, uma lista de erros é exibida na área de tela Alertas e mensagens no
lado direito. Quando você clica em uma mensagem de erro, os detalhes da mensagem são
exibidos na área da tela Análise. Na área Análise, você pode navegar para o texto fonte do
método de teste.
Teste expositores
Um expositor é uma configuração de teste criada antes da chamada de um método de teste e
garante um comportamento de teste único. Um expositor é composto por dados de teste,
objetos de teste, recursos e conexões.
Dica:
Devido à forma como estes métodos são chamados, todos os testes que utilizam
o mesmo expositor devem ser incluídos na mesma classe de teste.
Os métodos de expositor referem-se sempre à classe atual. Em classes de teste que herdam
umas das outras, os métodos de expositor são executados para cada classe envolvida. Os
métodos de setup são executados das classes superiores para as subclasses e os métodos
de desmontagem das subclasses para as classes superiores.
Abrangência do teste
O ABAP Unit permite que você verifique a exatidão de seu teste funcional e encontre
facilmente qualquer código não testado.
Para executar testes de ABAP Unit com medição de cobertura de código, selecione
→ ExecuteUnit Tests With → Coverage no menu de contexto do objeto de desenvolvimento
na área de navegação (ABAP Workbench) ou Coverage As → ABAP Unit Test no menu de
contexto do Project Explorer (ADT).
A cobertura alcançada pela execução dos testes de ABAP Unit é exibida ao lado do resultado
do teste em uma ficha de registro adicional.
Dica:
A análise de cobertura está muito melhor integrada às ferramentas de
desenvolvimento ABAP. Enquanto que no ABAP Workbench você só vê uma lista
de números.
Tipos de cobertura
As ferramentas de desenvolvimento ABAP exibem a cobertura no editor de código-fonte da
seguinte forma:
Cobertura de instruções
Cada linha executável é destacada em verde ou vermelho. Verde indica que o extrato foi
excedido. Vermelho indica que a linha não foi executada.
Cobertura da filial
As filiais em seu código são destacadas em vermelho se não tiverem sido executadas. As
ramificações são destacadas em verde se forem executadas e resolvidas para verdadeiro
e falso. As ramificações são destacadas em amarelo se tiverem sido executadas, mas
resolvidas somente para uma condição, verdadeira ou falsa.
Cobertura do procedimento
Os pontos de entrada de procedimento são destacados em verde ou vermelho para
indicar se foram chamados ou não.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Executar teste funcional
● Utilizar classes de teste e métodos de teste
● Executar teste funcional ABAP avançado
Avaliação da aprendizagem
1. No ABAP Unit, o método SETUP é chamado antes de cada método de teste individual.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
2. Quais das seguintes afirmações sobre testes de ABAP Unit são verdadeiras?
Escolha as respostas corretas.
1. No ABAP Unit, o método SETUP é chamado antes de cada método de teste individual.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
Você está correto! O método SETUP é um método de instância, que é executado antes de
cada método de teste individual da classe. Saiba mais na tarefa Fixações de texto na lição
Teste de unidade com unidade ABAP do curso BC401.
2. Quais das seguintes afirmações sobre testes de ABAP Unit são verdadeiras?
Escolha as respostas corretas.
Lição 1
Implementar técnicas avançadas orientadas a objetos 279
Lição 2
Implementação de métodos factory e padrões singleton 289
Lição 3
Implementação de classes factory utilizando amizade 293
OBJETIVOS DO CAPÍTULO
SÍNTESE DA LIÇÃO
Esta lição explica como implementar classes abstratas e classes finais, como acessar tabelas
internas com referências a objetos e como chamar os métodos de navegação.
Exemplo de negócio
Você precisa adicionar técnicas especiais de programação orientada a objetos às suas
implementações do ABAP Objects. Por esse motivo, você precisa:
● Compreensão de como definir classes abstratas
● Compreensão de como definir métodos abstratos
● Compreensão de como definir classes finais
● Compreensão de como definir métodos finais
● Compreensão de como utilizar atributos públicos protegidos contra gravação
● Compreensão de como chamar métodos de navegação
● Compreensão de como encadear métodos funcionais
● Compreensão de como definir a visibilidade do construtor de instância
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar classes abstratas
● Implementar classes finais
● Acessar tabelas internas com referências a objetos
● Chamar métodos de navegação
● Criar objetos com o operador NEW
● Trabalhar com condições no tipo dinâmico de uma referência a objetos
● Restringir a visibilidade do construtor de instância
Classes abstratas
A classe abstrata contém a definição e a implementação, mas não pode ser instanciada.
Utilize o suplemento ABSTRACT na instrução CLASS para criar uma classe abstrata. Super
classes são um uso típico para classes abstratas, já que elas não devem ser instanciadas a si
mesmas, mas suas subclasses são.
Em uma classe abstrata, você pode definir métodos abstratos, entre outras coisas. Isso
significa que o método abstrato não pode ser implementado nessa classe. Em vez disso, ela é
implementada em uma subclasse da classe. Se a subclasse dessa classe não for abstrata, os
métodos abstratos devem ser redefinidos e implementados na subclasse pela primeira vez.
Nota:
O indicador relevante está no Class Builder, na ficha de registro Atributos para
essa classe ou método.
Referências a tais classes abstratas podem ser usadas para acesso polimórfico a instâncias
de subclasse. Os métodos estáticos não podem ser abstratos porque não podem ser
redefinidos.
Classes finais
Evite que uma classe seja herdada utilizando o suplemento FINAL com a instrução de classe.
Você pode evitar que um método seja redefinido utilizando o suplemento FINAL com a
instrução methods.
Nota:
O indicador relevante está no Class Builder, na ficha de registro Atributos para
essa classe ou método.
Por isso, todos os métodos de uma classe final são implicitamente finais. Você não pode
repetir o suplemento FINAL nos próprios métodos. As classes que são abstratas e finais
devem conter apenas componentes estáticos.
Como mostrado na figura Acesso de leitura utilizando atributos públicos, a redundância das
informações-chave pode ser evitada tornando públicos os atributos-chave. Os atributos
públicos podem ser utilizados diretamente nas instruções para acessar tabelas internas
como READ TABLE e LOOP AT. A expressão TABE_LINE utilizada aqui é uma parte integrada
da linguagem ABAP. Quando o tipo de linha de uma tabela interna é um tipo de dados
elementar em vez de um tipo de estrutura, você precisa usar TABLE_LINE. Essas tabelas
internas têm apenas uma coluna sem nome. TABLE_LINE é usado como nome de coluna
genérico para essa coluna única.
Dica:
É contra os princípios fundamentais da programação orientada a objetos tornar
públicos os atributos. Infelizmente, o ABAP não permite que você utilize
métodos funcionais (como os métodos no nosso exemplo GET_MAKE,
GET_MODEL, etc.) no lado esquerdo das cláusulas WHERE e adições WITH KEY.
Por isso, os atributos públicos só são utilizados em alguns casos especiais no
modo somente leitura.
O operador NEW cria uma nova instância de uma classe, substituindo assim CREATE
OBJECT. Após NOVO, você deve indicar a classe que quer instanciar. No exemplo da figura
Criação de objetos com o operador NEW, o sinal de hash (#) indica que a classe a ser
instanciada deve ser derivada da definição da variável de referência, de modo que go_vehicle
manterá uma referência a uma instância da classe lcl_vehicle. No segundo exemplo, é criada
uma instância de subclasse, por isso é necessário digitar explicitamente com a subclasse
desejada.
Observe que o operador NEW só pode aceitar os parâmetros de importação do construtor e
que não é possível tratar exceções convencionais baseadas em sy-subrc. Você trata exceções
baseadas na classe colocando a instrução que contém o operador NEW em um TRY...
CATCH... ENDTRY normalmente.
O operador NEW está disponível desde o release 7.40.
A partir do release AS ABAP 7.50, você pode utilizar a expressão IS INSTANCE OF para
descobrir se uma referência a objetos aponta para uma instância de uma determinada classe.
Figura 170: Caso especial TIPO DE CASO DE distinção para variáveis de referência a objetos
Disponível a partir do release 7.50, a estrutura de controle CASE TYPE OF permite distinguir
entre diferentes tipos possíveis de uma referência a objetos. O bloco WHEN TYPE
correspondente é processado se o tipo dinâmico da variável de referência a objetos
corresponder à classe indicada. O suplemento opcional INTO permite executar um down cast
diretamente especificando uma variável de referência.
Nota:
O código correspondente encontra-se no Class Builder na ficha de registro
Atributos da respectiva classe.
Dica:
A visibilidade do construtor não é definida colocando a definição do método
CONSTRUCTOR na respectiva seção da definição de classe. Na verdade, antes
do SAP NetWeaver 7.0, era obrigatório colocar o construtor sintaticamente na
seção pública. Desde o SAP NetWeaver 7.0, é permitido, mas não é necessário
colocar o construtor na seção protegida ou privada - se isso não for mais
restritivo do que o suplemento CREATE… na definição de classe. Isso é para
aumentar a legibilidade da codificação.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar classes abstratas
● Implementar classes finais
● Acessar tabelas internas com referências a objetos
● Chamar métodos de navegação
● Criar objetos com o operador NEW
● Trabalhar com condições no tipo dinâmico de uma referência a objetos
● Restringir a visibilidade do construtor de instância
SÍNTESE DA LIÇÃO
Esta lição explica os conceitos de métodos factory, o singleton pattern e sua implementação.
Exemplo empresarial:
Você precisa adicionar técnicas especiais de programação orientada a objetos às suas
implementações do ABAP Objects. Por esse motivo, você precisa:
● Compreensão do método factory
● Compreender o padrão singleton
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar métodos factory
● Implementar o modelo singleton
Métodos factory
A restrição da visibilidade do construtor de instância somente fará sentido se a instanciação
for feita em algum lugar da classe (ou suas subclasses, no caso de CREATE PROTECTED).
Frequentemente, tais classes fornecem um método estático público que cria uma instância
dessa classe e retorna a referência a essa instância para o chamador. Esses métodos são às
vezes chamados de métodos factory. Métodos de fábrica são executados quando uma
instância da classe é criada e tem algumas vantagens em comparação com o construtor de
instância.
● Um método factory pode ter codificação que é executada antes da instanciação real.
Por exemplo, o método pode executar verificações, ler dados do banco de dados ou definir
bloqueios antes de criar efetivamente a instância. Se ocorrer um erro, nenhuma instância
será criada e nenhuma memória será alocada para ela.
● As classes podem ter mais de um método factory. Cada um dos métodos também pode
ter uma implementação e uma assinatura diferentes.
O método factory diferente possibilita a criação de instâncias da mesma classe com base
em informações diferentes. Por exemplo, um método factory cria uma nova instância que
oferece parâmetros de entrada para todos os atributos, enquanto outro método factory só
importa informações-chave e, em seguida, recupera os outros valores de atributo do
banco de dados.
● Utilizar métodos factory para administrar as instâncias de uma classe dentro da própria
classe.
A administração da instância dentro da classe é frequentemente usada para evitar a
criação de muitas instâncias idênticas. Uma referência de cada instância nova é
armazenada em um atributo estático privado da classe (uma tabela interna). Sempre que
o método factory é chamado, ele primeiro verifica se uma instância com essa chave já
existe. Em caso afirmativo, ele retorna a instância existente em vez de criar uma nova.
● Utilize um método factory para instanciar uma das subclasses em vez da própria classe.
Como exemplo, o método factory de uma classe de avião pode verificar o tipo de avião e,
em seguida, instanciar uma carga ou um avião de passageiros.
O exemplo ilustra uma classe com um método factory e utiliza um atributo estático para
referenciar todas as suas instâncias. A instanciação é restrita à classe e só é efetuada no
método estático FACTORY. Quando o método é chamado, o método factory verifica se já foi
criada uma instância idêntica. Em caso afirmativo, ele retorna a instância existente em vez de
criar uma nova.
Dica:
Neste exemplo, não é necessário tornar públicos os atributos para a instrução
READ TABLE. Como o método factory se encontra na classe, ele tem acesso
total a todos os atributos privados.
O padrão Singleton
Utilize o conceito singleton para evitar que uma classe seja instanciada mais de uma vez para
o mesmo contexto de programa.
Existem várias maneiras diferentes de implementar uma classe singleton. O primeiro padrão
singleton é um caso especial do conceito de fábrica. Em vez de arquivar várias instâncias, a
classe armazena somente uma instância. Quando o método factory GET_INSTANCE é
chamado pela primeira vez, ele instancia a classe. Para cada chamada subsequente, ele
retorna a referência ao objeto existente.
A classe utiliza seu construtor estático para criar a instância única antecipadamente. O
método GET_INSTANCE não cria a instância, mas só retorna uma referência à instância já
existente.
Dica:
Em uma terceira variante do padrão singleton, o atributo estático GO_INSTANCE
é tornado público e somente leitura. O método GET_INSTANCE não é
necessário.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar métodos factory
● Implementar o modelo singleton
SÍNTESE DA LIÇÃO
Esta lição explica o método de implementação de classes factory utilizando amizade.
Exemplo de negócio
Como desenvolvedor, crie uma classe factory para aviões usando amizade. Por esse motivo,
você precisa:
● Compreensão da definição de relações de amizade
● Compreensão de amizade e herança
● Compreensão da implementação de classes factory
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar relações de amizade
Em alguns casos, as classes devem trabalhar em conjunto de forma tão próxima que uma
classe precisa de acesso às outras classes protegidas e componentes privados. Da mesma
forma, uma classe pode precisar ser capaz de criar instâncias da outra classe,
independentemente da visibilidade do construtor. Para evitar tornar essas opções disponíveis
para todos os usuários da classe, utilize o conceito de amizade de classe. Uma classe pode
conceder amizade a outras classes e interfaces e, assim, a todas as classes que
implementam a interface.
Para criar amizade, utilize o suplemento FRIENDS da instrução CLASS ou a ficha de registro
FRIENDS no Class Builder. Todas as classes e interfaces para as quais a amizade é concedida
estão listadas.
A concessão de amizade é unilateral.
Uma turma que concede amizade não é automaticamente um amigo dos amigos das aulas.
Se uma classe que concede amizade quiser acessar os componentes não públicos de um
amigo, esse amigo deve também conceder explicitamente amizade a essa classe.
Uma aplicação típica do conceito de amigos é a definição de uma classe factory. Como o
método factory, uma classe factory cria e administra as instâncias de uma classe. Ao
terceirizar a administração para uma classe dedicada, a própria classe é mantida menor e
mais fácil de entender.
No exemplo, LCL_FACTORY serve como uma classe factory para aviões. A classe
LCL_FACTORY fornece um método público CREATE_AIRPLANE no qual CREATE_AIRPLANE
instancia a classe LCL_AIRPLANE ou retorna uma referência a uma instância já existente.
Para restringir a instância, a classe LCL_AIRPLANE é definida com a adição de CREATE
PRIVATE. Ao adicionar FRIENDS LCL_FACTORY, a amizade permite que a classe factory e
somente a classe factory criem instâncias de avião e acessem os atributos privados.
Dica:
Outra vantagem da classe factory dedicada é que se a classe tem subclasses, a
decisão sobre qual das classes deve ser instanciada poderia ser feita dentro da
classe factory em vez do programa de chamada. No exemplo, o método
CREATE_AIRPLANE poderia criar e retornar uma instância de
LCL_CARGO_PLANE ou LCL_PASSENGER_PLANE, dependendo do tipo de
plano.
Amizade e herança
O atributo amigo é herdado. Classes que herdam de amigos e interfaces contendo um amigo
como uma interface componente, também se tornam amigas. Por isso, aconselhamos que a
extrema cautela deve ser tomada ao conceder amizade. Quanto mais alto um amigo estiver
na árvore de herança, maior será o número de subclasses que podem acessar todos os
componentes de uma classe que concede amizade.
Por outro lado, a concessão de amizade não é herdada. Um amigo de uma classe superior
não é, portanto, automaticamente um amigo de suas subclasses.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar relações de amizade
Avaliação da aprendizagem
1. _____________ estático não pode ser abstrato porque não pode ser redefinido.
Escolha a resposta correta.
X A classes
X B estruturas
X C métodos
X D atributos
2. Você pode evitar que uma classe seja herdada, definindo a mesma como final.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
3. Uma associação significa que, no momento da execução, uma instância de uma classe
arquiva referências a objetos de outra classe.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
X Verdadeiro
X Falso
X B Uma classe pode ter mais de um método factory com diferentes implementações
e assinaturas.
X D Um método factory não pode ser utilizado para instanciar uma das subclasses em
vez da própria classe.
6. Qual dos seguintes conceitos é utilizado para fornecer um acesso de classe aos
componentes privados da outra classe?
Escolha a resposta correta.
X A Singleton
X B Amizade
X C Interface
X D Fundição
1. _____________ estático não pode ser abstrato porque não pode ser redefinido.
Escolha a resposta correta.
X A classes
X B estruturas
X C métodos
X D atributos
Você está correto! Em uma classe abstrata, você pode definir métodos abstratos, entre
outras coisas. Isso significa que o método abstrato não pode ser implementado nessa
classe. Em vez disso, ela é implementada em uma subclasse da classe. Se a subclasse
dessa classe não for abstrata, os métodos abstratos devem ser redefinidos e
implementados na subclasse Métodos estáticos não podem ser abstratos porque não
podem ser redefinidos. Saiba mais na tarefa Classes abstratas, na lição Implementação
de técnicas avançadas orientadas a objetos, no curso BC401.
2. Você pode evitar que uma classe seja herdada, definindo a mesma como final.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
Você está correto! Evite que uma classe seja herdada utilizando o suplemento FINAL com
a instrução de classe. Saiba mais na tarefa, Classes finais, na lição Implementação de
técnicas avançadas orientadas a objetos, no curso BC401.
3. Uma associação significa que, no momento da execução, uma instância de uma classe
arquiva referências a objetos de outra classe.
Determine se esta afirmação é verdadeira ou falsa.
X Verdadeiro
X Falso
X Verdadeiro
X Falso
X B Uma classe pode ter mais de um método factory com diferentes implementações
e assinaturas.
X D Um método factory não pode ser utilizado para instanciar uma das subclasses em
vez da própria classe.
Você está correto! Um método factory pode ter codificação que é executada antes da
instanciação real. O método pode executar verificações, ler dados do banco de dados ou
definir bloqueios antes de criar efetivamente a instância. As classes podem ter mais de
um método factory. Cada um dos métodos também pode ter uma implementação e uma
assinatura diferentes. O método factory diferente possibilita a criação de instâncias da
mesma classe com base em informações diferentes. Leia mais na tarefa, Vantagens dos
métodos factory, na lição, Implementando o Padrão de Singleton, no curso BC401.
6. Qual dos seguintes conceitos é utilizado para fornecer um acesso de classe aos
componentes privados da outra classe?
Escolha a resposta correta.
X A Singleton
X B Amizade
X C Interface
X D Fundição
Você está correto! Em alguns casos, as classes devem trabalhar em conjunto de forma
tão próxima que uma classe precisa de acesso às outras classes protegidas e
componentes privados. Ou, uma classe pode precisar criar instâncias da outra classe,
independentemente da visibilidade do construtor. Neste caso, utilize o conceito de
amizade de classe. Leia mais na tarefa, Definição de relações de amizade, na lição
Implementação de classes factory utilizando a amizade, claro BC401.
Lição 1
Utilizar identificação de tipo em tempo de execução (RTTI) 305
OBJETIVOS DO CAPÍTULO
● Explicar RTTI
● Descrever características do tipo de estrutura no momento da execução
● Descrever características do tipo de objeto no momento da execução
SÍNTESE DA LIÇÃO
Esta lição descreve como implementar a identificação do tipo de tempo de execução.
Exemplo de negócio
Você quer descobrir de qual classe um determinado objeto é uma instância. Você também
quer encontrar as características de qualquer classe, interface ou tipo de dados. Por esse
motivo, você necessita dos seguintes conhecimentos:
● Compreender a identificação do tipo de tempo de execução
● Compreensão de como consultar características do tipo de estrutura no momento da
execução
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Explicar RTTI
● Descrever características do tipo de estrutura no momento da execução
● Descrever características do tipo de objeto no momento da execução
RTTI
Para obter uma referência a um objeto de descrição de um tipo, utilize os métodos estáticos
da classe CL_ABAP_TYPEDESCR ou os métodos de navegação da classe de descrição
especial. Os objetos de descrição são então criados a partir de uma das subclasses. em
tempo de processamento, existe exatamente um objeto de descrição para cada tipo. Os
atributos do objeto de descrição contêm informações sobre os atributos do tipo.
Em nosso exemplo de negócios anterior com a agência de viagens e seu parceiro de negócios,
especificamos que uma instância da classe de locação de veículos (LCL_RENTAL) reage a um
evento incluindo a instância de veículo que acionou o evento em uma lista. As instâncias
acionadoras incluem ônibus (LCL_BUS) e caminhões (LCL_TRUCK).
Para estender o exemplo, suponha que a locadora de veículos esteja interessada apenas em
ônibus. O parâmetro SENDER do método de manipulador de eventos contém a referência à
instância de veículo acionador. Seu tipo de objeto dinâmico deve ser analisado para
determinar se o veículo em questão é um ônibus ou um caminhão.
A chamada do método RTTI funcional retorna a referência à instância de descrição da
instância de veículo transferida.
A classe abstrata CL_ABAP_TYPEDESCR tem o método DESCRIBE_BY_OBJECT_ REF. Você
digita o parâmetro de retorno DESCRIBE_BY_OBJECT_REF como referência a
CL_ABAP_TYPEDESCR. No entanto, uma vez que você digita o parâmetro real GO_DESCR na
subclasse CL_ABAP_CLASSDESCR, você precisa atribuir o objeto utilizando um down-cast.
Agora, você pode acessar os atributos da instância de descrição de qualquer forma. O
método funcional GET_RELATIVE_NAME fornece o nome da classe.
Nota:
É possível consultar atributos de tipo de objeto no tempo de execução sem utilizar
classes RTTI. Por exemplo, você pode utilizar uma atribuição down-cast de
SENDER para uma variável de referência que tem um tipo estático LCL_BUS. Isso
resulta em um erro em tempo de execução para instâncias de veículo que não são
ônibus. Em seguida, você pode detectar este erro em tempo de execução. Neste
caso, o fato de não ter sido acionado um erro em tempo de execução é o critério
para incluir um veículo na lista de veículos.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Explicar RTTI
● Descrever características do tipo de estrutura no momento da execução
● Descrever características do tipo de objeto no momento da execução
Avaliação da aprendizagem
1. Qual das seguintes classes é utilizada para identificar os atributos de uma estrutura
usando a identificação do tipo em tempo de execução?
Escolha a resposta correta.
X A CL_ABAP_TYPEDESCR
X B CL_ABAP_STRUCTDESCR
X C CL_ABAP_OBJECTDESCR
X D CL_ABAP_CLASSDESCR
X A COMPONENTES
X B TYPE_KIND
X C LENGTH
X D DECIMALS
1. Qual das seguintes classes é utilizada para identificar os atributos de uma estrutura
usando a identificação do tipo em tempo de execução?
Escolha a resposta correta.
X A CL_ABAP_TYPEDESCR
X B CL_ABAP_STRUCTDESCR
X C CL_ABAP_OBJECTDESCR
X D CL_ABAP_CLASSDESCR
Você está correto! Você pode identificar os atributos de uma estrutura utilizando a
subclasse CL_ABAP_STRUCTDESCR de RTTI. Leia mais na tarefa Descrições de RTTI de
tipo estruturado, na lição Utilização de identificação de tipo em tempo de execução
(RTTI), no curso BC401.
X A COMPONENTES
X B TYPE_KIND
X C LENGTH
X D DECIMALS
Lição 1
Implementar objetos persistentes 315
OBJETIVOS DO CAPÍTULO
SÍNTESE DA LIÇÃO
Esta lição mostra como implementar objetos persistentes.
Exemplo de negócio
Você precisa utilizar Objetos persistentes para acessar suas tabelas de banco de dados e
também transações orientadas a objetos (OO) em seus programas ABAP Objects. Por esse
motivo, você precisa:
● Compreensão dos serviços de persistência
● Compreensão de classes persistentes
● Compreensão de como criar objetos persistentes
● Compreensão de como ler dados com objetos persistentes
● Compreensão de como criar transações OO
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Explicar serviços de persistência
● Examinar classes persistentes
● Criar objetos persistentes
● Ler dados com objetos persistentes
● Criar transações OO
Serviços persistentes
Em princípio, os programas ABAP trabalham com dados e objetos que só são válidos no
momento da execução. Os dados e objetos utilizados em programas ABAP são transientes.
Os dados na memória são temporários e desaparecem quando o programa termina. Para
armazenar os dados permanentemente e independentemente do programa, você deve
armazená-los em um banco de dados. Teoricamente, você também pode utilizar arquivos no
nível do sistema operacional.
Para isso, os serviços de persistência para ABAP Objects foram introduzidos no SAP
NetWeaver Application Server (SAP NetWeaver AS). Mediante solicitação, o desenvolvedor
ABAP pode utilizar estes serviços e escrever os valores de atributo atuais de objetos como
persistentes nas tabelas transparentes associadas. Para ler os valores das tabelas, os
serviços persistentes podem ser utilizados para importar os valores para um objeto
previamente definido como persistente. Ao fazer isso, os serviços de persistência utilizam a
interface ABAP Open SQL.
Você utilizará os serviços de persistência com técnicas de programação orientadas a objetos.
Assim, você pode simular um sistema de administração de bancos de dados orientado a
objetos, através de um sistema de administração de bancos de dados relacionais e do ABAP
Objects.
Classes persistentes
Para utilizar o serviço de persistência para objetos, você deve criar os respectivos tipos como
classes persistentes no Class Builder. O termo classe persistente indica que o serviço de
persistência administra as instâncias da classe e seu estado. (As classes globais são
geralmente persistentes. A questão é se suas instâncias são ou não igualmente persistentes.)
Para garantir que as instâncias de classes persistentes são únicas, elas devem conter
atributos-chave. Você pode tipificá-los como números de identificação unívocos globais
(GUID do objeto) ou chaves semânticas.
Quando você cria uma classe persistente ZCL_<nome>, o Class Builder gera
automaticamente métodos para obter e definir os respectivos atributos. Além disso, o
sistema também gera outros objetos do repositório, incluindo o ator de classe (também
conhecido como agente de classe) ZCA_<nome>. Os programas devem chamar os métodos
dessa classe para administrar as instâncias de classes persistentes, ou seja, objetos
persistentes. O ator de classe também executa o acesso real ao banco de dados. Ele herda
automaticamente os métodos necessários da classe de base ZCB_<nome>. Você pode
redefinir esses métodos, se necessário. Por exemplo, ampliar acessos ao banco de dados. O
autor de classe é uma instância singleton e tem uma relação de amizade com a classe
persistente.
No programa, você precisa definir uma variável de referência com o tipo do autor de classe e
preenchê-la com a referência do atributo estático AGENT. Então você pode criar uma nova
instância da classe persistente, utilizando o método CREATE_PERSISTENT. O desenvolvedor
ABAP cria sua interface a partir da definição dos atributos chave da classe persistente. Se já
existir um objeto persistente da mesma classe de persistência com os mesmos atributos de
chave no programa, é acionada a exceção baseada na classe CX_OS_OBJECT_EXISTING. Por
padrão, os dados são gravados por uma atualização assíncrona. Você deve iniciar este
processo utilizando a instrução COMMIT WORK. Assim, as instâncias da classe persistente só
se tornam objetos persistentes após esse momento.
Você pode carregar um objeto persistente individual de volta para um programa utilizando o
método GET_PERSISTENT. Ao fazer isso, você deve transferir os valores-chave para os
parâmetros da interface para que você possa restaurar o objeto de forma única. Se o
programa não encontrar o objeto, ele aciona a exceção baseada na classe
CX_OS_OBJECT_NOT_FOUND.
Você pode recuperar um conjunto maior de objetos persistentes utilizando o serviço de
consulta. É possível fornecer uma seleção, tal como a cláusula WHERE de uma instrução
SELECT, bem como os critérios de ordenação.
2. Procure ou crie uma tabela transparente adequada que tenha um campo para cada
atributo da classe. Se necessário, ajuste os atributos da classe para que correspondam
aos atributos de campo técnicos da tabela transparente.
Nota:
Deve existir um campo-chave primário na tabela para cada atributo-chave da
classe ou deve existir um atributo-chave da classe para cada campo-chave
primário na tabela.
3. No Class Builder, crie uma classe persistente como descrito na biblioteca SAP. Defina o
mapeamento de persistência para a tabela.
Transação OO
Na atualização de transações, você pode criar o código de transação como uma transação
OO. Isso significa que você liga o código de transação ao serviço de transação do ABAP
Objects Services para objetos persistentes ou a um método público em uma classe global ou
local de um programa. Ao chamar este tipo de transação OO, que está ligado a um método de
instância, o sistema cria automaticamente uma instância da classe em sua própria sessão
interna e, em seguida, executa esse método de instância.
Cuidado:
Você ainda necessita de programas básicos de procedimento para campos de
tela.
Cuidado:
As classes globais em ABAP Objects não podem conter definições de tela.
Por isso, ao criar uma ligação a uma classe global, considere os seguintes
pontos:
● O construtor não pode conter parâmetros IMPORTING.
● Você não pode processar exibições de lista ABAP.
A quebra dessas regras não causará um erro de sintaxe ou uma mensagem da Verificação
ampliada de sintaxe. Em vez disso, você causará um erro em tempo de execução ou não
haverá exibição
Por isso, você pode ter que recorrer à utilização de métodos em classes de programa locais.
Naturalmente, você pode utilizar todas as técnicas convencionais de programação em
diálogo.
1. Na caixa de diálogo Criar transação, insira uma descrição no campo Texto breve.
2. Selecione a opção Método de uma classe (transação OO) como um Objeto inicial.
4. Insira o Nome da classe e o Método. Se você estiver utilizando uma classe local, marque o
campo de seleção Local no programa e insira o nome do programa.
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Explicar serviços de persistência
● Examinar classes persistentes
● Criar objetos persistentes
● Ler dados com objetos persistentes
● Criar transações OO
Avaliação da aprendizagem
1. O que você deve fazer para utilizar o serviço de persistência para objetos?
Escolha a resposta correta.
X C Você deve criar os respectivos tipos como classes persistentes no Class Builder.
X A CX_SY_ZERODIVIDE
X B CX_SY_MOVE_CAST_ERROR
X C CX_OS_OBJECT_EXISTING
X D CX_ROOT
3. Como você pode criar uma nova instância de uma classe persistente?
Escolha a resposta correta.
4. Como você pode carregar um único objeto persistente de volta para um programa?
Escolha a resposta correta.
1. O que você deve fazer para utilizar o serviço de persistência para objetos?
Escolha a resposta correta.
X C Você deve criar os respectivos tipos como classes persistentes no Class Builder.
Você está correto! Para utilizar o serviço de persistência para objetos, você deve criar os
respectivos tipos como classes persistentes no Class Builder. O termo classe persistente
indica que o serviço de persistência administra as instâncias da classe e seu estado. Saiba
mais na tarefa Serviços de persistência, na lição Implementação de objetos persistentes,
do curso BC401.
X A CX_SY_ZERODIVIDE
X B CX_SY_MOVE_CAST_ERROR
X C CX_OS_OBJECT_EXISTING
X D CX_ROOT
3. Como você pode criar uma nova instância de uma classe persistente?
Escolha a resposta correta.
Você está correto! No programa, você precisa definir uma variável de referência com o
tipo do autor de classe e preenchê-la com a referência do atributo estático AGENT. Então
você pode criar uma nova instância da classe persistente, utilizando o método
CREATE_PERSISTENT. Saiba mais na tarefa Criação de objetos persistentes na lição
Implementação de objetos persistentes do curso BC401.
4. Como você pode carregar um único objeto persistente de volta para um programa?
Escolha a resposta correta.
Você está correto! Você pode carregar um objeto persistente individual de volta para um
programa utilizando o método GET_PERSISTENT. Ao fazer isso, você deve transferir os
valores-chave para os parâmetros da interface para que você possa restaurar o objeto de
forma única. Saiba mais na tarefa Acesso a objetos persistentes na lição Implementação
de objetos persistentes do curso BC401.
Você está correto! Você pode recuperar um conjunto maior de objetos persistentes
utilizando o serviço de consulta. É possível fornecer uma seleção, tal como a cláusula
WHERE de uma instrução SELECT, bem como os critérios de ordenação. Saiba mais na
tarefa Acesso a objetos persistentes na lição Implementação de objetos persistentes do
curso BC401.
Lição 1
Desenvolvimento de uma aplicação abrangente orientada a objetos 327
OBJETIVOS DO CAPÍTULO
SÍNTESE DA LIÇÃO
Esta lição explica as formas de aplicar as técnicas do ABAP Objects ao estudo de caso.
Exemplo de negócio
Um cliente deve reservar um voo em uma agência de viagens, mas o voo já está totalmente
reservado. Contudo, é dada ao cliente a opção de se registrar no voo e de ser colocado em
lista de espera. Por esse motivo, você precisa:
● Compreender os diagramas de UML
● Compreensão da programação orientada a objetos
OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Desenvolver uma aplicação abrangente orientada a objetos
Nota:
O modelo mostrado na figura é uma possível solução para os requisitos de lista de
espera descritos. Os participantes do curso podem utilizar seu próprio diagrama
de classe UML, que produz uma solução diferente.
Todas as listas de espera devem ser arquivadas em um buffer de listas de espera chamado
WAIT_LIST, que é tecnicamente uma tabela interna. Além dos dados do voo, as listas de
espera devem conter uma lista de todos os clientes que se registraram para este voo. As
funções desse aplicativo são mostradas na figura.
Funções de botões
Botão Funções
Exibir Exibe a lista de espera para o voo indicado (CARRID,
CONNID, FLDATE)
Criar Cria a lista de espera para o voo indicado (CARRID,
CONNID, FLDATE)
Excluir Elimina a lista de espera para o voo indicado (CAR-
RID, CONNID, FLDATE)
Adicionar Adiciona o cliente selecionado no lado direito da tela
à lista de espera de voo selecionada no lado esquer-
do
Eliminar (cliente) Elimina o cliente selecionado no lado direito da tela
do voo exibido no lado esquerdo
Posição Exibe a posição do cliente selecionado na lista de es-
pera
Tipo de cliente Mostra se o cliente selecionado é um cliente particu-
lar ou um cliente empresarial (você encontrará as in-
formações relevantes no campo CUSTTYPE da tabe-
la SCUSTOM)
Exibir clientes movidos para cima Exibe todos os clientes da lista que foram movidos
com êxito para cima, na lista de espera, para recebe-
rem um assento no voo
Log de status Exibe o número de clientes da lista que obtiveram
êxito ao obter um assento em um voo
RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Desenvolver uma aplicação abrangente orientada a objetos
Avaliação da aprendizagem
1. No estudo de caso, quando usamos uma classe para definir o buffer para as listas de
espera de todos os voos, qual conceito estamos implementando?
Escolha a resposta correta.
X A Classe superior
X B Classe Singleton
X C Subclasse
X D Amigos
1. No estudo de caso, quando usamos uma classe para definir o buffer para as listas de
espera de todos os voos, qual conceito estamos implementando?
Escolha a resposta correta.
X A Classe superior
X B Classe Singleton
X C Subclasse
X D Amigos
Você está correto! Você pode simplesmente definir o buffer para as listas de espera no
programa principal como uma tabela interna normal. Contudo, você quer utilizar uma
classe, neste caso, e por isso, o conceito singleton é utilizado. Saiba mais na tarefa
Requisitos de um estudo de caso orientado a objetos, na lição Desenvolvimento de uma
aplicação abrangente orientada a objetos, no curso BC401.