Olá Abapers,
Neste post, gostaria de compartilhar meus pensamentos e sugestões sobre o princípio mais violado do SOLID, a Responsabilidade Única.
Antes de começarmos com o SOLID, preciso mencionar o MVC. Porque eles andam de mãos dadas. Você pode ler sobre
aplicando o MVC neste post
.
Antes do Abap, tive a chance de trabalhar com diferentes linguagens de programação como Java e C#. E nessas plataformas, o desenvolvimento de software já evoluiu para criar software de alta qualidade. Mas infelizmente o mesmo não pode ser dito para o desenvolvimento Abap. E a maioria dos Abapers nem mesmo presta atenção ao SOLID ou ao padrão MVC e não entende POO. E como resultado, acabamos tendo um código de baixa qualidade.
Aqui estão alguns erros e minhas sugestões para criar uma arquitetura melhor.
Em Classes Locais
Use classes locais apenas para lógica de camada de visualização, não para lógica de negócios. Elas devem ser responsáveis apenas pela visualização relacionada e lógica de comando do relatório. Crie uma classe separada para recuperar, processar dados em outra classe. Isso estará em conformidade com o MVC, Separação de preocupações, Responsabilidade única do SOLID.
Por exemplo, quando os dados de um relatório são solicitados em um RFC, você pode chamar o objeto da mesma classe e simplesmente obter os dados da mesma fonte. Dessa forma, você utiliza o mesmo código, em vez de escrever outra cópia do mesmo código e criar a possibilidade de inconsistência de dados/processos. O relatório pertence à camada de visualização e a lógica pertence à camada do modelo.
Métodos longos (Pesadelos)
Se um método contém muitas linhas, digamos mais de 20 linhas, é porque muito provavelmente você está fazendo mais de uma coisa no mesmo método.
Em vez disso, tente pensar como se estivesse construindo algo com Legos, que você pode alterar partes sem precisar reviver, retestar todo o código.
A maioria dos iniciantes em POO cria uma classe e preenche todas as linhas no mesmo método. Desculpe amigos, mas, isso dificilmente é POO. Isso é apenas mais uma maneira de escrever um módulo de função com muitas linhas de código.
Isso torna difícil de testar, difícil de manter. Em vez disso, dê nomes significativos aos métodos, escreva seu código em pedaços. Seus métodos principais devem chamar outros métodos e outros métodos devem encapsular suas complexidades neles. Preste atenção aos escopos de visibilidade e nesse ponto, por favor, pense na Responsabilidade única do SOLID e na codificação como Legos.
Quando você tem blocos de código pequenos com responsabilidade única, você pode mantê-los muito mais rápido e melhor. Será mais fácil testá-los. Apenas pense na última vez em que você passou por um código longo para entender o uso de uma variável. E então imagine se fosse um método pequeno com poucas linhas e como seria diferente entender a lógica.
Em Aprimoramentos e Implementações de BADI
A maioria dos desenvolvedores escreve todo o código diretamente sob user-exits, aprimoramentos e métodos Badi. Aqui você precisa prestar atenção à responsabilidade única e ao MVC.
Se isso for um badi de uso múltiplo, você pode criar outra implementação e escrever seu código nessa nova classe. Isso é bom desde que você possa fornecer reutilização de código. Pense em DRY. Porque essa classe é apenas para seus requisitos de negócios e outra pessoa pode criar outra classe se precisar de outro requisito.
Mas, se isso for um aprimoramento ou badi de uso único, por favor, pense neles como controladores do MVC, onde você pode passar dados SAP para suas próprias classes, processar a lógica necessária e recuperar resultados. Dessa forma, em vez de ter muitos tipos diferentes de lógica, muitas linhas de código, no mesmo método ou formulário, você terá chamadas para métodos que encapsulam a lógica e o código relacionado a mensagens se precisar mostrar uma mensagem.
Exemplo de implementação de User-Exit. Aqui o user exit é usado como controlador do MVC e toda a lógica de negócios é processada na instância da classe.
FORM USEREXIT_SAVE_DOCUMENT_PREPARE.
ENHANCEMENT 1 ZSD_TAS_MV45AFZZ.
DATA lt_vbap TYPE zsd_tas_cl_vaxx_exit_enhcn=>ty_t_xvbap.
MOVE-CORRESPONDING xvbap[] TO lt_vbap[].
DATA(tas_obj