Você Sabe o Que é ScreenBreaker?

29 August, 2010 (12:30) | ABAP, Opinião, ScreenBreaker | By: furlan

Tudo nasceu de uma necessidade, na verdade, de uma norma imposta na empresa onde trabalhamos. Todos os programas devem ser construídos usando Orientação a Objetos. Na busca de não fazer programas que usam CREATE OBJECT ou CALL METHOD apenas, nossa intenção foi imaginar rotinas, programas ou frameworks que usamos em nosso dia-a-dia, re-projetados usando as técnicas de Orientação a Objetos de maneira eficiente e eficaz.

Confesso que busquei idéias mirabolantes de frameworks que “rejeriam o mundo”, mas o editor do ABAP101, Fábio Pagoti, não. O resultado disso foi o projeto ScreenBreaker, que aliás não foi batizado por nenhum de nós!

Há um tempo atrás ele publicou esse post no SDN e que fora devidamente traduzido nesso post LOOP AT SCREEN nunca mais! O post no SDN teve um relativo sucesso, com muitos comentários e contribuições, incluindo uma pessoa que até criou um projeto open source no Google Codes, chamado…ScreenBreaker!

Sim! A idéia do “LOOP AT SCREEN nunca mais” virou um projeto open source no real sentido da palavra. Não foi criado pelo autor da idéia, mas por outra pessoa da comunidade que gostou da idéia e teve a iniciativa de criar o projeto. Ninguém mandou o Karol Seman criar o projeto no Google Codes, nem a SAP achou legal e criou um projeto, nem foi o próprio autor num ataque egocentrico quem criou. Mas foi uma pessoa que realmente gostou da idéia, teve outras idéias de como melhorá-la e decidiu contribuir de volta ao Fábio e principalmente com toda a comunidade.

Vemos aqui dois bons exemplos de profissionais que na minha opinião estão acima da média. Primeiro o Fábio que teve a idéia e a coragem de se expor publicando-a e sujeitando-se a criticas e sugestões, e depois a Karol que pensou em melhorias e decidou não guardá-la para si, mas contribui de volta para a comunidade.

Fica o exemplo para todos e principalmente para mim, que há anos tenho muitas idéias, mas nunca tive coragem de escrever um bendito post no SDN.

Classe para tratamento de tela de seleção. LOOP AT SCREEN nunca mais.

28 July, 2010 (16:51) | ABAP, ABAP OBjects, Receita ABAP | By: Fábio Pagoti

Olá pessoal!

Antes de mais nada, você já gastou um tempo considerável (e por vezes nada legal) desenvolvendo a lógica para a tela de seleção de um simples report? Se sim, este post lhe ajudará a tratar telas de seleção mais facilmente através de uma classe global a ser criada.

Tratar telas de seleção usando o comando “LOOP AT SCREEN” tende a ser muito chato e consumir algum tempo quando se desenvolve e se faz a manutenção de sua lógica interna. Assim, eu desenvolvi uma classe bem simples que me ajudou muito em alguns reports que ando fazendo na Nestlé. Ela ajuda no tratamento de simples eventos como mudar as propriedades (por exemplo: input, visibilidadede) de parameters e select-options.

Irei explicar como a classe funciona a partir de um simples exemplo. Imagine que você deve criar um report com 2 radio buttons e alguns outros parameters e select-options. Quando algum radio button é selecionado, os campos que correspondem a esta opção deverão estar prontos para a entrada do usuário (isto é: estar visíveis, habilitados e etc) e os campos da tela de seleção que não correspondem a esta opção deverão estar desabilitados e alterados de outras formas.

Como bom desenvolvedor, antes de quebrar o teclado codificando, você quebra a cabeça primeiro analisando características e possíveis evoluções deste programa. Você nota que há realmente muitos campos que precisam ter suas propriedades alteradas de acordo com a escolha dos radio buttons. Para dificultar a situação, as propriedades a serem alteradas dos campos são diferentes e a lógica da tela caminha a passos largos para se tornar complexa e difícil de se manter. Ainda, após uma conversa com o cliente, você também percebe que o número de opções (radio buttons) poderá aumentar no futuro.

Antes de ler este post, provavelmente você usaria o fabuloso comando “LOOP AT SCREEN”. Dentro deste laço provavelmente haveria comandos CASE e IF (cheios de condições) e muitos literais com nomes de campos da tela de seleção. Sem dúvida, isso não seria o código mais limpo que você viu na vida, mas com um pouco de paciência ele atenderia o requisito atual. Todavia você que lê o ABAP101 e assina seu feed sabe que pode desenvolver uma classe global (aqui chamada de “ZCL_DYNPRO_HANDLER“) para lhe ajudar nessa tarefa sujeita a erros.

Os objetos criados a partir desta classe representarão configurações (ou estados se preferir) da tela de seleção em um dado momento. Os métodos desta classe alterarão as propriedades dos parameters e select-options da tela de seleção. Para saber as propriedades destes componentes, dê uma olhada na estrutura “SCREEN” na SE11.

No começo do seu report, você configurará os objetos criados (um para cada possível configuração de tela). Após isso, bastará apenas aplicas essas configurações quando necessário. Como no nosso exemplo havia somente duas opções possíveis, dois objetos serão instanciados.

Abaixo se encontra os códigos do nosso report e da classe global. Mais uma vez feitos para o tio San entender.

Z_DYNPRO_REPORT

Z_DYNPRO_REPORT_INC

Obviamente nem tudo é perfeito.. vamos analisar essa classe.

Prós e Contras

  • Prós
  1. Fica bem fácil entender como a lógica da tela de seleção funciona pois ela está quebrada em diferentes objetos e sua configuração é centralizada
  2. Muitas configurações podem ser criadas apenas usando referências a objetos
  3. A lógica de telas de seleção fica padronizada
  4. Uma dada configuração é aplicada apenas com uma chamada de método
  5. (Essa na minha visão é a mais bacana) Como a configuração atual da tela é usada como base quando se cria um objeto (no método construtor), é possível economizar tempo e linhas de código quando se tem duas ou mais configurações que são similares. Cria a configuração que será mais semelhante as outras, aplique-a e então crie os outros objetos de configuração. Nesses últimos somente será necessário configurar a parte delta

  • Contras
  1. As configurações devem ser detalhadas usando o maior número possível de campos da tela) para facilitar a manutenção do código
  2. Como cada objeto carrega uma tabela, que representa a configuração da tela, mais recursos são necessários. A boa notícia é que provavelmente essas tabelas serão pequenas.
  3. Um laço deve ser feito a cada chamada de método de configuração. (nessa versão da nossa classe :- )
  4. Algumas propriedades são fazem sentido quando são tratadas de forma coletiva. Não faz muito sentido por exemplo habilitar um campo para entrada mais o tornar invisível.

Melhorando a classe

Você pode começar criando os métodos que alteram as propriedades dos campos que faltam. Basicamente, haveria um método para cada componente da estrutura SCREEN. Mas aqui vão outras idéias que você pode tentar (e comentar os resultados aqui é claro)

  • Como os métodos set são basicamente iguais, tente desenvolver um método dinâmico que trata todos os casos possíveis;
  • Adicione métodos “get” para retornar propriedades de campos;
  • Adicione métodos que tratam a mudança de uma mesma propriedade de um conjunto de campos.
  • Crie métodos que resolvam o ponto negativo de número 4 apontado acima. Neles mais de uma propriedade será alterada. Dê nomes diferentes de “set” para estes.
  • Tente resolver o laço a cada chamada de método. Lembre-se que a tabela de configuração possui uma chave bem simples (o nome do campo) a ser modificado.

Em um post futuro, compartilharei também uma solução para facilitar o preenchimento de listboxes (parameters). Ele é um forte candidato a ser membro desta classe global.

Conclusão

Lógica de tela de seleção não deveria consumir muito tempo de desenvolvimento. Usando uma classe bem simples muito esforço de desenvolvimento e manutenção pode ser poupado.

Abstraindo Constantes e Tipos

15 July, 2010 (16:42) | ABAP OBjects, Tecnica de Programação | By: Fábio Pagoti

No universo de Orientação a Objetos, costuma-se abtrair objetos do mundo real em classes (como exemplos: Pessoa, Jogador, Cliente, Fornecedor, Pedido de Compra, Casa, Tabuleiro, Peça, etc) . Estas são representadas em O.O. pelas características (atributos) de sua abstração interessantes para a aplicação e pelas ações (métodos) passíveis de serem realizadas na mesma (exemplos referentes as classes citadas: Andar, Pular, PagarConta, EntregarProduto, FinalizarPedido, AlterarTelhado, VirarTabuleiro, IrParaCasa ).

Quão bem cada classe irá representar objetos do mundo real depende da granularidade desejada no processo de modelagem. Quanto maior a granularidade, mais detalhes a sua classe irá exprimir sobre o objeto real. Esta decisão impacta fortemente uma série de fatores relacionados a qualidade de software:

  • Efetividade da aplicação (o programa pode ficar muito sujo caso o nível de detalhamento seja inferior ao exigido pela aplicação.);
  • Manutenibilidade do Código (detalhes excessivos e desnecessários surgem com uma granularidade muito alta);
  • Flexibilidade da Aplicação (novas requisitos podem requerer um nível maior de detalhamento, a granularidade utilizada suportaria facilmente que tipo de mudanças no seu código?);
  • Custo (quanto mais “reais” forem as classes, mais código, mais tempo, mais $$$ gasto… porém quanto maior granularidade, maiores as chances de reusabilidade do código e assim, menos código, menos tempo, menos $$$ gasto).

Percebe-se que esta não é uma decisão fácil e este é na minha visão um dos motivos da abominação do modelo em cascata para o processo de desenvolvimento de software.

Imagine agora que muitas aplicações requeram uma abstração de objetos não tão (ou nada) reais. Quais atributos e métodos você imagina que uma classe “GerenciadorDeOrdens” ou “AutomatizadosDePedidos” deve possuir? Padrões de Projeto geralmente trabalham com classes que não representam coisas tão palpáveis.

Por falar em padrões, um dos mais antigos e difundidos consiste no uso de constantes ao invés de literais (o famoso “hard code”) no código. Inegável que esta simples prática  melhora a leitura e manuteção de um programa.

Indo nessa linha, como abstrair constantes em O.O.? Deixá-las privadas nas classes que as utilizarão? E se a granularidade mudar? E se mais de uma classe necessitar o uso da mesma constante?

Eureca!!! Melhor deixar as constantes isoladas publicamente em uma classe (ou até uma interface)! Que tal acessá-la estaticamente? As classes que necessitarem constantes bastam acessar esse ponto único de acesso. Essa dica vale também para abtrair declaração de tipos. Vejam só um simples exemplo:


Z_TYPES_CONSTANTS_IF.TXT

Este report  possui uma calculadora que realiza as operações básicas sobre dois números. Caso não seja fornecida a operação a ser realizada, todas as possíveis operações são executadas. Em todos os métodos de operações matemáticas, os números e o operador utilizados são guardados em atributos da classe 'lcl_calculator' para que se guarde a última ação executada. No final, os resultados impressos na forma de comandos 'write'.  Os comentários estão propositalmente na língua do tio San.

Notem que no exemplo foram utilizadas interfaces para a abstração de tipos e constantes ao invés de classes. Na sua opinião, quais os prós e contras dessas duas abordagens? Quais as suas semelhanças?

Essa discussão começou em uma thread criada por mim na SDN (clique aqui para acessá-la). A discussão se tornou  super interessante e lá é possível saber as opiniões de muita gente boa sobre este assunto.

Espero que esta dica lhes seja útil para seus trabalhos e estudos.

Pensamentos sobre Torrents, Diaspora e SOA

18 May, 2010 (02:34) | ABAP, Conceitos, Mercado, Processo de Negócio | By: furlan

Hoje conheci um projeto muito interessante chamado Diaspora. Além de ser uma promessa de concorrente do Facebook e outras grandes redes sociais, o que mais me chamou a atenção foi o fato de que ele pode revolucionar o modo como são feitas as redes sociais.

Qualquer rede social hoje é centralizada em um servidor. Facebook, Hi5, Orkut, Linkedin etc. são todos centralizados em um único servidor. Isso dá aos seus administradores uma grande responsabilidade em armazenar essa quantidade tão grande de dados (de acordo com as últimas notícias, Facebook já tem mais de 500 milhões de usuários).

Read more »

Emprego para área de TI está sobrando?

24 March, 2010 (21:53) | Mercado, Offtopic, Opinião | By: furlan

Se você está procurando emprego, saiba que, de acordo com algumas pesquisas, está sobrando vagas em TI. Será mesmo? Qualquer um tem um lugar ao sol?

Read more »

Agilidade, Qualidade e Futuro

17 March, 2010 (10:01) | Mercado, Offtopic | By: furlan

Eu tenho estudado sobre outros temas além do ABAP e SAP, e  dentre eles temas relacionados a métodos ágeis, qualidade e organização de equipes etc.

Trago para vocês uma apresentação do Fábio Akita, que também tem estudado muito a fundo o tema.

Read more »

Novo livro da 37 Signals, Rework

12 March, 2010 (09:12) | Livro | By: furlan

Na semana passada foi lançado o livro Rework, dos autores Jason Fried e David Heinemeier Hansson (DHH), fundadores da 37-Signals, uma empresa de design de San Francisco. O DHHé o criado do framework Ruby on Rails.

Read more »

ALV com Evento – Usando a classe CL_SALV_TABLE

18 February, 2010 (08:28) | ALV, Receita ABAP | By: furlan

Problema

Criar uma cópia do relatório ZSALV_ALV_FIELDCAT implementado nesse post, para que seja monstrado uma mensagem quando o usuário der um duplo clique. Nessa mensagem, deve ser apresentado “Você deu duplo clique na coluna & e linha &.”, onde & deverá ser substituído pelo nome da coluna e linha onde ocorreu o duplo clique.

Read more »

ALV com Field Catalog – Usando a classe CL_SALV_TABLE

16 February, 2010 (07:00) | ALV, Receita ABAP | By: furlan

Problema

Implementar um relatório ALV, para mostrar todos os dados e todos os campos da tabela SFLIGHT. Também é requerido um novo campo chamado Taxa de Ocupação, onde é mostrado a relação entre capacidade máxima de  passageiros e ocupação atual do vôo.

Read more »

ALV Simples – Usando a classe CL_SALV_TABLE

12 February, 2010 (08:13) | ABAP, ABAP OBjects, ALV, Receita ABAP | By: furlan

Problema

Implementar um relatório ALV, para mostrar todos os dados e todos os campos da tabela SFLIGHT.

Read more »