Páginas

segunda-feira, 15 de agosto de 2011

Ordenando Um Array de Objetos

Bom Dia a todos,

Nesse primeiro post vou escrever sobre um problema que tivemos logo que começamos a programar orientado a objetos na empresa na qual trabalho, que foi ordenar uma array de obejtos, pois antes nós realizávamos essa ordenação direto na base de dados dando apenas um order by.

Problema: Possuo um array de objetos Eventos no qual é composto por um Objeto Local que esta agregado ao um Objeto Período, eu preciso que seja ordenado o array de Eventos pela data inicial do período, abaixo esta o diagrama de classes.



Solução: A ideia vai ser tentar criar algo que possamos utilizar em todos os problemas parecidos que possam surgir a partir de agora. A solução proposta foi criarmos uma classe OrdenacaoColecao na qual se passássemos o array, ela nos retornaria o array ordenado, só que tínhamos um problema, como saberíamos qual atributo testar? Para resolver esse problema criamos uma Interface (IOrdencao) na qual possui o método retonarAtributoComparavel(), e todo o objeto que estivesse dentro do array deveria implementar essa Interface. Abaixo esta o diagrama da solução proposta e a seguir a explicação das classes e dos métodos.


Classe OrdenacaoColecao:
  • Atributo:
  1. $arrayOrdenavel: onde vamos setar nosso array para ser ordenado;
  2. $tipo : armazena o tipo de ordenação se 'DESC' ou 'ASC';
  3. $nivelComparacao: para cada atributo é determinado um nível. Exemplo: $titulo é o nivel 1, data inicial é o nível 2 e assim sucessivamente até suprir as necessidades de quem está implementando;
  • Métodos:
  1. comparar: método no qual o algorítimo de comparação entre os objetos é desenvolvido, passando por parâmetros os dois objetos a serem comparados (o método é privado);
  2. usort : método responsável por fazer a ordenação, utilizando uma função nativa do php;
Interface IOrdencao
  • Método:
  1. retonarAtributoComparavel: retorna o atributo da classe na qual desejamos realizar ordenamento, ele deve ser tradado antes do envio, o método possui um parâmetro $nivel no qual poderemos criar vários níveis de ordenação.
ClasseConcretas: são as classes que irão implementar a nossa interface;

Clique aqui para baixar o exemplo de ordenação

Com o exemplo colocado acima conseguimos ver perfeitamente a implementação da solução proposta para o nosso problema, estou a disposição para tirar qualquer dúvida a respeito da solução proposta.
Se alguém tiver alguma ideia de problema relacionado a orientação a objetos é só enviar que nos próximos posts estarei respondendo.

Até a próxima.





Um comentário:

  1. Mas ahhh Mestre Jorge Oleques!
    Parabéns pela iniciativa do blog, tenho certeza que vai fazer muito sucesso.

    ResponderExcluir