Objetos – Métodos – Pure Function, Modifiers, Fill-in – Abap

Publicado: 2 de março de 2014 em Abap

Pure Function

Usa os objetos como argumentos, mas não os modifica. o valor de retorno é ou um primitivo ou um novo objeto criado dentro do método.

Um método é considerado uma função pura se o resultado depender apenas dos argumentos, e não ter efeitos colaterais, como modificar um argumento ou imprimir algo. O único resultado de chamar uma função pura é o seu valor de retorno.

Na transformação funcional pura, um conjunto de funções, chamadas funções puras, definem a forma de como transformar um conjunto de dados estruturados a partir de sua forma original para outra forma. A palavra “pura” indica que as funções são combináveis​​, que exige que elas sejam:

Auto-suficiente, de modo que elas podem ser livremente ordenada e rearranjada sem emaranhamento ou interdependências com o resto do programa. Transformações puras não têm conhecimento ou efeito sobre o meio ambiente. Ou seja, as funções utilizadas para a transformação não tem efeitos colaterais.

Sem mudança de estado, de modo que a execução da mesma função ou conjunto específico de funções na mesma entrada sempre resultará na mesma saída. Transformações puras não têm memória do seu uso anterior. Funções puras ajudam a gerenciar a complexidade dos grandes projetos.

Modifiers

Usa objetos como argumentos e modifica alguns elementos ou todos eles. Muitas vezes, retorna um method. Um método modificador muda a forma como os objetos funcionam.

Fill-in

Um dos argumentos é um objeto vazio que é preenchido em pelo método. Tecnicamente, este método também é um tipo de Modifier.

Melhores Praticas

É recomendado que você escreva funções puras sempre que for razoável, e recorra aos Modifiers e Fill-ins apenas se houver uma grande vantagem.

Métodos Modifiers e Fill-in  são eficientes porque eles não têm que criar novos objetos. Mas se torna mais difícil de isolar partes de um programa, e em grandes projetos podem causar erros que são difíceis de encontrar.

Exemplo:

Neste exemplo escrevemos três métodos diferentes: Pure function, Modifier e um fill-in, e manipulamos objetos utilizando estes métodos.

Abap

*&---------------------------------------------------------------------*
*& Report  ZOBJETOS_M
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Objetos - Métodos - Pure Function, Modifier e Fill-in
*&---------------------------------------------------------------------*

REPORT  ZOBJETOS_M.

* Classe Retangulo
Class Retangulo DEFINITION.
PUBLIC SECTION.

DATA : x       TYPE i,
       y       TYPE i,
       altura  TYPE i,
       largura TYPE i.

METHODS:

" Workaround para efeito Overload
CONSTRUCTOR IMPORTING
       X       TYPE i OPTIONAL
       Y       TYPE i OPTIONAL
       altura  TYPE i OPTIONAL
       largura TYPE i OPTIONAL,

imprimeRet.

ENDCLASS.

Class RETANGULO IMPLEMENTATION.

METHOD CONSTRUCTOR.
   me->X       = X.
   me->Y       = Y.
   me->ALTURA  = ALTURA.
   me->LARGURA = LARGURA.
ENDMETHOD.

METHOD IMPRIMERET.
   WRITE: / 'X=', me->X, 'Y=', me->Y, 'Altura=', me->ALTURA, 'Largura=', me->LARGURA.
ENDMETHOD.

ENDCLASS.

* Classe Métodos
CLASS METODOS DEFINITION INHERITING FROM RETANGULO.
PUBLIC SECTION.

METHODS:

CONSTRUCTOR,

maxRet   IMPORTING
 ret     TYPE REF TO RETANGULO
 altura  TYPE i
 largura TYPE i
         RETURNING VALUE(resultado) TYPE abap_bool,

posicao  IMPORTING
     ret TYPE REF TO RETANGULO
     x   TYPE i
     y   TYPE i,

modRet  IMPORTING
     r1 TYPE REF TO RETANGULO
     r2 TYPE REF TO RETANGULO
     r3 TYPE REF TO RETANGULO.

ENDCLASS.

CLASS METODOS IMPLEMENTATION.

METHOD CONSTRUCTOR.
     CALL METHOD SUPER->CONSTRUCTOR.
ENDMETHOD.

* Método Pure Function
METHOD MAXRET.
  IF  me->altura LT altura AND me->largura LT largura.
    RESULTADO = abap_true.
  ELSE.
    RESULTADO = abap_false.
  ENDIF.
ENDMETHOD.

* Método Modifier
METHOD POSICAO.
   RET->X = RET->X + X.
   RET->Y = RET->Y + Y.
ENDMETHOD.

* Método Fill-in
METHOD MODRET.
   R1->X = R2->X + R3->X.
   R1->Y = R2->Y + R3->Y.
   R1->ALTURA = R2->ALTURA + R3->ALTURA.
   R1->LARGURA =  R2->LARGURA +  R3->LARGURA.
ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

* Cria Instâncias e Objetos

DATA RET1 TYPE REF TO RETANGULO.
DATA RET2 TYPE REF TO RETANGULO.
DATA RET3 TYPE REF TO RETANGULO.
DATA MET1 TYPE REF TO METODOS.
DATA REST TYPE ABAP_BOOL.

* Objetos instanciados contrutores

CREATE OBJECT RET1 EXPORTING X = 50 Y = 50 ALTURA = 200 LARGURA = 300.
CREATE OBJECT RET2 EXPORTING X = 15 Y = 15 ALTURA = 120 LARGURA = 150.

* Objeto instanciado Overload

CREATE OBJECT RET3.

* Objeto de Metodos

CREATE OBJECT MET1.

* Manipula Método Pure Function

RET1->IMPRIMERET( ).
MET1->MAXRET( exporting RET = RET1 ALTURA = 500 LARGURA = 600 RECEIVING RESULTADO = REST  ).

IF REST = abap_true.
   WRITE : / 'Retangulo está dentro do limite maximo: TRUE'.
ELSE.
   WRITE : / 'Retangulo está dentro do limite maximo: FALSE'.
ENDIF.

* Manipula Método Modifier
WRITE : / .
WRITE : / 'Modifica posição do retangulo:'.
MET1->POSICAO( exporting RET = RET1 X   = 20 Y   = 20 ).
RET1->IMPRIMERET( ).

* Manipula Métodos Fill-in
WRITE : / .
WRITE : / 'Modifica tamanho do retangulo:'.
MET1->MODRET( exporting R1 = RET3 R2 = RET1 R3 = RET2 ).
RET3->IMPRIMERET( ).
Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s