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.