A linguagem 4D suporta o conceito de classes e, portanto, o conceito de constructor.
Por outro lado, a camada de abstração ORDA, através de Classes de Modelo de Dados, fornece um grande benefício comercial. Permite escrever código orientado para o negócio e “publicá-lo” como se fosse uma API. O armazenamento de dados, as classes de dados, as selecções de entidades e as entidades estão disponíveis como objectos de classe que podem conter funções, bem como atributos calculados e aliases.
Isto leva a que as suas aplicações sigam facilmente os princípios MVC com código poderoso e optimizado.
Para trabalhar com uma abordagem completa orientada a objetos, a partir de 4D 20 R10, classes de entidades podem agora ter um constructor(). Precisa configurar valores iniciais quando uma nova entidade é instanciada? Agora é possível! Continue lendo para saber mais …
Com classes de modelo de dados ORDA, os dados são manipulados através de entidades que são instâncias das classes Entity que tem em sua Estrutura.
O 4D 20 R10 traz a possibilidade de implementar um constructor() para objetos entidades.
O construtor de entidade
Para trabalhar com uma abordagem completa orientada a objetos, a partir de 4D 20 R10, classes de entidades podem agora ter um constructor() que é executado quando elas são instanciadas
Essa é a maneira perfeita de inicializar alguns valores padrão, como um selo ou um atributo createdBy, por exemplo.
Antes, para fazer isso, você provavelmente implementava uma função createNew() na classe de dados apropriada. Dada uma classe de dados Products, seus desenvolvedores devem estar cientes de que há uma função createNew() nesta classe e que eles devem usá-la em vez de instanciar naturalmente uma entidade Products usando ds.Products.new().
Para criar um novo produto, eles fazem:
Form.product:=ds.Products.createNew()
como implementar o construtor
Basta implementar a função constructor() na classe de entidade.
Aqui está a classe ProductsEntity:
Class extends Entity
Class constructor()
This.stamp:=Timestamp()
This.createdBy:=Current user()
E o código de chamada é tão lógico. Por exemplo, ao clicar no botão Criar produto em um formulário, basta fazer:
Form.product:=ds.Products.new()
e a entidade Form.product vem com os atributos stamp e createdBy devidamente preenchidos!

O constructor() não é acionado apenas pela chamada da função new() função. Seja qual for o meio com que a entidade é instanciada, o construtor é acionado.
Também pode ser:
– o Explorador de dados (ao criar uma nova entidade)
– a função fromCollection()
– uma chamada à API REST que cria uma nova entidade no servidor(por exemplo, $method=update)
– código executado no servidor REST e que processa uma entidade instanciada num cliente, como um front end de uma aplicação Qodly ou um cliente 4D que utiliza um datastore remoto.
outros exemplos
Dado este pedido REST:
127.0.0.1/rest/Products?method=update
executar usando um POST com o corpo:
[
{"name": "Red pack", "price": 50}
]
Aqui está o resultado no Explorador de dados. Observe os valores para os atributos stamp e createdBy.

Ao importar produtos com a função fromCollection():
var $products : cs.ProductsSelection
var $data:=New collection({name: "Red pack"; price: 50}; {name: "Green pack"; price: 10})
$products:=ds.Products.fromCollection($data)
Aqui está o resultado. Observe os valores dos atributos stamp e createdBy.

Este blogpost explica como implementar a função constructor().
Após a leitura, se precisar de saber mais sobre como constructor() se comporta em C/S ou utilizando 4D Qodly pro ou quando trabalha com um datastore remoto, leia este blogpost.
Verifique a documentação para aprender mais e brincar com o HDI!
