Base de Conhecimento

Delphi interfaces and collections

Introdução – Interfaces e coleções Delphi

Na GDK estamos trabalhando continuamente com ferramentas e técnicas de ponta. Isto significa que também precisamos nos manter atualizados! Fazemos isso utilizando sessões de conhecimento nas quais discutimos vários assuntos. Nossa última sessão foi sobre interfaces e coleções Delphi.

 

Por que você deve usar interfaces em Delphi?

Antes de mais nada: Uma interface fornece um contrato para conversar quando trabalhamos com objetos que o implementam. Como resultado, não precisamos nos preocupar com os detalhes de implementação desse objeto (da perspectiva do código de chamada). É um dos melhores exemplos dos princípios da Solid.

Segundo: em Delphi, nós os usamos para evitar vazamentos de memória, usando seu mecanismo de contagem de referência. Se uma interface ficar sem escopo e for a última referência ao objeto para o qual estava apontando, então ele será automaticamente removido.

Coleções Delphi

As coleções foram implementadas desde o início da Delphi. Poderíamos escolher entre TLists para indicações, TObjectList para objetos (que podem ser de propriedade da lista; muito útil), TStringList etc. Embora estas coleções sejam muito úteis, elas têm algumas limitações. Ao utilizá-las, você sempre precisa lançar para obter o tipo de dado correto da lista. Isto também torna o código propenso a erros, porque o compilador não reclama se um objeto é lançado para uma classe diferente da que realmente é. Você só o descobre durante o tempo de execução.

MyObject := TMyType(MyList[0]);

 

Coleções de Genéricos

Para contornar toda a questão da fundição e para tornar o código mais legível, a Coleção de Genéricos foi adicionada na Delphi 2009. Como resultado, podemos agora especificar o tipo de dado que vai na coleção que usamos. Fazemos isso especificando o tipo de dado entre colchetes angulares. Agora o compilador sabe o que vai na coleção e a chance de fundir na classe errada é agora minimizada.

É até possível utilizar interfaces como tipos de parâmetros. Isto se aplica a todas as implementações de coleta, exceto para a TObjectList. Esta classe precisa de um tipo que se estenda do TObject.

MyList := TList<TMyType>.Create;
MyList.Add(MyObject);

MyOtherObject := MyList[0];

 

Spring – Coleções e Interfaces

O melhor de dois mundos! Agora podemos usar nossas queridas interfaces junto com as coleções e obter todos os benefícios do uso de interfaces. A única coisa que ainda nos falta é o fato de que os objetos das Coleções Genéricas não implementam uma interface por si só.
A estrutura Spring4D (entre outras classes muito úteis) fornece exatamente isso: listas que são referenciadas usando interfaces. E mais: como as classes da coleção Spring4D são construídas do zero, elas fornecem muitas funções úteis que não estão disponíveis na estrutura dos Generics Collections. Confira a documentação da Spring4D para saber mais.

MyTypedObject := TMyType.Create);

MyList := TCollections.CreateList<IMyType>;
MyList.Add(MyTypedObject);

 

Juntando tudo

Ao utilizarmos Coleções Genéricas em combinação com interfaces, asseguramos automaticamente que nosso código seja menos propenso a erros. Isto porque deixamos o compilador saber o que entra nas coleções que usamos para que ele possa verificar se há alguma violação.

O que recomendamos vivamente é usar a estrutura Spring4D para todas as funcionalidades úteis que ela nos proporciona quando trabalhamos com coleções!

Written by Johnny Nap
Desenvolvedor Delphi e Mendix

Contato

Deixe-nos ajudá-lo a realizar seus sonhos.