Page 2 sur 2

Re: Structure récursive & Hiérarchie

Publié : mer. 17/juil./2019 10:20
par microdevweb
Shadow,

Tu peut jouer avec une procédure dite abstraite, ce qui revient à dire que chacun de tes niveaux appellera la procédure adéquate que tu renseigne à sa création

Code : Tout sélectionner

Prototype abstract(*this)
; Tous les gadgets sont des _content
Structure _content
  abstract.abstract ; procédure qui sera appellée en fonction du type
  List *myContents._content()
EndStructure

Structure _gad_1 Extends _content
  name.s
  ;etc
EndStructure

Structure _gad_2 Extends _content
  name.s
  ;etc
EndStructure

Structure _gad_3 Extends _content
  name.s
  ;etc
EndStructure

Global NewList *myGadget._content()
; procédure abstraite pour le gadget 1
Procedure make_gadget_1(*g._gad_1)
  Debug "MAKE GADGET 1 "+*g\name
  ForEach *g\myContents()
    *g\myContents()\abstract(*g\myContents())
  Next
EndProcedure
; procédure abstraite pour le gadget 2
Procedure make_gadget_2(*g._gad_2)
  Debug "MAKE GADGET 2 "+*g\name
  ForEach *g\myContents()
    *g\myContents()\abstract(*g\myContents())
  Next
EndProcedure
; procédure abstraite pour le gadget 3
Procedure make_gadget_3(*g._gad_3)
  Debug "MAKE GADGET 3 "+*g\name
  ForEach *g\myContents()
    *g\myContents()\abstract(*g\myContents())
  Next
EndProcedure
; ajoute un gadget de type 1
Procedure newGadget_1(name.s)
  AddElement(*myGadget())
  *myGadget() = AllocateStructure(_gad_1)
  *g._gad_1 = *myGadget()
  With *g
    \name = name
    \abstract = @make_gadget_1()
  EndWith
  ProcedureReturn *myGadget() ; on retourne le gadget ajouté
EndProcedure
; ajoute un gadget de type 2
Procedure newGadget_2(name.s)
  AddElement(*myGadget())
  *myGadget() = AllocateStructure(_gad_2)
  *g._gad_2 = *myGadget()
  With *g
    \name = name
    \abstract = @make_gadget_2()
  EndWith
  ProcedureReturn *myGadget() ; on retourne le gadget ajouté
EndProcedure
; ajoute un gadget de type 3
Procedure newGadget_3(name.s)
  AddElement(*myGadget())
  *myGadget() = AllocateStructure(_gad_3)
  *g._gad_3 = *myGadget()
  With *g
    \name = name
    \abstract = @make_gadget_3()
  EndWith
  ProcedureReturn *myGadget() ; on retourne le gadget ajouté
EndProcedure
; ajoute un gadget enfant de type 1
Procedure addChidGadget_1(*parent._content,name.s)
  AddElement(*parent\myContents())
  *parent\myContents() = AllocateStructure(_gad_1)
  *g._gad_1 = *parent\myContents()
  With *g
    \name = name
    \abstract = @make_gadget_1()
  EndWith
  ProcedureReturn *parent\myContents() ; on retourne le gadget ajouté
EndProcedure
; ajoute un gadget enfant de type 2
Procedure addChidGadget_2(*parent._content,name.s)
  AddElement(*parent\myContents())
  *parent\myContents() = AllocateStructure(_gad_2)
  *g._gad_2 = *parent\myContents()
  With *g
    \name = name
    \abstract = @make_gadget_2()
  EndWith
  ProcedureReturn *parent\myContents() ; on retourne le gadget ajouté
EndProcedure
; ajoute un gadget enfant de type 2
Procedure addChidGadget_3(*parent._content,name.s)
  AddElement(*parent\myContents())
  *parent\myContents() = AllocateStructure(_gad_3)
  *g._gad_3 = *parent\myContents()
  With *g
    \name = name
    \abstract = @make_gadget_3()
  EndWith
  ProcedureReturn *parent\myContents() ; on retourne le gadget ajouté
EndProcedure

; on ajoute au hasard des items
; j'ajoute un premier élement
Define *g = newGadget_1("ITEM 1")
; un enfant à l'item 1
addChidGadget_2(*g,"item 1 B")
; un enfant à l'item 1
Define *g = addChidGadget_3(*g,"item 1 C")
; un sous enfant à l'item 1 C
addChidGadget_2(*g,"item 1 C A")
; un sous enfant à l'item 1 C 
Define *g = addChidGadget_1(*g,"item C B")
; un sous sous enfant à l'item 1 C B
addChidGadget_2(*g,"item 1 C B A")
; un second item 
newGadget_2("ITEM 2")

; maintenant on teste un seule boucle est nécessaire
; les procédures abstraites font le reste du travail
ForEach *myGadget()
  *myGadget()\abstract(*myGadget())
Next


Re: Structure récursive & Hiérarchie

Publié : jeu. 18/juil./2019 23:36
par Ollivier
G-Rom a écrit :puis après des références sur le jardinage en timelapse , des phrases énigmatiques , de la politique de comptoir , etc...
1) << référence sur le jardinage en timelapse >> : c'est de la récursivité.
2) << politique de comptoir >> : je n'ai pas la TV depuis 12 ans. Coïncidence que je constate par la presse écrite. Bien loin des actualités, sans récursivité, pas d'analyse de risque. C'est tout...

Re: Structure récursive & Hiérarchie

Publié : ven. 19/juil./2019 5:21
par Shadow
microdevweb,

Merci mais ce code est trop complexe à comprendre pour moi.