ORDA – Começar com o evento tocado

Tradução automática de Deepl

ORDA é uma caraterística principal a longo prazo que abre um mundo de novas possibilidades em 4D.

Continuamos a melhorar ORDA para fornecer código poderoso. Então, suas aplicações se tornam fáceis de desenvolver e manter. E especialmente são optimizadas com grande performance para seus usuários finais.

É por isso que temos o prazer de introduzir uma nova caraterística em 4D 20 R10 em relação a eventos em dados na memória.

Em uma jornada típica do usuário, os dados necessários para o usuário são carregados na memória. Depois são submetidos a mudanças de acordo com as ações do usuário e finalmente são salvos quando o usuário clica em um botão Salvar.

Que tal acionar automaticamente a lógica comercial quando alguns dados são alterados na memória? Agora é possível formatar ou preparar os dados o mais cedo possível antes da ação de guardar , para que os dados fiquem num estado pronto a guardar.

Isto é feito graças ao evento ORDA tocado nos dados e as vantagens são consideráveis.

Quer saber mais? Continue a ler!

HDI_ORDA_Events_touched

O ORDA já cobre muitos aspectos detalhados neste blogpost. A camada de abstração ORDA torna-se mais poderosa do que nunca! Ela agora é capaz de reagir a qualquer mudança nos dados em memória.

Lembre-se que, com ORDA, os dados são manipulados através de entidades carregadas na memória por uma ação de leitura (uma consulta, por exemplo).

O 4D 20 R10 introduz o conceito de eventos. O evento de toque é o primeiro de uma série que está por vir e porque não tem equivalente no código 4D clássico, vale a pena usá-lo.

Um evento tocado permite implementar um código centralizado para acionar a lógica de negócios quando valores de atributos são mudados numa entidade carregada na memória.

acionar a lógica de negócios quando um atributo de entidade é alterado

Durante uma viagem do utilizador, pode agora reagir às alterações de dados em memória para acionar alguma lógica empresarial adequada e, eventualmente, mostrar o resultado ao utilizador final.

Ao trabalhar com uma entidade, pode concentrar-se num determinado atributo e acionar algum código quando o seu valor é alterado.

Aqui estão alguns casos de uso em que o benefício será grande:

  • colocar dados em maiúsculas ou minúsculas
  • propagar algumas actualizações a outros atributos no modelo

exemplo #1

No exemplo abaixo, uma entidade Pessoas é atualizada. O title é truncado para seus primeiros seis caracteres. O lastname + city são maiúsculos.

Anteriormente, para executar um caso de utilização deste tipo, era necessário tratar eventos como “Ao perder o foco” em cada um dos objectos do formulário e executar o código apropriado em muitos locais do código.

Agora, os eventos touched podem ser implementados para alguns atributos graças às palavras-chave touched e event palavras-chave. O código é centralizado na classe Entidade apropriada e executado assim que um valor de atributo é alterado em qualquer lugar do aplicativo.

Neste exemplo, um evento touched foi implementado para alguns atributos na classe PeopleEntity:

Class extends Entity

Function event touched title($event : Object)
	This.title:=Substring(This.title; 1; 6)
	
Function event touched lastname($event : Object)
	This.lastname:=Uppercase(This.lastname)
	
Function event touched city($event : Object)
	This.city:=Uppercase(This.city)

exemplo #2

Neste outro exemplo, o evento touched é utilizado para evitar o tratamento de um atributo calculado, o que poderia conduzir a um mau desempenho. Dada uma classe de dados Booking numa aplicação de aluguer de automóveis, é necessário um atributo para saber se as datas de partida e de chegada são as mesmas.

A sua implementação deve ser:

exposed function get sameDay(): Boolean
return (This.departureDate = This. arrivalDate)

Mas a consulta deste atributo não pode utilizar índices, pelo que não é muito optimizada.

Por isso, pode ser criado um atributo sameDay na classe de dados e pode ser implementado um evento touched, tal como acontece com os atributos departureDate e arrivalDate. Para que este atributo sameDay esteja sempre atualizado.

Function event touched departureDate($event : Object)
	This.sameDay:=(This.departureDate=This.arrivalDate)

Function event touched arrivalDate($event : Object)
	This.sameDay:=(This.departureDate=This.arrivalDate)

acionar a lógica comercial quando um atributo é alterado

Precisa de reagir a qualquer alteração de dados na memória durante uma viagem do utilizador? Seja qual for o objetivo: depuração ou atualização de dados em tempo real, agora é possível.

Pode acionar um evento de toque ao nível da entidade. Quando qualquer valor de atributo de entidade é alterado, o evento é acionado e fornece informações úteis.

Como implementar isto

Na classe Entidade, adicione a função touched que recebe o evento como parâmetro do objeto.

Por exemplo, aqui está a classe PeopleEntity.

Class extends Entity

Function event touched($event : Object)

caso de utilização #1

Na sua aplicação, detectou que uma entidade People foi actualizada, mas não sabe onde. Implemente o evento tocado e coloque um ponto de interrupção no interior para verificar a cadeia de chamadas.

Aqui está um simples updatePeople método de projeto:

$people:=ds.People.all().first()

updateCivilInfo($people)

updateAddress($people)

E a janela de depuração mostrando a cadeia de chamadas com o método que aciona o evento touched (updateCivilInfo).

Observe que o objeto Event contém o nome do atributo.

blank

caso de utilização #2

É possível colocar um valor de atributo em maiúsculas se o seu tipo for Text, qualquer que seja o atributo.

Para isso, implemente este código:

Class extends Entity

Function event touched($event : Object)
	
	If (Value type(This[$event.attributeName])=Is text)
		This[$event.attributeName]:=Uppercase(This[$event.attributeName])
	End if

E verifique se funciona:

blank

Como pode compreender, é provável que o evento touched seja acionado com muita frequência. É por isso que o código implementado deve ser de execução rápida e leve para manter um bom desempenho. O último exemplo acima é relevante se a classe de dados contiver apenas alguns atributos.

Se precisa de saber mais sobre como este evento se comporta em C/S ou usando 4D Qodly pro ou quando trabalha com um datastore remoto, leia este blogpost.

Verifique a documentação e brinque com HDI para aprender mais.

Avatar
• Proprietário do produto - Marie-Sophie Landrieu -Yvert entrou ao time 4D Product como Proprietária do Produto em 2017. Como tal, está a cargo de escrever as histórias dos usuários e depois traduzi-las em especificações funcionais. Seu papel também é garantir que a implementação da funcionalidade entregue cumpra com as necessidades do cliente. Marie-sophie se formou na Escola de Engenharia de ESIGELEC e começou sua carreira como engenheira da IBM em 1995. Participou em vários projetos (de manutenção e criação) e trabalhou como desenvolvedora de Cobol. Depois trabalhou como designer de UML e desenvolvedora de Java. Suas principais funções foram analisar e redigir requisitos funcionais, coordenar os times de negócio e de desenvolvimento.