Page 1 sur 1

Essai sur la POO

Publié : sam. 08/août/2009 15:56
par kwandjeen
J'attaque un nouveau projet et entendant beaucoup parlé de la poo j'ai décidé de m'y mettre. Je ne sais pas si le code est vraiment dans l'esprit et j'attends vos commentaires et amélioration.
Je mets ça ici car j'ai passé une semaine à me faire c.... pour arriver à ce que je voulais donc si cela peut en aider pourquoi pas.

Je dois déclarer les procedure associé pour chaque objet (add_methode) si quelqu'un à une idée pour ne déclarer les procedures qu'une fois et que cela s'applique directement au nouveau objet je suis preneur.

Code : Tout sélectionner

;{
Macro class(classname)
  Interface classname#_IN
EndMacro
Macro methode(classname)
  EndInterface
  Structure classname#_MT
EndMacro

Macro membre(classname)
  EndStructure
  Structure classname#_MB
  *MT.classname#_MT  
EndMacro

Macro endclass(classname)
  EndStructure
  Structure classname
    MT.classname#_MT
    mb.classname#_MB
    action.classname#_IN
  EndStructure
EndMacro
;----- CLASS HERITAGE
Macro class_h(classname,classmere)
  Interface classname#_IN Extends classmere#_IN
EndMacro
Macro methode_h(classname,classmere)
  EndInterface
  Structure classname#_MT Extends classmere#_MT
EndMacro

Macro membre_h(classname,classmere)
  EndStructure
  Structure classname#_MB Extends classmere#_MB  
EndMacro
;----- CREATION D'UN OBJET OU LISTE
Macro new_listclass(classname,liste)
  Global NewList liste.classname#()
EndMacro

Macro new_objetclass(classname,objet)
  *objet.classname = AllocateMemory(SizeOf(classname))  
EndMacro
;----- AJOUT ITEM A UNE LISTE
Macro add_item_listclass(liste)
  AddElement(liste#())
  liste#()\mb\MT = liste#()\MT
  liste#()\action = @liste()\mb
EndMacro
;----- AJOUT UNE METHODE A UNE LISTE
Macro add_methode_listclass(liste,methode,proc)
  liste#()\MT\methode = @proc#()
EndMacro
;----- AJOUTE UN OBJET
Macro add_item_objetclass(variable)
  *variable\mb\MT = *variable\MT
  *variable\action = @*variable\mb
EndMacro
;----- AJOUTE UNE METHODE A UN OBJET
Macro add_methode_objetclass(variable,methode,proc)
  *variable\MT\methode = @proc()
EndMacro
;----- FONCTION POUR LA CREATION DE PROCEDURE
Macro mb(membre)
  *this\membre
EndMacro

Macro Pointerclass(classname)
  *this.classname#_MB
EndMacro
;----- FIN MACRO
;}

;exemple d'utilisation
;DEFINITION DES CLASSES
class(inventaire)
  slot(slot.b,nomobjet.s)
methode(inventaire)
  *slot
membre(inventaire)
  sac.s[16]
endclass(inventaire)

class_h(perso,inventaire)
  position(x,y)
methode_h(perso,inventaire)
  *position
membre_h(perso,inventaire)
  x.l
  y.l
  vie.l
endclass(perso)

;DEFINITION DES PROCEDURES DE CLASSES
Procedure.s slot(Pointerclass(inventaire),slot,nomobjet.s)
  ;*this\sac[slot] = nomobjet
  mb(sac[slot]) = nomobjet 
  ProcedureReturn nomobjet
EndProcedure

Procedure position(Pointerclass(perso),x.l,y.l)
  mb(x) = x ;UTILISATION AVEC LA MACRO
  *this\y = y ;== mb(y) = y UTILISATION DIRECTE SANS LA MACRO
EndProcedure



new_listclass(perso,perso) ;ON CREER UNE LISTE CONTENANT NOS PERSONNAGES

;ON AJOUTE UN PERSONNAGE ET LES METHODES ASSOCIEES
add_item_listclass(perso) 
add_methode_listclass(perso,slot,slot)
add_methode_listclass(perso,position,position)

;JUSTE POUR EXEMPLE UNE PROCEDURE STANDARD
Procedure position_(x,y) ;une strucutre standard identique à celle de dessus
  perso()\mb\x = x
  perso()\mb\y = y
EndProcedure

;maintenant on peut appeler les procedures directement ainsi que les champs(membre)
perso()\action\position(50,12) ;on utilise la structure classe
Debug Str(perso()\mb\x)+" : "+Str(perso()\mb\y)
position_(78,98) ; on utilise la structure standard
Debug Str(perso()\mb\x)+" : "+Str(perso()\mb\y)
perso()\action\slot(1,"plume")
retour = perso()\action\slot(2,"encre")
;retour$ = PeekS(perso()\action\slot(2,"encre")) ; les retour de string sont des adresses
Debug PeekS(retour)

;CREATION D'UN DEUXIEME PERSONNAGE
add_item_listclass(perso)
add_methode_listclass(perso,slot,slot)
add_methode_listclass(perso,position,position)

perso()\action\position(23,45) ;ON DEFINI SA POSITION
perso()\action\slot(1,"parchemin") ;ON RENTRE UN OBJET DANS LE SLOT 1

;on récapitule
Debug "RECAPITULATIF DES PERSOS"
num = 1
ForEach perso()
  Debug "perso "+Str(num)+" en position X "+ Str(perso()\mb\x) + " Y "+Str(perso()\mb\y)
  Debug "inventaire :"
  For i=1 To 2
    If perso()\mb\sac[i]<>""
      Debug "    - "+perso()\mb\sac[i]
    EndIf
  Next i
  num+1
Next

Publié : sam. 08/août/2009 16:25
par KrisJNT
Le code est intéressant. C'est marrant que tu poste ça : je viens juste de poster ça : http://www.purebasic.fr/french/viewtopi ... viewresult

Publié : dim. 09/août/2009 8:13
par kwandjeen
Un autre exemple + amélioration des macros. Certaine ligne en commentaire sont identiques à celle au dessus ou dessous j'ai essayé de mettre la ligne avec la macro et normale pour comprendre ce que cela fait.
Je ne suis pas super pédagogue mais j'espère que cela se comprend.
J'attends vos amélioration et conseil.

Code : Tout sélectionner

;{
Macro class(classname)
  Interface classname#_IN
EndMacro
Macro methode(classname)
  EndInterface
  Structure classname#_MT
EndMacro

Macro membre(classname)
  EndStructure
  Structure classname#_MB
  *MT.classname#_MT  
EndMacro

Macro endclass(classname)
  EndStructure
  Structure classname
    MT.classname#_MT
    mb.classname#_MB
    action.classname#_IN
  EndStructure
EndMacro
;----- CLASS HERITAGE
Macro class_h(classname,classmere)
  Interface classname#_IN Extends classmere#_IN
EndMacro
Macro methode_h(classname,classmere)
  EndInterface
  Structure classname#_MT Extends classmere#_MT
EndMacro

Macro membre_h(classname,classmere)
  EndStructure
  Structure classname#_MB Extends classmere#_MB  
EndMacro
;----- CREATION D'UN OBJET OU LISTE
Macro new_listclass(classname,liste)
  Global NewList liste.classname#()
EndMacro

Macro new_objetclass(classname,objet)
  *objet.classname = AllocateMemory(SizeOf(classname))
  *objet\mb\MT = *objet\MT
  *objet\action = @*objet\mb 
EndMacro
;----- AJOUT ITEM A UNE LISTE
Macro add_item_listclass(liste)
  AddElement(liste#())
  liste#()\mb\MT = liste#()\MT
  liste#()\action = @liste()\mb
EndMacro
;----- AJOUT UNE METHODE A UNE LISTE
Macro add_methode_listclass(liste,methode,proc)
  liste#()\MT\methode = @proc#()
EndMacro
;----- AJOUTE UNE METHODE A UN OBJET
Macro add_methode_objetclass(objet,methode,proc)
  *objet\MT\methode = @proc#()
EndMacro
;----- FONCTION POUR LA CREATION DE PROCEDURE
Macro mb(membre)
  *this\membre
EndMacro

Macro Pointerclass(classname)
  *this.classname
EndMacro

Macro insert_methode(methode,proc)
  *this\MT\methode = @proc#()
EndMacro

Macro PointerMB(classname_MB)
  *this.classname_MB#_MB
EndMacro
;----- FIN MACRO
;}

class(com)
  position(x,y)
methode(com)
  *position
membre(com)
  vie.l
  x.l
  y.l
endclass(com)

class_h(perso,com)
  proc_bidon()
methode_h(perso,com)
  *proc1
membre_h(perso,com)
  arme.s
endclass(perso)

Procedure position(PointerMB(com),x,y)
  mb(x) = x
  mb(y) = y
EndProcedure

Procedure proc_bidon(PointerMB(perso))
  Debug "cette procédure ne sert à rien"
  ProcedureReturn mb(vie)
EndProcedure

Procedure methode_alien(Pointerclass(com)) ;exemple avec les macros
  ;*alien\MT\position = @position()
  insert_methode(position,position)
EndProcedure

Procedure methode_personnage(*this.perso) ;sans les macros
  *this\MT\position = @position()
  *this\MT\proc1 = @proc_bidon()
EndProcedure

new_objetclass(com,alien)
;add_methode_objetclass(alien,position,position)
methode_alien(*alien)

*alien\mb\vie = 100
*alien\action\position(25,30)

new_objetclass(perso,perso1)
;add_methode_objetclass(perso1,position,position)
;add_methode_objetclass(perso1,proc1,proc_bidon)
methode_personnage(*perso1)

*perso1\action\position(13,24)
*perso1\mb\vie = 85
*perso1\mb\arme = "hache"
Debug "proc_bidon vie perso1: "+Str(*perso1\action\proc_bidon())

Debug "ALIEN :"
Debug "position : "+Str(*alien\mb\x)+" : "+Str(*alien\mb\y)
Debug "vie : "+ Str(*alien\mb\vie)
Debug "PERSO 1 :"
Debug "position : "+Str(*perso1\mb\x)+" : "+Str(*perso1\mb\y)
Debug "vie : "+ Str(*perso1\mb\vie)
Debug "Arme : "+ *perso1\mb\arme

If *alien\mb\vie > *perso1\mb\vie
  MessageRequester("Attention","L'alien à plus de vie que vous !"+Chr(13)+"utiliser votre "+*perso1\mb\arme)
EndIf

Publié : dim. 09/août/2009 8:22
par kwandjeen
Krys disons que c'est pour avoir une approche poo je ne désire pas recréer un language.

Pour le moment tout mes projets sont avec des listes, mais pour une question de lisibilité la programmation objet est plutôt sympa.

Re: Essai sur la POO

Publié : lun. 19/oct./2009 18:09
par kwandjeen
Mise à jour des macros pour accepter les maps

Code : Tout sélectionner

;{
Macro class(classname)
  Interface classname#_IN
EndMacro
Macro methode(classname)
  EndInterface
  Structure classname#_MT
EndMacro

Macro membre(classname)
  EndStructure
  Structure classname#_MB
  *MT.classname#_MT  
EndMacro

Macro endclass(classname)
  EndStructure
  Structure classname
    MT.classname#_MT
    mb.classname#_MB
    action.classname#_IN
  EndStructure
EndMacro
;----- CLASS HERITAGE
Macro class_h(classname,classmere)
  Interface classname#_IN Extends classmere#_IN
EndMacro
Macro methode_h(classname,classmere)
  EndInterface
  Structure classname#_MT Extends classmere#_MT
EndMacro

Macro membre_h(classname,classmere)
  EndStructure
  Structure classname#_MB Extends classmere#_MB  
EndMacro
;----- CREATION D'UN OBJET OU LISTE
Macro new_listclass(classname,liste)
  Global NewList liste.classname#()
EndMacro

Macro new_objetclass(classname,objet)
  *objet.classname = AllocateMemory(SizeOf(classname))
  *objet\mb\MT = *objet\MT
  *objet\action = @*objet\mb 
EndMacro
;----- CREATION DE MAP
Macro new_mapclass(classname,mape)
  Global NewMap mape.classname#()
EndMacro
;----- AJOUT ITEM A UNE MAP
Macro add_item_mapclass(mape,key$)
  AddMapElement(mape#(),key$)
  mape#()\mb\MT = mape#()\MT
  mape#()\action = @mape()\mb
EndMacro
;----- AJOUT ITEM A UNE LISTE
Macro add_item_listclass(liste)
  AddElement(liste#())
  liste#()\mb\MT = liste#()\MT
  liste#()\action = @liste()\mb
EndMacro
;----- AJOUT UNE METHODE A UNE LISTE
Macro add_methode_listclass(liste,methode,proc)
  liste#()\MT\methode = @proc#()
EndMacro
;----- AJOUTE UNE METHODE A UN OBJET
Macro add_methode_objetclass(objet,methode,proc)
  *objet\MT\methode = @proc#()
EndMacro
;----- FONCTION POUR LA CREATION DE PROCEDURE
Macro mb(membre)
  *this\membre
EndMacro

Macro Pointerclass(classname)
  *this.classname#_MB
EndMacro
;----- FIN MACRO
;}