VBA, organizando coleções seguindo princípios da orientação a objetos.

A linguagem de programação Java, além de completamente orientada a objetos possui algumas facilidades já prontas e implícitas que ajudam muito a vida do desenvolvedor. Neste artigo, focarei-me na habilidade de ordenar itens contidos em uma coleção; comparar como pode ser feito com Java e com VBA. Implementar a lógica da organização no VBA baseada no Java, que por sua vez está baseada em alguns princípios da orientação a objetos.

Coleções podem possuir tipos de dados variados tais como: datas, números, textos e objetos. Podemos ordenar os itens de uma coleção de maneira ascendente e descendente sendo que, para itens do tipo Objeto, poderíamos necessitar ordenar  a cada momento por um campo diferente. Se estivermos falando de um objeto que, por exemplo, representa uma Pessoa e, este, possua os campos Nome e Idade, ora podemos ordenar por nome, ora podemos ordenar por idade.

Já no VBA, uma maneira comum de se ordenar uma coleção é criarmos um procedimento (Sub)  dentro de um módulo que recebe como parâmetro tal coleção e a  ordena. Veja código abaixo:

Bubble Sort

Bubble Sort – algorítmo para ordenar uma coleção – código VBA

O problema é que para cada coleção que contenham itens de um tipo de dado (string, número, datas, objeto …)  ou cada vez que desejamos mudar a ordem (ascendente ou descendente) necessitaríamos codificar mais um método em um módulo no VBA (praticamente um método para cada coleção)  acarretando em inúmeras repetições de código e aumentando muito a complexidade e, consequentemente, a dificuldade de manutenção.

Existem três princípios da orientação a objetos que podem ser mencionados e aplicados à este código para melhorar a questão da complexidade e da repetição do código:

(1) Identifique aspectos de sua aplicação que variem e separe eles dos que permanecem sempre iguais (encapsulate what varies) ;

(2) Programe para interfaces não para implementações;

(3) DRY – Don’t Repeat Yourself – Não repita código.

Abaixo, pretendo relacionar estes princípios ao código Java e, na sequência, ao código VBA que será produzido e explanado:

Conforme já mencionado acima, cada nova ordem desejada demandaria uma nova função em um método. Aplicando o primeiro princípio (1) iremos encapsular o “comparador” dos objetos da coleção (destacado em vermelho), pois ele contém a lógica (critério) que irá variar:

Classe SortAsc implementa a interface Comparator

Código Java – classe SortAsc implementa a interface Comparator. O critério de ordenamento dos dados.

O que nos permite “acoplar” este comparador / critério (SortAsc)  ao método Collections.sort (que é implícito na linguagem Java) é que este método espera receber como parâmetro uma classe qualquer que implemente a interface Comparator. Então estamos tratando do 2º princípio. Abaixo o destaque para a classe que implementa a interface Comparator e também seu método compare. Podemos observar também, que cada uma das classes possuem suas responsabilidades bem definidas, por exemplo, a classe SortAsc só existe para implementar a lógica de ordenamento (critério de ordenamento) , o que nos faz pensar em mais um princípio: Single Responsability (cada classe deve possuir apenas uma responsabilidade).

Código Java - destaque para interface Comparator

Código Java – destaque para interface Comparator

Em se tratando do 3º princípio, podemos re-utilizar esta classe SortAsc que implementa o critério de organização para strings para organizar qualquer outra coleção de strings ascendente. Desta forma, não há a necessidade de se repetir o código que implementa a lógica de organização, apenas reutilizá-lo.

Pois bem ….

No VBA (Excel, Access, Word, Power Point, Outlook …. )  e até mesmo no VB6 (Microsoft Visual Basic 6), as coisas são um pouco diferentes. Temos apenas um objeto chamado Collection que funciona como um repositório para vários itens de vários tipos podendo ser até ao mesmo tempo. Além disto, a linguagem (VBA) não possui nenhum método de organização de seus itens e, tão pouco, uma coleção (Collection) VBA também o possui.

Como já disse no início deste texto, podemos implementar um método por coleção para organizá-la, mas, volto a dizer: ISSO É REPETITITITIT..ITI….VO  ….

Vamos, então, implementar (codificar)  esta característica de organização de coleções no VBA semelhante ao que já existe na linguagem Java:

Primeiro, declaramos uma interface (Módulo de Classe) no VBA que representará a interface Comparator preparando-se para o 2º princípio: programe para interfaces e não para implementações. Observação é que esta interface já é nativa na linguagem Java. Não houve a necessidade de programá-la, apenas implementá-la (utilizá-la) na linguagem Java.

Código VBA - módulo de classe que representará uma interface

Código VBA – módulo de classe que representará uma interface. Equivalente à interface Comparator do Java.

Vamos, então, implementar um módulo padrão que faz a organização dos itens de uma coleção (o algorítmo Bubble Sort). Novamente lembrando do 2º princípio pois podemos ver que utilizamos a interface na programação, e também do 3º princípio, pois iremos ver que re-utilizaremos este código (Collections.sort) para várias coleções. Na linguagem Java, a classe Collections possui inúmeros métodos estáticos (métodos não de instância) para lidar com coleções, dentre eles o método sort pronto para o uso:

Código VBA - Módulo Collections

Código VBA – Módulo Collections

Abaixo, demonstro uma classe (Módulo de Classe) que implementa a interface IComparator criada anteriormente que contém o critério para organizar objetos do tipo Pessoas.

Código VBA - Classe que implementa o algorítmo de comparação de pessoas por idade

Código VBA – Classe que implementa o critério de comparação de pessoas por idade.

A classe Pessoa possui apenas duas propriedades: Nome e Idade:

Código VBA de uma classe que representa uma pessoa

Código VBA de uma classe que representa uma pessoa

Colocando tudo junto:

Finalmente, vamos testar este código para ver se funciona. O módulo Testes (VBA) possui dois métodos para testar tudo que foi codificado.  Abaixo demonstro brevemente o método testeValores que: (1) instancia a classe responsável pelo critério de organização (CompareByValueAsc) e (2) utilizando-se deste critério + o algorítmo bubble sort (contido no módulo Collections) organiza-se os itens contidos na coleção. Falando nos princípios da orientação a objetos, : encapsulamos o que variou (que seriam as lógicas de organização (critérios), programamos para interface simplesmente permitindo que o método sort do módulo Collections aceite qualquer objeto que implemente a interface IComparator (ou seja, qualquer critério de ordenamento) e não repetimos os códigos que tratam tanto do critério de organização (classe CompareByValueAsc) como também o código que executa a organização (Collections.sort – algorítmo Bubble Sort). Tornamos a lógica da organização (critérios) , que é algo que pode variar, desacoplada  do código que executa esta organização (Collections.sort – algorítmo Bubble Sort) através das classes que implementam a interface IComparator.

Não posso esquecer de mencionar que também nos baseamos em outro grande princípio da orientação a objetos: SINGLE RESPONSABILITY – cada classe deve conter apenas uma única responsabilidade. Vemos isso tanto nas classes que implementam os critérios de ordenamento: CompareByIdadeAsc, CompareByIdadeDesc, CompareByNomeAsc e CompareByValueAsc, quanto no tradicional módulo Collections que utiliza-se destas classes para executar seu ordenamento. Isso é separação de responsabilidades e desacoplamento de código (características tão perseguidas na orientação a objetos para reduzir complexidade e facilitar a manutenção).

módulo que realiza o teste do que foi codificado.

Módulo que realiza o teste do que foi codificado.

Como este módulo é um pouco extenso deixo o link para download (SortCollections.rar) tanto do código VBA e também do equivalente código Java.

Veja também:

VBA orientado a objetos

Sabe para que serve o módulo de classe no VBA ?

Outros posts de VBA e VB6

Anúncios
Esta entrada foi publicada em Java, Visual Basic 6.0 e VBA com as etiquetas , , , , , , , . ligação permanente.

2 respostas a VBA, organizando coleções seguindo princípios da orientação a objetos.

  1. Adalberto Costa diz:

    A ideia é muito boa louvável, mas é importante saber que existem muitos algoritmos de eficiência comprovada, de complexidade maior ou menor, úteis para diferentes casos.

    Gostar

    • pedroabs diz:

      Caro prof. Adalberto;

      o que ocorre é que no VBA não existe o objeto nativo Collections como existe no Java, acarretando muitas vezes na repetição em várias partes do código do procedimento para ordenar uma coleção. O que eu quis demonstrar é que, independente do desempenho do referente utilizado bubble sort, podemos centralizar em um único local esta execução, e implementar classes que servirão para definir como a organização dos itens será feita (assim como funciona no Java).

      Não posso deixar de concordar que o Java, neste aspecto, já tem muito mais recursos prontos. Além do Collection.sort, temos também as classes que implementam a interface Queue ….LinkedList …. enfim … … Além disso, acho que a linguagem Java expressa muito bem a “beleza” (bom uso) da orientação a objetos seguindo os princípios de design de código.

      Finalmente acho que podemos nos esforçar para fazer um código VBA / Java / Javascript …. mais limpo e de fácil manutenção.

      Já trabalhei com muito código VBA “macarrônico”. Aquele que inicia em um canto do sistema e termina em outro canto se entrelaçando por módulos e mais módulos.

      Acredito que aplicando os princípios da orientação a objetos as manutenções futuras ficam muito mais fáceis.

      Obrigado de seu comentário !

      Gostar

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão /  Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s