Tipo object Continua Vivo


Existe uma estrutura no Object Pascal que foi o precursor das classes.

Você conhece o tipo object?

Unsplash image
Photo by Namroud Gorguis on Unsplash

Em um artigo anterior eu expliquei com dividir o código de um formulário em diferentes objetos, organizando os widgets em diferentes classes para dividir as responsabilidades em diferentes objetos.

Separar partes do código em classes distintas melhoram a legibilidade e manutenção do código. Mas você pode implementar o mesmo conceito sem utilizar classes.

Muitas vezes eu utilizo o tipo object como um helper para um widget ou conjunto deles.

De fato, essa técnica pode ser utilizada não só na implementação de formulários, mas em qualquer parte do código.

Não confunda com os tipos Helpers que adiciona comportamento a tipos já existentes. Existe uma sintaxe especial para declara-los, estendendo outros tipos sem utilizar herança… mas não é deles que estou falando.

Se você não gosta de nomenclatura helper, poderíamos chamá-los de ferramentas, pois eles não representam uma entidade e não implementam uma interface. São apenas ferramentas que serão utilizadas pelos verdadeiros objetos.

Não representar uma entidade é um bom motivo para utilizar o tipo object, mas há outras vantagens.

Performance, por utilizar o stack ou invés do heap na alocação de memória.

Utiliza menos memória, pois são estruturas mais simples, comparadas às classes.

Uso de herança é possível.

Determinar um escopo para um conjunto de funções utilitárias, genéricas e reutilizáveis, ao invés de declarar funções e procedimentos diretamente no escopo da unit.

Simplicidade, sempre será um ótimo motivo para tomar decisões na arquitetura. Por exemplo: não é necessário o uso de try..finally, tornando o código menos verboso.

Uma desvantagem, entretanto, é não existir um [construtor] e por isso não tem como garantir uma inicialização adequada dos campos privados. Diferentemente de uma classe, onde é obrigatório o uso de seu construtor, um tipo object pode ser utilizado diretamente como qualquer outra variável primitiva.

Além disso, a Embarcadero descontinuou o uso do tipo object desde o Delphi 2010, sugerindo o uso de “records com métodos” em seu lugar—uma decisão equivocada, na minha opinião, e não estou sozinho nesse pensamento. Além de perder a compatibilidade com o código legado, introduzir métodos em records é, no mínimo, duvidoso.

Já tínhamos o tipo object e ninguém solicitou pela sua descontinuidade, por quê não mantê-lo?

E para aqueles que não conhecem a sintaxe do seu uso, aqui está um simples exemplo:

type
  TMsg = object
    procedure Show(const aText: string);
  end;
{...}
var
  msg: TMsg;
begin
  msg.Show;
end;

Simples, direto, sem try..finally.

Felizmente o tipo object continua vivo no Free Pascal.

Até logo.

Posts Relacionados

  • Memória Segura Utilizando Instâncias de Interfaces

  • Classes Mutáveis vs Objetos Imutáveis

  • Implementando Interfaces Utilizando Diferente Assinaturas de Métodos

  • Usando Paths ao invés de Diretivas de Compilação

  • Trabalhando com Exceções em Requisições HTTP

  • Array de Objetos

  • Variáveis Locais Deveriam ter Nomes Curtos

  • Como Dividir e Organizar o Código em Formulários com Muitos Widgets

  • Pascal Deveria ser Modernizado?

  • Records - Antiga Nova Tecnologia