Precisa de uma varinha de condão? Aqui estão as propriedades da classe computorizada!

Tradução automática de Deepl
A aparição de classes no ambiente de desenvolvimento 4D tornou a programação mais moderna e mais fácil de escalonar. As classes permitem a definição de propriedades, funções e também apoiam a herança.
Na sua aplicação, tem provavelmente uma classe para gerir dados científicos ou financeiros. Tomemos o exemplo dos dados financeiros. Digamos que tenha criado funções para calcular impostos. Se também gerir vários países, poderá ter utilizado a herança para gerir as diferentes regras. Então, apresenta estes resultados numa caixa de listagem, mas se o utilizador alterar um dos atributos utilizados na fórmula, terá de gerir este evento para actualizar o resultado.
Com 4D v19 R3, 4D permite-lhe simplificar este processo graças às propriedades computorizadas: Pode definir uma função get and set para a sua propriedade calculada, e quando adiciona a sua propriedade a uma caixa de listagem, tudo é tratado automaticamente por 4D. Acabou-se a lógica comercial na sua UI.

HDI Propriedades computorizadas

Definição e cálculos

Para explicar o poder deste conceito, vamos torná-lo o mais simples possível, e começar com um exemplo concreto:
Uma classe “Rectângulo” contém dois atributos, width and height, e poderia incluir funções como getSurface() e getPerimeter(), que poderiam eventualmente ser utilizadas.
Contudo, não seria melhor se os sítios surface e perimeter fossem vistos como propriedades regulares, tal como os outros? Propriedades que possam ser lidas e possivelmente modificadas? E as outras propriedades das quais dependem também poderiam ser modificadas automaticamente. Bem, agora é possível graças às propriedades computorizadas.

Magia!

Aqui estão dois exemplos simples. Em ambos os casos, todos os atributos podem ser introduzidos.

Quando se modifica o width ou height, os perimeters e surfaces são recalculados. O inverso também é verdade: altere o surface ou perimeter, e os widths e heights irão variar em conformidade.

blank

Isto também funciona dentro de caixas de listagem! Que ainda podem ser ordenadas em qualquer coluna!
blank

Onde está a magia?

Em ambos os casos, não há nenhum guião nos bastidores! Todos os cálculos são definidos de uma vez por todas dentro da classe Rectângulo! Portanto, aqui está um grande benefício: se precisar de mais formulários utilizando estes atributos, não precisará de escrever qualquer código (tal como acima).

Vamos ver como isto é feito!

Acesso às propriedades COMPUTADAS

GET

A primeira função, “obter”, permite definir como é que a propriedade é calculada. Para este efeito, deve devolver o resultado do cálculo.
Esta função é a única que é obrigatória e determina pela sua mera presença a existência da propriedade computada e a possibilidade de a utilizar.

The function gets surface é definida dentro da classe Rectângulo.

Function get surface() -> $surface: Real
$surface := This.width * this.altura

Uma vez escrita a função acima, pode agora utilizar a propriedade de superfície como uma propriedade regular!

$rect:=cs. Rectângulo.new(60; 20)
$surface :=$rect.surface // get the surface property
ALERT("The surface of this rectangle is: "+String($surface))

SET

A segunda função, “conjunto”, se existir, irá gerir a modificação de uma propriedade computorizada. A modificação da superfície permitirá recalcular o valor da largura e da altura do rectângulo.

// this function will be called when surface is modified
Function
set surface
($surface)

// manter a relação largura-altura
$ratio :=This.width/This.height

This
.height:=Square root($surface/$ratio)
This .width. :=Square root($surface*$ratio)

Uma vez escritas as funções acima referidas, pode agora modificar a propriedade surface como uma propriedade regular! Os atributos width e height serão ajustados em conformidade.

//Let's create a rectangle who's original width and height are 60x20
$rectRectângulo :=cs.Rectângulo.new(60; 20)
$surface :=$rect.surface // obter a propriedade de superfície

ALERT ("A superfície deste rectângulo é: "+String($surface)) // devolve 120
// Vamos modificar a superfície
$rect .surface:=1000
// Depois mostrar a nova largura e altura
$width :=$rect.width
$height:=$rect.height
ALERT ("O rectângulo é agora: "+String($width)+" x "+String($height)) // devolve 54,77 x 18,25

Consultas e tipos…

Colecções preenchidas com objectos de classe Rectângulo podem ser consultadas e classificadas usando propriedades computorizadas!

Consulta de amostra:

myRectangles:=myRectangles.query("perimeter < 200")

Encomendar por amostra:

myRectangles:=myRectangles.orderBy("perimeter desc")

…e JSON

Quando se utiliza um objecto com propriedades computorizadas, essas propriedades serão consideradas quando o se “stringify “.

$rect:=cs. Rectângulo.new(30; 40)
ALERT (JSON Stringify($rect;*)))

blank

Conclusão

Este simples exemplo mostra que é possível realizar operações complexas, mas a complexidade permanecerá escondida.
Também proporciona um melhor controlo sobre a publicação de dados de acordo com os contextos, direitos de utilizador, etc., uma vez que as regras podem ser definidas dentro da própria classe.
Bem-vindo a uma forma moderna de programação!
Para mais detalhes, leia esta documentação.
Roland Lannuzel
- Proprietário do produto & Especialista 4D - Depois de estudar electrónica, a Roland entrou nas TI industriais como desenvolvedor e consultor, construindo soluções para clientes com uma variedade de bases de dados e tecnologias. No final dos anos 80, apaixonou-se pela 4D e utilizou-a para escrever aplicações comerciais que incluem sistemas de contabilidade, facturação e correio electrónico. Juntando-se à empresa em 1997, as valiosas contribuições de Roland incluem a concepção de especificações, ferramentas de teste, demonstrações, bem como formação e palestras para a comunidade 4D em muitas conferências. Ele continua a moldar activamente o futuro da 4D, definindo novas características e ferramentas de desenvolvimento de bases de dados.