Definition dynamique d'objets
reboltof21-Jun-2014/19:42:51+2:00
Bonjour,

Je cale sur le problème suivant...

Je dispose d'un base de données du personnel. Chaque personne de cette DB est identifiée par un "alias" unique (dans le champ no 3).

J'ai défini un prototype d'objet. Je souhaite pour chaque personne de la DB, créer dynamiquement un objet ayant pour nom cet alias.

Je pensais à:

foreach record db [
   alias: to-word copy record/3
   :alias: make prototype []
]

Mais cela ne fonctionne pas

Des suggestions ?

Merci d'avance, les Reboleurs !
GreG23-Jun-2014/9:44:45+2:00
Hello,

J'avoue ne pas comprendre la ligne:
:alias: make prototype []

Qu'est-ce que c'est censé faire?
DideC23-Jun-2014/11:50:28+2:00
Salut,

Réponse basique (que vous pouvez tester dans la console) :
prototype: make object! [nom: prenom: none]

db: [["Durand" "Paul" "Paulo"]  ["Martin" "Philippe" "Phil"]]

foreach record db [
    alias: to-word record/3
    set :alias make prototype [nom: record/1 prenom: record/2]
]

Et donc on peut faire ensuite :
>> probe phil
make object! [
    nom: "Martin"
    prenom: "Philippe"
]
>> probe paulo
make object! [
    nom: "Durand"
    prenom: "Paul"
]

Mais tout ça créé des mots dans le contexte globale ce qui peut être embêtant (imaginons que le nom d'alias soit "if", "print" ou "copy" !!!).

De plus, m'étant déjà posé la question, quel est l’intérêt de créer des mots pour chaque enregistrement ?
Humainement, dans la console, c'est pratique, mais pour un programme qui manipule ces données, est-ce intéressant ??

Un programme va manipuler, 1 voir 2 enregistrements (pour l'éditer, le modifier, les échanger...), ou toute la base.
Du coup il est plus intéressant de se créer un block et d'accéder au éléments du block.
prototype: make object! [nom: prenom: none]
db: [["Durand" "Paul" "Paulo"]  ["Martin" "Philippe" "Phil"]]

aliases: []
foreach record db [
    append aliases reduce [to-word record/3  make prototype [nom: record/1 prenom: record/2]]
]
;probe aliases

On peut alors le manipuler:
[/code]; liste des alias :
liste-alias: extract aliases 2

; Accès à un alias (ici le 2ème) :
alias: pick liste-alias 2
probe select aliases alias
; ou encore :
probe aliases/:alias

; Modif du nom
aliases/:alias/nom: "Martinot"[/code]

Une autre question à se poser : est-il nécessaire de créer des objets pour les éléments de la DB ?
Souvent, ce n'est pas intéressant, car il n'y a que des données (et pas de code) et on peut utiliser un block de ['champ1 "valeur1" 'champ2 "valeur2 ...] qui se manipule souvent de la même façon :
aliases: []
foreach record db [
    append aliases reduce [to-word record/3  reduce ['nom record/1 'prenom record/2]]
]
probe aliases

liste-alias: extract aliases 2
alias: pick liste-alias 2
probe select aliases alias
probe aliases/:alias
aliases/:alias/nom: "Martinot"
probe aliases

Bonne réflexion
ldci26-Jun-2014/22:04:55+2:00
Bravo DideC
Limpide comme toujours
reboltof27-Jun-2014/21:28:57+2:00
@Greg: une tentative manquée de faire
<pre>set :alias make prototype []</pre>
reboltof27-Jun-2014/21:30:38+2:00
@DideC:

Wow ! Merci pour cette explication très complète.

Que de la matière à réflexion. Je m'y met !

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2