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( ).

