Classes partilhadas

Quer uma forma simplificada de utilizar objetos partilhados, seguindo a sintaxe clássica dos objetos e chamando automaticamente “use/end use” quando for necessário?

Apertem os cintos; aí vêm as classes partilhadas!

Criação e gestão de classes partilhadas

Com 4D 20 R5, adicionamos um novo conceito: Classes compartilhadas.

Classes compartilhadas só podem ser usadas para criar objetos compartilhados e, como tal, simplificam seu uso. Para criar uma classe partilhada, só precisa adicionar a palavra-chave shared ao seu construtor:

//classe SharedClass

shared Class constructor()

As classes partilhadas não podem ser utilizadas para criar objetos padrão: sempre que chamar new() para criar um novo objeto desta classe, este será um objeto partilhado.

Extensão às funções de classe

A palavra-chave shared também pode ser utilizada para funções de classe, indicando que esta função modifica o objeto. Não há necessidade de chamar use e end use dentro da função, uma vez que são automaticamente chamados quando a função é chamada e encerrada. Isto é obviamente válido para o construtor singleton.

shared Function myFunction()

This.attribute:="whatever"

É claro que deve ter cuidado ao utilizar a palavra-chave shared em funções que não precisam dela para evitar bloquear outros processos que tentem utilizar o objeto.

A utilização correta de classes e funções partilhadas deverá permitir-lhe manipular os seus objetos partilhados como se fossem objetos normais, simplificando o seu código.

Considerações sobre herança

Um último ponto que precisa de ter cuidado é que as classes não partilhadas podem herdar de classes partilhadas, mas as classes partilhadas não podem herdar de classes não partilhadas. Por isso, planeje o seu modelo de objetos em conformidade.

Exemplo

Digamos que tenha um cálculo longo para efetuar e prefira utilizar um trabalhador para evitar bloquear os seus processos importantes. Mas, obviamente, precisa recuperar o resultado do cálculo a dada altura. Vamos usar esta classe CalculationResult:

// classe CalculationResult

shared Class constructor()
	
  This.isFinished:=False
	
Function makeCalculation()

  ...
  This.finished:=True
	
shared Function set finished($finished : Boolean)
	
  This.isFinished:=$finished
	
shared Function get finished()->$finished : Boolean
	
  $finished:=This.isFinished

Para a utilizar, basta fazer:

$calculation:=cs.CalculationResult.new()
CALL WORKER("AnyWorker"; Formula($calculation.makeCalculation()))

While (Not($calculation.isFinished))
  //Código que será executado enquanto o cálculo está em processo
End while 

Espero que as classes partilhadas o ajudem a utilizar objetos partilhados na sua aplicação. Se tiver alguma dúvida, não hesite em trazê-la para o fórum 4D.

Nicolas Brachfogel
• Proprietário do produto e Desenvolvedor Senior -Nicolas Brachfogel entrou a 4D em 2017 como Senior Developer (4D Server e Networking). Como Product Owner para gerenciar o lançamento de Apple Silicon, está a cargo de escrever as histórias dos usuários e depois traduzi-las em especificações funcionais, além de garantir que as implementações de funcionalidade cumpram com as necessidades do cliente. Diplomado pelo Instituto Superior de Informática Aplicada (INSIA), Nicolas começou sua carreira como desenvolvedor de software em 2001. Depois de vários anos codificando em Java e C++, passou a especializar-se no desenvolvimento cliente-servidor para empresas de videogames. Como desenvolvedor/arquiteto de servidores, trabalhou com sucesso nas arquiteturas de servidores de muitos jogos (Dofus Arena, Drakerz, Trivial Pursuit Go!)