Implementar métodos privados em BADIs

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:
- Na SE19 crias a implementação da BADI com base na BADI desejada. Dás-lhe um nome, etc, etc;
- Em vez de entrares no método que queres implementar, entras antes na classe que lá diz conter a implementação:
- (Agora estás na SE24) Cria um método privado com um nome que descreva o que pretendes fazer (eu criei 2):
- Define os parâmetros desse método copiando do método da BADI apenas os parâmetros de que vais necessitar:
- Define excepções se tal fizer sentido;
- Implementa a tua lógica dentro do novo método privado:
- 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);
- Nesse método invoca o teu novo método privado (neste caso invoco logo os 2):
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.
21 de Março de 2012 às 15:31
Grande Nuno!
E sempre bom ler os teus posts, ainda por cima com um português limpinho.
Para mim, tudo o que ofereça código arrumado será sempre um “bono malum superate”.
:o)
E por falar em imagens…. de quem e a imagem deste post ?
Gostei.
Abraço
22 de Março de 2012 às 9:51
Olá Ricardo (desde o aeroporto!), que bom que gostaste. Quanto à imagem, experimenta esta pesquisa: http://tinyurl.com/7foozjv ;)
Abraço
30 de Maio de 2012 às 15:45
Boas Nuno,
A ideia é boa mas penso que só faz total sentido caso a badi não permite multiplas implementações pois caso assim seja, porque não ter uma classe diferente para cada uma das nossas necessidades. Esse é o verdadeiro encapsulamento… :)
1 de Junho de 2012 às 11:47
Olá João, mas quando há multiplas implementações há uma classe por cada implementação, por isso não há problema, fica tudo bem encapsulado. Ou entendi mal?
22 de Março de 2014 às 16:08
Oi João!
Vou ainda acrescentar… para esses casos de que falas, eu até ia mais longe e criava mesmo uma BAdI custom *dentro da BAdI standard* a permitir múltiplas implementações.
De facto, é o que estou a tentar vender por onde ando, e acho que consegui :)
Abraço!
Bruno