Quantas vezes obteve o erro“Tipo de valor não suportado num objecto partilhado” ao tentar colocar um objecto num objecto partilhado?
O que é que fez? Escreveu um código mais longo para transformar o seu objecto inocente num objecto partilhado, talvez iterando sobre todas as suas propriedades?
Que tal transferir um objecto partilhado de um grupo partilhado para outro?
Uma coisa interessante sobre objectos: já sabe que podem ser usados como um mapa hash (um sistema chave/valor), mas e que tal obter todas as chaves ou todos os valores com uma única linha de código?
Continue a ler, porque 4D v18 R3 está fora e traz boas notícias!
COPY objectos e colecções partilhados
copiar um objecto como partilhado
O OB Copy() foi melhorado para aceitar uma nova opção que pode ter o valor: ck partilhado
No exemplo abaixo, o objecto $person é copiado como um objecto partilhado para o objecto $copy.
Em seguida, podemos colocar o objecto $copy no objecto partilhado $personsList .
C_OBJECT$copy ($person;$copy;$personsList)
C_TEXT ($text)
$text :=Document to text(Get 4D folder(Current resources folder)+"person.txt")
//$person is a standard object
$person :=JSON Parse($text)
$personsList :=New shared object()
//$copy is a shared object
$copy :=OB Copy($person;ck shared)
Use ($personsList)
//We can put $copy in $personsList because $copy is a shared object
$personsList .person:= xml-ph-003
End use
atribuir um objecto partilhado de um grupo partilhado a outro
O OB Copy() também foi melhorado para aceitar um novo parâmetro: groupWith (que deve ser um objecto partilhado ou uma colecção partilhada).
Passar o grupoCom parâmetro permite colocar o objecto copiado no mesmo grupo partilhado que o grupoWith.
No exemplo abaixo, $sharedObj e $sharedColl pertencem a dois grupos partilhados separados.
Não podemos colocar $sharedObj em $sharedColl sem receber um erro, mas podemos facilmente copiar $sharedObj para um novo objecto pertencente ao mesmo grupo partilhado que $sharedColl.
C_OBJECT($sharedObj;$objCopy)
C_COLLECTION ($sharedColl)
//$sharedObj belongs to a shared group
$sharedObj :=New shared object("último nome"; "Smith"; "endereço";New shared object("cidade"; "Nova Iorque"))
//$sharedColl belongs to another shared group Use
$sharedColl :=New shared collection(New shared object("último nome"; "Brown"))
//$objCopy is in the same shared group as $sharedColl
$objCopy:=OB Copy($sharedObj;ck shared;$sharedColl)
//So we can put $objCopy into $sharedColl without error
($sharedColl)
$sharedColl .
push($objCopy)
End use
e que dizer das colecções partilhadas?
Os exemplos acima estão relacionados com o comando OB Copy() comando.
A colecção.copy() método de membros foi melhorado exactamente da mesma forma.
manusear um objecto como um mapa hash
Há novos comandos para facilitar a manipulação de um objecto como um mapa hash. Se tiver objectos cujos nomes de propriedade contenham dados dinâmicos, estes comandos são para si!
Vamos explicar isto com um único exemplo.
Considere este $persons objecto contendo nomes próprios como nome de propriedade e idade como valor de propriedade:
C_OBJECT($persons)
$persons :=New object
$persons ["John"]:=42 // John is 42
$persons ["Andy"]:=24 // Andy is 24
$persons ["Mary"]:=30 // Mary is 30
$persons ["Paul"]:=50 // Paul is 50
$persons ["Fred"]:=51// Fred is 51
Comando das chaves OB
Este comando devolve os nomes de propriedade de um objecto como uma colecção:
ALERT("There are "+String(OB Keys($persons).length)+" pessoas")
Comando Valores OB
Este comando devolve os valores de propriedade de um objecto como uma colecção:
ALERT("A média de idade é "+String(OB Values($persons)
.average()))
Comando OB Entradas
Este comando devolve uma colecção de objectos com propriedades chave (nome da propriedade) e valor (valor da propriedade):
C_COLLECTION($agesOK)
$agesOK:=OB Entries($persons).query("valor>:1";45)
ALERT ("Há "+String($agesOK.length)+" pessoas com mais de 45 anos")
ALERT ("Os seus nomes são: "+$agesOK.extract("chave").join("-"))
Usando um objecto como mostrado acima, fornece acesso rápido e directo a dados como quando se usa um índice.
É mais rápido do que utilizar uma colecção de objectos com propriedades de primeiro nome e idade.
Note-se também que esses comandos devolvem uma colecção. Isto permite-nos utilizar todos os métodos de membros disponíveis nas colecções (como average(), query(), …).