Patrocinado por
Patrocinado por Inetum

Implementar métodos privados em BADIs

images/thumbnail.jpg - Thumbnail

Há uns tempos tive uma ideia meio estrambólica meio fantástica que hoje decidi partilhar aqui: criar métodos privados nas classes das BADIs.

Passo a explicar.

Como parêntesis introdutório: há dois anos atrás, escrevi um artigo chamado Melhorar os melhoramentos a sugerir uma forma organizada de implementar enhancements que consiste em nunca colocar código directamente nos enhancements (sejam eles user-exits , mods , BADIs ou enhancements ) mas antes encapsular cada coisa distinta que lá se tem de fazer dentro de uma função. Lê o artigo para entenderes as vantagens desta abordagem. Na altura ainda não usava objectos e por isso sugeri a criação de um grupo de funções com um conjunto de módulos de função. Entretanto, 2 anos depois, acho que não faz sentido nenhum usar funções a não ser quando o SAP a isso nos obriga (RFCs por exemplo). Por isso o artigo mereceria ser actualizado para usar uma classe com métodos estáticos.

Ora estava eu a implementar uma BADI seguindo essa mesma lógica de encapsular sempre a lógica que se adiciona aos enhancements e comecei por criar uma classe, à qual acrescentei um método, o qual invoquei a partir do método da BADI.

Mas depois, fiat lux , e pensei: mas a BADI já é ela própria uma classe. Porque é que hei-de eu então estar a criar uma classe nova? Pois.

Então surgiu a ideia de implementar métodos privados na própria classe que implementa a BADI e depois invocá-los a partir dos métodos oficiais da BADI. Desta forma, fica tudo arrumadinho à mesma sem ser necessário criar outra classe.

Passo a explicar o processo detalhadamente.

Imagina então que tens de implementar um método de uma BADI. Fazes assim:

  1. Na SE19 crias a implementação da BADI com base na BADI desejada. Dás-lhe um nome, etc, etc;

  2. Em vez de entrares no método que queres implementar, entras antes na classe que lá diz conter a implementação:

image

  1. (Agora estás na SE24) Cria um método privado com um nome que descreva o que pretendes fazer (eu criei 2):

image

  1. Define os parâmetros desse método copiando do método da BADI apenas os parâmetros de que vais necessitar:

image

  1. Define excepções se tal fizer sentido;

  2. Implementa a tua lógica dentro do novo método privado:

image

  1. Vai, agora sim, para o o método público da BADI que queres implementar (podes ir directamente pela SE24 ou fazê-lo a partir da SE19);

  2. Nesse método invoca o teu novo método privado (neste caso invoco logo os 2):

image

Já está. Agora é só activares a BADI (na SE19) caso ainda não esteja activa.

Vantagem: Tudo arrumadinho sem ter de recorrer a classes externas

Desvantagem: Os métodos privados não são visíveis na transacção de BADIs tradicionais SE19 (que mostra apenas o interface da BADI) o que pode levantar alguma confusão para quem não esteja familiarizado com classes. Mas já aparecem no caso dos novos enhancements.

Eu acho que a vantagem ultrapassa a desvantagem. E tu? O que achas? Vês mais vantagens ou mais desvantagens?

Parece que a SAP também gosta desta abordagem porque entretanto descobri uma BADI standard (BNK_BADI_ORIG_PAYMT_CHG) que a usa na implementação “fallback” (CL_BNK_BADI_ORIG_PAYMT_CHG). Temos, portanto, a benção da SAP.

O Abapinho saúda-vos.